物联网平台提供NTP服务,解决嵌入式设备资源受限,系统不包含NTP服务,端上没有精确时间戳的问题。
原理介绍
物联网平台借鉴NTP协议原理,将云端作为NTP服务器。设备端发送一个特定Topic给云端,payload中带上发送时间。云端回复时在payload中加上云端的接收时间和发送时间。设备端收到回复后,再结合自己本地当前时间,得出一共4个时间。一起计算出设备端与云端的时间差,从而得出端上当前的精确时间。
如果嵌入式设备上电后没有准确时间,TLS建连过程中证书时间校验失败的问题,无法通过NTP服务解决,因为此时设备与云端尚未成功建立连接。
接入流程
请求Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/request
响应Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response
- 设备端订阅Topic:
/ext/ntp/${YourProductKey}/${YourDeviceName}/response
。 - 设备端向Topic
/ext/ntp/${YourProductKey}/${YourDeviceName}/request
发送一条QoS=0的消息,payload中带上设备当前的时间戳,单位为毫秒。示例如下:{ "deviceSendTime":"1571724098000" }
说明- 时间戳数字的格式,支持Long和String。默认为Long类型
- NTP服务目前仅支持QoS=0的消息。
- 设备端收到服务端回复的消息,payload中包含以下信息:
{ "deviceSendTime":"1571724098000", "serverRecvTime":"1571724098110", "serverSendTime":"1571724098115", }
- 设备端计算出当前精确的unix时间。
设备端收到服务端的时间记为${deviceRecvTime},则设备上的精确时间为:
(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2
使用示例
例如,设备上时间是1571724098000,服务端时间是1571724098100,链路延时是10毫秒,服务端从接收到发送间隔为5毫秒。
- | 设备端时间 | 服务端时间 |
---|---|---|
设备发送 | 1571724098000(deviceSendTime) | 1571724098100 |
服务端接收 | 1571724098010 | 1571724098110(serverRecvTime) |
服务端发送 | 1571724098015 | 1571724098115(serverSendTime) |
设备端接收 | 1571724098025(deviceRecvTime) | 1571724098125 |
则设备端计算出的当前准确时间为(1571724098110 + 1571724098115 +1571724098025 - 1571724098000)/ 2 = 1571724098125。
如果直接采用云端返回的时间戳,只能得到1571724098115,与服务端上的时间会有10毫秒的链路延时误差。
在文档使用中是否遇到以下问题
更多建议
匿名提交