物联网平台提供NTP服务,为资源受限的嵌入式设备,解决无法实时地获取服务端时间的问题。

原理介绍

物联网平台的NTP服务,借鉴NTP协议原理,将物联网平台作为NTP服务器。高精准度的时间校正流程如下:

  1. 设备端通过指定Topic向物联网平台发送消息,会携带发送时间deviceSendTime
  2. 物联网平台接收设备端消息后,回复消息中,会增加接收消息的时间serverRecvTime和回复消息的时间serverSendTime
  3. 设备端接收到物联网平台回复,会根据本地时间,给出接收回复的时间deviceRecvTime
  4. 根据以上出现的4个时间,计算设备端与物联网平台的时间差,得出设备端获取到的,服务端当前的精确时间Time
注意 仅当设备端成功接入物联网平台后,才能通过NTP服务进行时间校准。

若嵌入式设备未接入物联网平台,设备上电后,无法通过NTP服务进行时间校准,则TSL建连过程中,证书时间校验会失败。

通信的Topic

请求Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/request

响应Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response

其中,${YourProductKey}${YourDeviceName}是设备证书中的ProductKeyDeviceName,您可在物联网平台控制台设备详情页面获取。

设备端接入说明

目前仅C语言的设备端Link SDK支持配置NTP服务功能。请访问C Link SDK获取,下载开发代码Demo。

NTP服务使用流程,及其Topic说明如下:

  1. 设备端订阅Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response
  2. 设备端向Topic /ext/ntp/${YourProductKey}/${YourDeviceName}/request发送一条QoS=0的消息,携带设备当前的时间戳,单位为毫秒。示例如下:
    {
        "deviceSendTime":"1571724098000"
    }
    说明
    • 时间戳数字,支持Long(默认)和String类型。
    • NTP服务目前仅支持QoS=0的消息。
  3. 设备端通过Topic/ext/ntp/${YourProductKey}/${YourDeviceName}/response,收到物联网平台回复的消息,包含以下信息:
    {
        "deviceSendTime":"1571724098000",
        "serverRecvTime":"1571724098110",
        "serverSendTime":"1571724098115",
    }
  4. 设备端计算出服务端当前精确的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毫秒的链路延时误差。