55 #define LOG_MODULE "coap" 56 #define LOG_LEVEL LOG_LEVEL_COAP 58 static void coap_request_callback(
void *callback_data, coap_message_t *response);
63 progress_request(coap_callback_request_state_t *callback_state) {
64 coap_request_state_t *state = &callback_state->state;
65 coap_message_t *request = state->request;
66 request->mid = coap_get_mid();
67 if((state->transaction =
68 coap_new_transaction(request->mid, state->remote_endpoint))) {
69 state->transaction->callback = coap_request_callback;
70 state->transaction->callback_data = state;
72 if(state->block_num > 0) {
73 coap_set_header_block2(request, state->block_num, 0,
76 state->transaction->message_len =
77 coap_serialize_message(request, state->transaction->message);
79 coap_send_transaction(state->transaction);
80 LOG_DBG(
"Requested #%"PRIu32
" (MID %u)\n", state->block_num, request->mid);
89 coap_request_callback(
void *callback_data, coap_message_t *response)
91 coap_callback_request_state_t *callback_state = (coap_callback_request_state_t*)callback_data;
92 coap_request_state_t *state = &callback_state->state;
96 state->response = response;
98 LOG_DBG(
"request callback\n");
100 if(!state->response) {
101 LOG_WARN(
"Server not responding giving up...\n");
102 state->status = COAP_REQUEST_STATUS_TIMEOUT;
103 callback_state->callback(callback_state);
108 coap_get_header_block2(state->response, &state->res_block, &state->more, NULL, NULL);
109 coap_get_header_block1(state->response, &res_block1, NULL, NULL, NULL);
111 LOG_DBG(
"Received #%lu%s B1:%lu (%u bytes)\n",
112 (
unsigned long)state->res_block, (
unsigned)state->more ?
"+" :
"",
113 (
unsigned long)res_block1,
114 state->response->payload_len);
116 if(state->res_block == state->block_num) {
119 state->status = COAP_REQUEST_STATUS_MORE;
121 state->status = COAP_REQUEST_STATUS_RESPONSE;
123 callback_state->callback(callback_state);
125 ++(state->block_num);
127 LOG_WARN(
"WRONG BLOCK %"PRIu32
"/%"PRIu32
"\n", state->res_block, state->block_num);
128 ++(state->block_error);
132 if((state->block_error) < COAP_MAX_ATTEMPTS) {
133 progress_request(callback_state);
136 state->status = COAP_REQUEST_STATUS_BLOCK_ERROR;
137 callback_state->callback(callback_state);
141 state->status = COAP_REQUEST_STATUS_FINISHED;
142 state->response = NULL;
143 callback_state->callback(callback_state);
151 coap_message_t *request,
152 void (*callback)(coap_callback_request_state_t *callback_state))
154 coap_request_state_t *state = &callback_state->state;
157 state->res_block = 0;
158 state->block_error = 0;
159 state->block_num = 0;
160 state->response = NULL;
161 state->request = request;
162 state->remote_endpoint = endpoint;
163 callback_state->callback = callback;
165 return progress_request(callback_state);
int coap_send_request(coap_callback_request_state_t *callback_state, coap_endpoint_t *endpoint, coap_message_t *request, void(*callback)(coap_callback_request_state_t *callback_state))
Send a CoAP request to a remote endpoint.
CoAP engine implementation.
Callback API for doing CoAP requests Adapted from the blocking API
CoAP module for reliable transport
Default definitions of C compiler quirk work-arounds.