NTP服务

物联网平台提供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服务的流程和示例,请参见NTP服务

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

  1. 设备端向Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/request发送一条QoS=0的消息,携带设备当前的时间戳,单位为毫秒。示例如下:

    {
        "deviceSendTime":"1571724098000"
    }
    说明
    • 时间戳数字,支持Long(默认)和String类型。

    • NTP服务目前仅支持QoS=0的消息。

  2. 设备端通过Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response,收到物联网平台回复的消息,包含以下信息。

    说明

    设备端可直接通过Topic:/ext/ntp/${YourProductKey}/${YourDeviceName}/response接收物联网平台的消息,无需订阅。在物联网平台控制台的设备详情页面的已订阅Topic列表中也不会显示该Topic。

    {
        "deviceSendTime":"1571724098000",
        "serverRecvTime":"1571724098110",
        "serverSendTime":"1571724098115"
    }
  3. 设备端计算出服务端当前精确的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毫秒的链路延时误差。