56 #include "lwm2m-security.h" 66 #if LWM2M_QUEUE_MODE_ENABLED 73 #define LOG_MODULE "lwm2m-rd" 74 #define LOG_LEVEL LOG_LEVEL_LWM2M 76 #ifndef LWM2M_DEFAULT_CLIENT_LIFETIME 77 #define LWM2M_DEFAULT_CLIENT_LIFETIME 30 80 #define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) 81 #define BS_REMOTE_PORT UIP_HTONS(5685) 83 #define STATE_MACHINE_UPDATE_INTERVAL 500 90 #define WAIT_NETWORK 1 91 #define DO_BOOTSTRAP 3 92 #define BOOTSTRAP_SENT 4 93 #define BOOTSTRAP_DONE 5 94 #define DO_REGISTRATION 6 95 #define REGISTRATION_SENT 7 96 #define REGISTRATION_DONE 8 99 #define DEREGISTER_SENT 11 100 #define DEREGISTER_FAILED 12 101 #define DEREGISTERED 13 102 #if LWM2M_QUEUE_MODE_ENABLED 103 #define QUEUE_MODE_AWAKE 14 104 #define QUEUE_MODE_SEND_UPDATE 15 107 #define FLAG_RD_DATA_DIRTY 0x01 108 #define FLAG_RD_DATA_UPDATE_TRIGGERED 0x02 109 #define FLAG_RD_DATA_UPDATE_ON_DIRTY 0x10 111 LIST(session_info_list);
114 static char query_data[64];
115 static uint8_t rd_data[128];
117 static coap_timer_t rd_timer;
118 static char default_ep[20];
120 #if LWM2M_QUEUE_MODE_ENABLED 121 static coap_timer_t queue_mode_client_awake_timer;
124 static uint8_t queue_mode_client_awake;
127 static uint16_t queue_mode_client_awake_time;
129 static void queue_mode_awake_timer_callback(coap_timer_t *
timer);
132 static void check_periodic_observations();
133 static void update_callback(coap_callback_request_state_t *callback_state);
136 set_rd_data(lwm2m_session_info_t *session_info)
138 lwm2m_buffer_t outbuf;
141 outbuf.buffer = rd_data;
142 outbuf.size =
sizeof(rd_data);
146 session_info->rd_more = lwm2m_engine_set_rd_data(&outbuf, 0);
147 coap_set_payload(session_info->request, rd_data, outbuf.len);
149 if(session_info->rd_more) {
151 LOG_DBG(
"Setting block1 in request\n");
152 coap_set_header_block1(session_info->request, 0, 1,
sizeof(rd_data));
158 prepare_update(lwm2m_session_info_t *session_info,
int triggered)
160 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
161 coap_set_header_uri_path(session_info->request, session_info->assigned_ep);
163 snprintf(query_data,
sizeof(query_data) - 1,
"?lt=%d&b=%s", session_info->lifetime, session_info->binding);
164 LOG_DBG(
"UPDATE:%s %s\n", session_info->assigned_ep, query_data);
165 coap_set_header_uri_query(session_info->request, query_data);
167 if((triggered || session_info->rd_flags & FLAG_RD_DATA_UPDATE_ON_DIRTY) && (session_info->rd_flags & FLAG_RD_DATA_DIRTY)) {
168 session_info->rd_flags &= ~FLAG_RD_DATA_DIRTY;
169 set_rd_data(session_info);
170 session_info->rd_callback = update_callback;
175 has_network_access(
void)
177 #if UIP_CONF_IPV6_RPL 179 #ifndef CONTIKI_TARGET_NATIVE 189 lwm2m_rd_client_is_registered(lwm2m_session_info_t *session_info)
191 return session_info->rd_state == REGISTRATION_DONE || session_info->rd_state == UPDATE_SENT;
196 lwm2m_rd_client_set_session_callback(lwm2m_session_info_t *session_info, session_callback_t cb)
198 session_info->callback = cb;
202 perform_session_callback(lwm2m_session_info_t *session_info,
int state)
204 if(session_info->callback != NULL) {
205 LOG_DBG(
"Performing session callback: %d cb:%p\n",
206 state, session_info->callback);
207 session_info->callback(session_info, state);
212 lwm2m_rd_client_get_lifetime(lwm2m_session_info_t *session_info)
214 return session_info->lifetime;
218 lwm2m_rd_client_set_lifetime(lwm2m_session_info_t *session_info, uint16_t lifetime)
221 session_info->lifetime = lifetime;
223 session_info->lifetime = LWM2M_DEFAULT_CLIENT_LIFETIME;
228 lwm2m_rd_client_set_endpoint_name(lwm2m_session_info_t *session_info,
const char *endpoint)
230 if(endpoint != NULL) {
231 session_info->ep = endpoint;
236 lwm2m_rd_client_set_default_endpoint_name(
const char *endpoint)
238 strncpy(default_ep, endpoint,
sizeof(default_ep) - 1);
239 default_ep[
sizeof(default_ep) - 1] =
'\0';
243 lwm2m_rd_client_set_update_rd(
void)
245 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
246 while(session_info != NULL) {
247 session_info->rd_flags |= FLAG_RD_DATA_DIRTY;
248 session_info = session_info->next;
253 lwm2m_rd_client_set_automatic_update(lwm2m_session_info_t *session_info,
int update)
255 session_info->rd_flags = (session_info->rd_flags & ~FLAG_RD_DATA_UPDATE_ON_DIRTY) |
256 (update != 0 ? FLAG_RD_DATA_UPDATE_ON_DIRTY : 0);
260 lwm2m_rd_client_register_with_server(lwm2m_session_info_t *session_info,
261 const coap_endpoint_t *server,
262 lwm2m_rd_client_server_type_t server_type)
264 if(session_info->ep == NULL) {
265 session_info->ep = default_ep;
268 #if LWM2M_QUEUE_MODE_CONF_ENABLED 269 session_info->binding =
"UQ";
273 session_info->lifetime = (LWM2M_QUEUE_MODE_DEFAULT_CLIENT_SLEEP_TIME / 1000) * 2;
275 session_info->binding =
"U";
276 if(session_info->lifetime == 0) {
277 session_info->lifetime = LWM2M_DEFAULT_CLIENT_LIFETIME;
281 session_info->rd_flags = FLAG_RD_DATA_UPDATE_ON_DIRTY;
282 session_info->has_bs_server_info = 0;
283 session_info->has_registration_server_info = 0;
284 session_info->wait_until_network_check = 0;
285 session_info->last_update = 0;
286 session_info->last_rd_progress = 0;
287 session_info->bootstrapped = 0;
288 session_info->rd_state = INIT;
290 if(server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
292 session_info->has_bs_server_info = 1;
293 session_info->use_server_type = LWM2M_RD_CLIENT_BOOTSTRAP_SERVER;
296 session_info->use_server_type = LWM2M_RD_CLIENT_LWM2M_SERVER;
297 session_info->has_registration_server_info = 1;
300 list_add(session_info_list, session_info);
304 lwm2m_rd_client_deregister(lwm2m_session_info_t *session_info)
306 if(lwm2m_rd_client_is_registered(session_info)) {
307 session_info->rd_state = DEREGISTER;
314 static lwm2m_session_info_t *
315 get_session_info_from_server_ep(
const coap_endpoint_t *server_ep)
317 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
318 while(session_info != NULL) {
322 session_info = session_info->next;
328 lwm2m_rd_client_update_triggered(
const coap_endpoint_t *server_ep)
330 lwm2m_session_info_t *session_info = get_session_info_from_server_ep(server_ep);
332 session_info->rd_flags |= FLAG_RD_DATA_UPDATE_TRIGGERED;
348 bootstrap_callback(coap_callback_request_state_t *callback_state)
350 coap_request_state_t *state = &callback_state->state;
351 LOG_DBG(
"Bootstrap callback Response: %d, ", state->response != NULL);
353 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
355 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
356 if(CHANGED_2_04 == state->response->code) {
357 LOG_DBG_(
"Considered done!\n");
358 session_info->rd_state = BOOTSTRAP_DONE;
362 LOG_DBG_(
"Failed with code %d. Retrying\n", state->response->code);
364 session_info->rd_state = INIT;
365 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
366 LOG_DBG_(
"Server not responding! Retry?");
367 session_info->rd_state = DO_BOOTSTRAP;
368 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
369 LOG_DBG_(
"Request finished. Ignore\n");
371 LOG_DBG_(
"Unexpected error! Retry?");
372 session_info->rd_state = DO_BOOTSTRAP;
377 produce_more_rd(lwm2m_session_info_t *session_info)
379 lwm2m_buffer_t outbuf;
381 LOG_DBG(
"GOT Continue!\n");
384 outbuf.buffer = rd_data;
385 outbuf.size =
sizeof(rd_data);
388 session_info->rd_block1++;
391 session_info->rd_more = lwm2m_engine_set_rd_data(&outbuf, session_info->rd_block1);
392 coap_set_payload(session_info->request, rd_data, outbuf.len);
394 LOG_DBG(
"Setting block1 in request - block: %d more: %d\n",
395 (
int)session_info->rd_block1, (
int)session_info->rd_more);
396 coap_set_header_block1(session_info->request, session_info->rd_block1, session_info->rd_more,
sizeof(rd_data));
398 coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request, session_info->rd_callback);
402 block1_rd_callback(coap_timer_t *
timer)
404 produce_more_rd((lwm2m_session_info_t *)timer->user_data);
411 registration_callback(coap_callback_request_state_t *callback_state)
413 coap_request_state_t *state = &callback_state->state;
414 LOG_DBG(
"Registration callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
415 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
417 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
421 if(CONTINUE_2_31 == state->response->code) {
423 coap_get_header_block1(state->response, &session_info->rd_block1, NULL, NULL, NULL);
427 LOG_DBG_(
"Continue\n");
428 }
else if(CREATED_2_01 == state->response->code) {
429 if(state->response->location_path_len < LWM2M_RD_CLIENT_ASSIGNED_ENDPOINT_MAX_LEN) {
430 memcpy(session_info->assigned_ep, state->response->location_path,
431 state->response->location_path_len);
432 session_info->assigned_ep[state->response->location_path_len] = 0;
434 #if LWM2M_QUEUE_MODE_ENABLED 435 #if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION 436 if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
437 lwm2m_queue_mode_set_first_request();
440 lwm2m_rd_client_fsm_execute_queue_mode_awake(session_info);
442 session_info->rd_state = REGISTRATION_DONE;
446 LOG_DBG_(
"Done (assigned EP='%s')!\n", session_info->assigned_ep);
447 perform_session_callback(session_info, LWM2M_RD_CLIENT_REGISTERED);
451 LOG_DBG_(
"failed to handle assigned EP: '");
452 LOG_DBG_COAP_STRING(state->response->location_path,
453 state->response->location_path_len);
454 LOG_DBG_(
"'. Re-init network.\n");
457 LOG_DBG_(
"failed with code %d. Re-init network\n", state->response->code);
460 session_info->rd_state = INIT;
461 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
462 LOG_DBG_(
"Server not responding, trying to reconnect\n");
463 session_info->rd_state = INIT;
464 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
465 LOG_DBG_(
"Request finished. Ignore\n");
467 LOG_DBG_(
"Unexpected error, trying to reconnect\n");
468 session_info->rd_state = INIT;
476 update_callback(coap_callback_request_state_t *callback_state)
478 coap_request_state_t *state = &callback_state->state;
479 LOG_DBG(
"Update callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
481 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
483 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
485 if(CONTINUE_2_31 == state->response->code) {
487 LOG_DBG_(
"Continue\n");
488 coap_get_header_block1(state->response, &session_info->rd_block1, NULL, NULL, NULL);
491 }
else if(CHANGED_2_04 == state->response->code) {
495 #if LWM2M_QUEUE_MODE_ENABLED 497 if(lwm2m_queue_mode_is_waked_up_by_notification()) {
499 lwm2m_queue_mode_clear_waked_up_by_notification();
500 lwm2m_notification_queue_send_notifications();
502 #if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION 503 if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
504 lwm2m_queue_mode_set_first_request();
507 lwm2m_rd_client_fsm_execute_queue_mode_awake(session_info);
510 session_info->rd_state = REGISTRATION_DONE;
511 session_info->rd_flags &= ~FLAG_RD_DATA_UPDATE_TRIGGERED;
515 LOG_DBG_(
"Failed with code %d. Retrying registration\n",
516 state->response->code);
517 session_info->rd_state = DO_REGISTRATION;
519 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
520 LOG_DBG_(
"Server not responding, trying to reconnect\n");
521 session_info->rd_state = INIT;
522 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
523 LOG_DBG_(
"Request finished. Ignore\n");
525 LOG_DBG_(
"Unexpected error, trying to reconnect\n");
526 session_info->rd_state = INIT;
531 deregister_callback(coap_callback_request_state_t *callback_state)
533 coap_request_state_t *state = &callback_state->state;
534 LOG_DBG(
"Deregister callback. Status: %d. Response Code: %d\n",
536 state->response != NULL ? state->response->code : 0);
538 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
540 if(state->status == COAP_REQUEST_STATUS_RESPONSE && (DELETED_2_02 == state->response->code)) {
541 LOG_DBG(
"Deregistration success\n");
542 session_info->rd_state = DEREGISTERED;
543 perform_session_callback(session_info, LWM2M_RD_CLIENT_DEREGISTERED);
545 LOG_DBG(
"Deregistration failed\n");
546 if(session_info->rd_state == DEREGISTER_SENT) {
547 session_info->rd_state = DEREGISTER_FAILED;
548 perform_session_callback(session_info, LWM2M_RD_CLIENT_DEREGISTER_FAILED);
553 #if LWM2M_QUEUE_MODE_ENABLED 555 all_sessions_in_queue_mode_state(
void)
557 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
558 while(session_info != NULL) {
559 if(((session_info->rd_state & 0xF) != 0xE)) {
562 session_info = session_info->next;
568 all_sessions_in_queue_mode_awake(
void)
570 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
571 while(session_info != NULL) {
572 if(session_info->rd_state != QUEUE_MODE_AWAKE) {
575 session_info = session_info->next;
583 periodic_process(coap_timer_t *timer)
588 #if LWM2M_QUEUE_MODE_ENABLED 590 if(!all_sessions_in_queue_mode_state()) {
599 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
600 while(session_info != NULL) {
602 LOG_DBG(
"RD Client with assigned ep: %s - state: %d, ms: %lu\n", session_info->assigned_ep, session_info->rd_state,
605 switch(session_info->rd_state) {
607 LOG_DBG(
"RD Client started with endpoint '%s' and client lifetime %d\n", session_info->ep, session_info->lifetime);
608 session_info->rd_state = WAIT_NETWORK;
611 if(now > session_info->wait_until_network_check) {
613 LOG_DBG(
"Checking for network... %lu\n",
614 (
unsigned long)session_info->wait_until_network_check);
615 session_info->wait_until_network_check = now + 10000;
616 if(has_network_access()) {
618 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
619 session_info->rd_state = DO_BOOTSTRAP;
621 session_info->rd_state = DO_REGISTRATION;
628 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER &&
629 session_info->bootstrapped == 0 &&
630 session_info->has_bs_server_info) {
633 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
634 coap_set_header_uri_path(session_info->request,
"/bs");
636 snprintf(query_data,
sizeof(query_data) - 1,
"?ep=%s", session_info->ep);
637 coap_set_header_uri_query(session_info->request, query_data);
638 LOG_INFO(
"Registering ID with bootstrap server [");
639 LOG_INFO_COAP_EP(&session_info->bs_server_ep);
640 LOG_INFO_(
"] as '%s'\n", query_data);
642 session_info->rd_request_state.state.user_data = (
void *)session_info;
643 if(
coap_send_request(&session_info->rd_request_state, &session_info->bs_server_ep,
644 session_info->request, bootstrap_callback)) {
645 session_info->rd_state = BOOTSTRAP_SENT;
654 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
655 lwm2m_security_server_t *security;
656 LOG_DBG(
"*** Bootstrap - checking for server info...\n");
658 for(security = lwm2m_security_get_first();
660 security = lwm2m_security_get_next(security)) {
661 if(security->bootstrap == 0) {
666 if(security != NULL) {
668 if(security->server_uri_len > 0) {
671 LOG_DBG(
"**** Found security instance using: ");
672 LOG_DBG_COAP_STRING((
const char *)security->server_uri,
673 security->server_uri_len);
674 LOG_DBG_(
" (len %d) \n", security->server_uri_len);
677 secure = strncmp((
const char *)security->server_uri,
681 security->server_uri_len,
682 &session_info->server_ep)) {
683 LOG_DBG(
"Failed to parse server URI!\n");
685 LOG_DBG(
"Server address:");
686 LOG_DBG_COAP_EP(&session_info->server_ep);
689 LOG_DBG(
"Secure CoAP requested but not supported - can not bootstrap\n");
691 lwm2m_rd_client_register_with_server(session_info, &session_info->server_ep, LWM2M_RD_CLIENT_LWM2M_SERVER);
692 session_info->bootstrapped++;
696 LOG_DBG(
"** failed to parse URI ");
697 LOG_DBG_COAP_STRING((
const char *)security->server_uri,
698 security->server_uri_len);
704 if(session_info->bootstrapped == 0) {
706 session_info->rd_state = DO_BOOTSTRAP;
708 session_info->rd_state = DO_REGISTRATION;
712 case DO_REGISTRATION:
716 LOG_DBG(
"Wait until connected... \n");
720 if(session_info->use_server_type == LWM2M_RD_CLIENT_LWM2M_SERVER &&
721 !lwm2m_rd_client_is_registered(session_info) &&
722 session_info->has_registration_server_info) {
726 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
727 coap_set_header_uri_path(session_info->request,
"/rd");
729 snprintf(query_data,
sizeof(query_data) - 1,
"?lwm2m=%s&ep=%s<=%d&b=%s",
730 LWM2M_PROTOCOL_VERSION, session_info->ep, session_info->lifetime, session_info->binding);
731 coap_set_header_uri_query(session_info->request, query_data);
733 len = set_rd_data(session_info);
734 session_info->rd_callback = registration_callback;
736 LOG_INFO(
"Registering with [");
737 LOG_INFO_COAP_EP(&session_info->server_ep);
738 LOG_INFO_(
"] lwm2m endpoint '%s': '", query_data);
740 LOG_INFO_COAP_STRING((
const char *)rd_data, len);
742 LOG_INFO_(
"' More:%d\n", session_info->rd_more);
745 session_info->rd_request_state.state.user_data = (
void *)session_info;
747 session_info->request, registration_callback)) {
749 session_info->rd_state = REGISTRATION_SENT;
754 case REGISTRATION_SENT:
757 case REGISTRATION_DONE:
760 check_periodic_observations();
763 if((session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED) ||
764 ((uint32_t)session_info->lifetime * 500) <= now - session_info->last_update) {
766 prepare_update(session_info, session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
769 session_info->rd_request_state.state.user_data = (
void *)session_info;
770 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
772 session_info->rd_state = UPDATE_SENT;
778 #if LWM2M_QUEUE_MODE_ENABLED 779 case QUEUE_MODE_AWAKE:
780 LOG_DBG(
"Queue Mode: Client is AWAKE at %lu\n", (
unsigned long)
coap_timer_uptime());
781 if((queue_mode_client_awake = all_sessions_in_queue_mode_awake())) {
782 queue_mode_client_awake_time = lwm2m_queue_mode_get_awake_time();
783 coap_timer_set(&queue_mode_client_awake_timer, queue_mode_client_awake_time);
786 case QUEUE_MODE_SEND_UPDATE:
790 #ifdef LWM2M_QUEUE_MODE_WAKE_UP 791 LWM2M_QUEUE_MODE_WAKE_UP();
793 prepare_update(session_info, session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
795 session_info->rd_request_state.state.user_data = (
void *)session_info;
796 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
798 session_info->rd_state = UPDATE_SENT;
808 LOG_INFO(
"DEREGISTER %s\n", session_info->assigned_ep);
809 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_DELETE, 0);
810 coap_set_header_uri_path(session_info->request, session_info->assigned_ep);
813 session_info->rd_request_state.state.user_data = (
void *)session_info;
814 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
815 deregister_callback)) {
816 session_info->rd_state = DEREGISTER_SENT;
819 case DEREGISTER_SENT:
821 case DEREGISTER_FAILED:
827 LOG_WARN(
"Unhandled state: %d\n", session_info->rd_state);
829 session_info = session_info->next;
834 lwm2m_rd_client_init(
const char *ep)
836 lwm2m_rd_client_set_default_endpoint_name(ep);
841 #if LWM2M_QUEUE_MODE_ENABLED 847 check_periodic_observations(
void)
855 #if LWM2M_QUEUE_MODE_ENABLED 858 lwm2m_rd_client_restart_client_awake_timer(
void)
860 coap_timer_set(&queue_mode_client_awake_timer, queue_mode_client_awake_time);
864 lwm2m_rd_client_is_client_awake(
void)
866 return queue_mode_client_awake;
870 queue_mode_awake_timer_callback(coap_timer_t *timer)
873 LOG_DBG(
"Queue Mode: Client is SLEEPING at %lu\n", (
unsigned long)
coap_timer_uptime());
874 queue_mode_client_awake = 0;
876 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
877 while(session_info != NULL) {
878 session_info->rd_state = QUEUE_MODE_SEND_UPDATE;
879 session_info = session_info->next;
883 #ifdef LWM2M_QUEUE_MODE_SLEEP_MS 884 LWM2M_QUEUE_MODE_SLEEP_MS(lwm2m_queue_mode_get_sleep_time());
889 lwm2m_rd_client_fsm_execute_queue_mode_awake(lwm2m_session_info_t *session_info)
892 session_info->rd_state = QUEUE_MODE_AWAKE;
893 periodic_process(&rd_timer);
897 lwm2m_rd_client_fsm_execute_queue_mode_update(lwm2m_session_info_t *session_info)
900 session_info->rd_state = QUEUE_MODE_SEND_UPDATE;
901 periodic_process(&rd_timer);
Header file for the LWM2M object API
API to address CoAP endpoints
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.
int coap_endpoint_connect(coap_endpoint_t *ep)
Request a connection to a CoAP endpoint.
Header file for the Contiki OMA LWM2M plain text reader / writer
int coap_endpoint_parse(const char *text, size_t size, coap_endpoint_t *ep)
Parse a CoAP endpoint.
static void coap_timer_set_callback(coap_timer_t *timer, void(*callback)(coap_timer_t *))
Set a callback function to be called when a CoAP timer expires.
Header file for functions to manage the queue to store notifications when waiting for the respons...
void coap_timer_reset(coap_timer_t *timer, uint64_t time)
Reset a CoAP timer to expire a specified time after the last expiration time.
Header file for the Contiki OMA LWM2M device
Header file for the Contiki OMA LWM2M JSON writer
Linked list manipulation routines.
void * list_head(list_t list)
Get a pointer to the first element of a list.
rpl_dag_t * rpl_get_any_dag(void)
Returns pointer to any DAG (for compatibility with legagy RPL code)
Header file for the Contiki OMA LWM2M Registration and Bootstrap Client.
static uint64_t coap_timer_uptime(void)
Get the time since boot in milliseconds.
void list_add(list_t list, void *item)
Add an item at the end of a list.
Header file for the Contiki OMA LWM2M Queue Mode implementation to manage the parameters ...
Callback API for doing CoAP requests Adapted from the blocking API
#define LIST(name)
Declare a linked list.
static void coap_timer_set_user_data(coap_timer_t *timer, void *data)
Attach user data to a CoAP timer.
void coap_endpoint_copy(coap_endpoint_t *dest, const coap_endpoint_t *src)
Copy a CoAP endpoint from one memory area to another.
Header file for the Contiki OMA LWM2M engine
void coap_timer_stop(coap_timer_t *timer)
Stop a pending CoAP timer.
An implementation of the Constrained Application Protocol (RFC 7252).
void coap_timer_set(coap_timer_t *timer, uint64_t time)
Set a CoAP timer to expire after the specified time.
int coap_endpoint_is_connected(const coap_endpoint_t *ep)
Check if a CoAP endpoint is connected.
int coap_endpoint_cmp(const coap_endpoint_t *e1, const coap_endpoint_t *e2)
Compare two CoAP endpoints.