alios things ntp獲取時間

alios things 中還有另一種獲取時間的方法,使用ntp服務獲取時間,物聯網平臺借鑑NTP協議原理,將雲端作爲NTP服務器。設備端發送一個特定Topic給雲端,payload中帶上發送時間。雲端回覆時在payload中加上雲端的接收時間和發送時間。設備端收到回覆後,再結合自己本地當前時間,得出一共4個時間。一起計算出設備端與雲端的時間差,從而得出端上當前的精確時間。

注意:只有設備端與雲端成功建立連接之後,才能通過NTP服務進行校準

步驟:

  1. 設備端訂閱/ext/ntp/${YourProductKey}/${YourDeviceName}/responseTopic。
    //回調函數,當發送請求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);

     

  2. 設備端向/ext/ntp/${YourProductKey}/${YourDeviceName}/requestTopic發送一條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));

     

  3. 設備端收到服務端回覆的消息,payload中包含以下信息:
    {
        "deviceSendTime":"100",//發送時設備端時間戳
        "serverRecvTime":"1010",//服務端接收時時間戳
        "serverSendTime":"1015",//服務端發送時時間戳
    }

     

  4. 設備端計算出當前精確的unix時間。

    設備端收到服務端的時間記爲${deviceRecvTime},則設備上的精確時間爲:(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2

  5.  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章