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