物联网平台提供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毫秒的链路延时误差。