alios things 中還有另一種獲取時間的方法,使用ntp服務獲取時間,物聯網平臺借鑑NTP協議原理,將雲端作爲NTP服務器。設備端發送一個特定Topic給雲端,payload中帶上發送時間。雲端回覆時在payload中加上雲端的接收時間和發送時間。設備端收到回覆後,再結合自己本地當前時間,得出一共4個時間。一起計算出設備端與雲端的時間差,從而得出端上當前的精確時間。
注意:只有設備端與雲端成功建立連接之後,才能通過NTP服務進行校準
步驟:
- 設備端訂閱
/ext/ntp/${YourProductKey}/${YourDeviceName}/response
Topic。//回調函數,當發送請求topic後,用此函數接收時間 static void request_topic_handle_func(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg) { iotx_mqtt_topic_info_t *topic_info = (iotx_mqtt_topic_info_pt) msg->msg; switch (msg->event_type) { case IOTX_MQTT_EVENT_PUBLISH_RECEIVED: /* print topic name and topic message */ EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload); break; default: break; } } #define RESPONSE_TOPIC "/ext/ntp/a11YWzN48cV/fourswitch/response" IOT_MQTT_Subscribe(NULL,RESPONSE_TOPIC,IOTX_MQTT_QOS0,request_topic_handle_func,NULL);
- 設備端向
/ext/ntp/${YourProductKey}/${YourDeviceName}/request
Topic發送一條QoS=0的消息,payload中帶上設備當前的時間戳,單位爲毫秒。示例如下:#define REQUEST_TOPIC "/ext/ntp/a11YWzN48cV/fourswitch/request" char *payload = "{\"deviceSendTime\":\"100\"}"; IOT_MQTT_Publish_Simple(0,REQUEST_TOPIC,IOTX_MQTT_QOS0,payload,strlen(payload));
- 設備端收到服務端回覆的消息,payload中包含以下信息:
{ "deviceSendTime":"100",//發送時設備端時間戳 "serverRecvTime":"1010",//服務端接收時時間戳 "serverSendTime":"1015",//服務端發送時時間戳 }
- 設備端計算出當前精確的unix時間。
設備端收到服務端的時間記爲${deviceRecvTime},則設備上的精確時間爲:
(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2
-