net: lwm2m: Notify when it's safe to turn RX off

According to LWM2M specification, when Queue Mode is used, the LWM2M
client should keep the reciever on for specified time after sending A
CoAP message. This commit adds a new LWM2M event,
`LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF`, to facilitate the process by
notifying the application when it's safe to turn the receiver off.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2020-02-24 16:44:52 +01:00 committed by Jukka Rissanen
commit d2e7a7d0c7
4 changed files with 26 additions and 1 deletions

View file

@ -837,7 +837,8 @@ enum lwm2m_rd_client_event {
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
LWM2M_RD_CLIENT_EVENT_DISCONNECT
LWM2M_RD_CLIENT_EVENT_DISCONNECT,
LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF,
};
/**

View file

@ -1048,6 +1048,11 @@ int lwm2m_send_message(struct lwm2m_message *msg)
lwm2m_reset_message(msg, true);
}
if (IS_ENABLED(CONFIG_LWM2M_RD_CLIENT_SUPPORT) &&
IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED)) {
engine_update_tx_time();
}
return 0;
}

View file

@ -87,6 +87,7 @@ enum sm_engine_state {
ENGINE_DO_REGISTRATION,
ENGINE_REGISTRATION_SENT,
ENGINE_REGISTRATION_DONE,
ENGINE_REGISTRATION_DONE_RX_OFF,
ENGINE_UPDATE_SENT,
ENGINE_DEREGISTER,
ENGINE_DEREGISTER_SENT,
@ -102,6 +103,7 @@ struct lwm2m_rd_client_info {
u8_t trigger_update;
s64_t last_update;
s64_t last_tx;
char ep_name[CLIENT_EP_LEN];
char server_ep[CLIENT_EP_LEN];
@ -113,6 +115,11 @@ struct lwm2m_rd_client_info {
static char query_buffer[64]; /* allocate some data for queries and updates */
static u8_t client_data[256]; /* allocate some data for the RD */
void engine_update_tx_time(void)
{
client.last_tx = k_uptime_get();
}
static void set_sm_state(u8_t sm_state)
{
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
@ -130,6 +137,8 @@ static void set_sm_state(u8_t sm_state)
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE;
} else if (sm_state == ENGINE_REGISTRATION_DONE) {
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE;
} else if (sm_state == ENGINE_REGISTRATION_DONE_RX_OFF) {
event = LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF;
} else if ((sm_state == ENGINE_INIT ||
sm_state == ENGINE_DEREGISTERED) &&
(client.engine_state >= ENGINE_DO_REGISTRATION &&
@ -754,6 +763,13 @@ static int sm_registration_done(void)
}
}
if (IS_ENABLED(CONFIG_LWM2M_QUEUE_MODE_ENABLED) &&
(client.engine_state != ENGINE_REGISTRATION_DONE_RX_OFF) &&
(((k_uptime_get() - client.last_tx) / 1000) >=
CONFIG_LWM2M_QUEUE_MODE_UPTIME)) {
set_sm_state(ENGINE_REGISTRATION_DONE_RX_OFF);
}
return ret;
}
@ -842,6 +858,7 @@ static void lwm2m_rd_client_service(struct k_work *work)
break;
case ENGINE_REGISTRATION_DONE:
case ENGINE_REGISTRATION_DONE_RX_OFF:
sm_registration_done();
break;

View file

@ -43,4 +43,6 @@ void engine_trigger_update(void);
void engine_bootstrap_finish(void);
#endif
void engine_update_tx_time(void);
#endif /* LWM2M_RD_CLIENT_H */