NTP服務(wù)
物聯(lián)網(wǎng)平臺提供NTP服務(wù),為資源受限的嵌入式設(shè)備,解決無法實時地獲取服務(wù)端時間的問題。
原理介紹
物聯(lián)網(wǎng)平臺的NTP服務(wù),借鑒NTP協(xié)議原理,將物聯(lián)網(wǎng)平臺作為NTP服務(wù)器。高精準(zhǔn)度的時間校正流程如下:
設(shè)備端通過指定Topic向物聯(lián)網(wǎng)平臺發(fā)送消息,會攜帶發(fā)送時間deviceSendTime。
物聯(lián)網(wǎng)平臺接收設(shè)備端消息后,回復(fù)消息中,會增加接收消息的時間serverRecvTime和回復(fù)消息的時間serverSendTime。
設(shè)備端接收到物聯(lián)網(wǎng)平臺回復(fù),會根據(jù)本地時間,給出接收回復(fù)的時間deviceRecvTime。
根據(jù)以上出現(xiàn)的4個時間,計算設(shè)備端與物聯(lián)網(wǎng)平臺的時間差,得出設(shè)備端獲取到的,服務(wù)端當(dāng)前的精確時間Time。
僅當(dāng)設(shè)備端成功接入物聯(lián)網(wǎng)平臺后,才能通過NTP服務(wù)進行時間校準(zhǔn)。
若嵌入式設(shè)備未接入物聯(lián)網(wǎng)平臺,設(shè)備上電后,無法通過NTP服務(wù)進行時間校準(zhǔn),則TSL建連過程中,證書時間校驗會失敗。
通信的Topic
請求Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/request
響應(yīng)Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response
其中,${YourProductKey}和${YourDeviceName}是設(shè)備證書中的ProductKey和DeviceName,您可在物聯(lián)網(wǎng)平臺控制臺的設(shè)備詳情頁面獲取。
設(shè)備端接入說明
目前僅C語言的設(shè)備端Link SDK支持配置NTP服務(wù)功能。請訪問C Link SDK,下載開發(fā)代碼Demo。
設(shè)備端配置NTP服務(wù)的流程和示例,請參見NTP服務(wù)。
NTP服務(wù)使用流程,及其Topic說明如下:
設(shè)備端向Topic:
/ext/ntp/${YourProductKey}/${YourDeviceName}/request
發(fā)送一條QoS=0的消息,攜帶設(shè)備當(dāng)前的時間戳,單位為毫秒。示例如下:{ "deviceSendTime":"1571724098000" }
說明時間戳數(shù)字,支持Long(默認(rèn))和String類型。
NTP服務(wù)目前僅支持QoS=0的消息。
設(shè)備端通過Topic:
/ext/ntp/${YourProductKey}/${YourDeviceName}/response
,收到物聯(lián)網(wǎng)平臺回復(fù)的消息,包含以下信息。說明設(shè)備端可直接通過Topic:
/ext/ntp/${YourProductKey}/${YourDeviceName}/response
接收物聯(lián)網(wǎng)平臺的消息,無需訂閱。在物聯(lián)網(wǎng)平臺控制臺的設(shè)備詳情頁面的已訂閱Topic列表中也不會顯示該Topic。{ "deviceSendTime":"1571724098000", "serverRecvTime":"1571724098110", "serverSendTime":"1571724098115" }
設(shè)備端計算出服務(wù)端當(dāng)前精確的Unix時間。
假設(shè)基于請求的時延和響應(yīng)的時延相同,設(shè)備端收到服務(wù)端的時間即${deviceRecvTime},則設(shè)備上的精確時間為:
(${serverRecvTime}+${serverSendTime}+${deviceRecvTime}-${deviceSendTime})/2
。
使用示例
設(shè)備端和服務(wù)端發(fā)送的時間戳數(shù)據(jù)的類型相同。例如,設(shè)備端傳的時間戳是String類型,服務(wù)端返回的時間戳也是String類型。
例如,設(shè)備上時間是1571724098000毫秒,服務(wù)端時間是1571724098100毫秒,鏈路延時是10毫秒,服務(wù)端從接收到發(fā)送間隔為5毫秒。
操作 | 設(shè)備端時間(毫秒) | 服務(wù)端時間(毫秒) |
設(shè)備端發(fā)送 | 1571724098000(deviceSendTime) | 1571724098100 |
服務(wù)端接收 | 1571724098010 | 1571724098110(serverRecvTime) |
服務(wù)端發(fā)送 | 1571724098015 | 1571724098115(serverSendTime) |
設(shè)備端接收 | 1571724098025(deviceRecvTime) | 1571724098125 |
則設(shè)備端計算出的當(dāng)前準(zhǔn)確時間為(1571724098110+1571724098115+1571724098025-1571724098000)毫秒÷2=1571724098125毫秒
。
如果直接采用物聯(lián)網(wǎng)平臺返回的時間戳,只能得到時間1571724098115毫秒,與服務(wù)端上的時間會有10毫秒的鏈路延時誤差。