55#define LOG_MODULE "coap"
56#define LOG_LEVEL LOG_LEVEL_COAP
58static void coap_request_callback(
void *callback_data, coap_message_t *response);
63progress_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);
89coap_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;
94 state->response = response;
96 LOG_DBG(
"request callback\n");
98 if(!state->response) {
99 LOG_WARN(
"Server not responding giving up...\n");
100 state->status = COAP_REQUEST_STATUS_TIMEOUT;
101 callback_state->callback(callback_state);
106 coap_get_header_block2(state->response, &state->res_block, &state->more, NULL, NULL);
107 uint32_t res_block1 = 0;
108 coap_get_header_block1(state->response, &res_block1, NULL, NULL, NULL);
110 LOG_DBG(
"Received #%lu%s B1:%lu (%u bytes)\n",
111 (
unsigned long)state->res_block, (
unsigned)state->more ?
"+" :
"",
112 (unsigned long)res_block1,
113 state->response->payload_len);
115 if(state->res_block == state->block_num) {
118 state->status = COAP_REQUEST_STATUS_MORE;
120 state->status = COAP_REQUEST_STATUS_RESPONSE;
122 callback_state->callback(callback_state);
124 ++(state->block_num);
126 LOG_WARN(
"WRONG BLOCK %"PRIu32
"/%"PRIu32
"\n", state->res_block, state->block_num);
127 ++(state->block_error);
131 if((state->block_error) < COAP_MAX_ATTEMPTS) {
132 progress_request(callback_state);
135 state->status = COAP_REQUEST_STATUS_BLOCK_ERROR;
136 callback_state->callback(callback_state);
140 state->status = COAP_REQUEST_STATUS_FINISHED;
141 state->response = NULL;
142 callback_state->callback(callback_state);
150 coap_message_t *request,
151 void (*callback)(coap_callback_request_state_t *callback_state))
153 coap_request_state_t *state = &callback_state->state;
156 state->res_block = 0;
157 state->block_error = 0;
158 state->block_num = 0;
159 state->response = NULL;
160 state->request = request;
161 state->remote_endpoint = endpoint;
162 callback_state->callback = callback;
164 return progress_request(callback_state);
Default definitions of C compiler quirk work-arounds.
Callback API for doing CoAP requests Adapted from the blocking API.
CoAP engine implementation.
CoAP module for reliable transport.
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.