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:
parent
842d4b220f
commit
d2e7a7d0c7
4 changed files with 26 additions and 1 deletions
|
@ -837,7 +837,8 @@ enum lwm2m_rd_client_event {
|
||||||
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
|
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
|
||||||
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
|
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
|
||||||
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
|
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
|
||||||
LWM2M_RD_CLIENT_EVENT_DISCONNECT
|
LWM2M_RD_CLIENT_EVENT_DISCONNECT,
|
||||||
|
LWM2M_RD_CLIENT_EVENT_QUEUE_MODE_RX_OFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1048,6 +1048,11 @@ int lwm2m_send_message(struct lwm2m_message *msg)
|
||||||
lwm2m_reset_message(msg, true);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ enum sm_engine_state {
|
||||||
ENGINE_DO_REGISTRATION,
|
ENGINE_DO_REGISTRATION,
|
||||||
ENGINE_REGISTRATION_SENT,
|
ENGINE_REGISTRATION_SENT,
|
||||||
ENGINE_REGISTRATION_DONE,
|
ENGINE_REGISTRATION_DONE,
|
||||||
|
ENGINE_REGISTRATION_DONE_RX_OFF,
|
||||||
ENGINE_UPDATE_SENT,
|
ENGINE_UPDATE_SENT,
|
||||||
ENGINE_DEREGISTER,
|
ENGINE_DEREGISTER,
|
||||||
ENGINE_DEREGISTER_SENT,
|
ENGINE_DEREGISTER_SENT,
|
||||||
|
@ -102,6 +103,7 @@ struct lwm2m_rd_client_info {
|
||||||
u8_t trigger_update;
|
u8_t trigger_update;
|
||||||
|
|
||||||
s64_t last_update;
|
s64_t last_update;
|
||||||
|
s64_t last_tx;
|
||||||
|
|
||||||
char ep_name[CLIENT_EP_LEN];
|
char ep_name[CLIENT_EP_LEN];
|
||||||
char server_ep[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 char query_buffer[64]; /* allocate some data for queries and updates */
|
||||||
static u8_t client_data[256]; /* allocate some data for the RD */
|
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)
|
static void set_sm_state(u8_t sm_state)
|
||||||
{
|
{
|
||||||
enum lwm2m_rd_client_event event = LWM2M_RD_CLIENT_EVENT_NONE;
|
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;
|
event = LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE;
|
||||||
} else if (sm_state == ENGINE_REGISTRATION_DONE) {
|
} else if (sm_state == ENGINE_REGISTRATION_DONE) {
|
||||||
event = LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE;
|
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 ||
|
} else if ((sm_state == ENGINE_INIT ||
|
||||||
sm_state == ENGINE_DEREGISTERED) &&
|
sm_state == ENGINE_DEREGISTERED) &&
|
||||||
(client.engine_state >= ENGINE_DO_REGISTRATION &&
|
(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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -842,6 +858,7 @@ static void lwm2m_rd_client_service(struct k_work *work)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ENGINE_REGISTRATION_DONE:
|
case ENGINE_REGISTRATION_DONE:
|
||||||
|
case ENGINE_REGISTRATION_DONE_RX_OFF:
|
||||||
sm_registration_done();
|
sm_registration_done();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -43,4 +43,6 @@ void engine_trigger_update(void);
|
||||||
void engine_bootstrap_finish(void);
|
void engine_bootstrap_finish(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void engine_update_tx_time(void);
|
||||||
|
|
||||||
#endif /* LWM2M_RD_CLIENT_H */
|
#endif /* LWM2M_RD_CLIENT_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue