Appearance
NTP服务
设备管理平台提供NTP服务,为资源受限的嵌入式设备,解决无法实时地获取服务端时间的问题。
原理介绍
设备管理平台的NTP服务,借鉴NTP协议原理,将设备管理平台作为NTP服务器。高精准度的时间校正流程如下:
设备端通过指定Topic向设备管理平台发送消息,会携带发送时间deviceSendTime。
设备管理平台接收设备端消息后,回复消息中,会增加接收消息的时间serverRecvTime和回复消息的时间serverSendTime。
设备端接收到设备管理平台回复,会根据本地时间,给出接收回复的时间deviceRecvTime。
根据以上出现的4个时间,计算设备端与设备管理平台的时间差,得出设备端获取到的,服务端当前的精确时间Time。
注意: 仅当设备端成功接入设备管理平台后,才能通过NTP服务进行时间校准。若嵌入式设备未接入设备管理平台,设备上电后,无法通过NTP服务进行时间校准。
请求Topic
请求Topic:tlink/${productKey}/${deviceName}/ext/ntp
数据流向:设备发布消息,平台监听消息
请求数据体格式
javascript
{
"reqid": "0020fdf71f0d491da12ba3cd38b205be",
"v": "1",
"t": 1630054074378,
"method": "tlink.${productKey}.${deviceName}.ext.ntp",
"data": {
"deviceSendTime": "1632794700082"
}
}
请求参数说明
参数名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
reqid | String | 否 | 消息ID号。全局唯一,用于系统消息追踪 |
v | String | 否 | 协议版本号,目前协议版本号唯一取值为1 |
t | Long | 否 | 消息发送时间戳 |
method | String | 否 | TCP连接时必传 |
data | Object | 是 | 上报参数。 |
deviceSendTime | String | 是 | 设备当前的时间戳,单位为毫秒。 |
响应Topic
Topic:tlink/${productKey}/${deviceName}/ext/ntp_reply
数据流向:平台发布消息,设备监听消息
响应数据体格式
javascript
{
"reqid": "0020fdf71f0d491da12ba3cd38b205be",
"method": "tlink.${productKey}.${deviceName}.ext.ntp_reply",
"code": 200,
"data": {
"deviceSendTime":"1632794700082",
"serverRecvTime":"1632794940081",
"serverSendTime":"1632794951085",
}
}
响应参数说明
参数名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
reqid | String | 是 | 消息ID号。和请求的对应 |
method | String | 否 | TCP连接时必传 |
code | Integer | 是 | 结果状态码。成功为200,其他为失败 |
data | Object | 是 | 推送数据体。 |
deviceSendTime | String | 是 | 设备发送的时间。 |
serverRecvTime | String | 是 | 接收消息的时间。 |
serverSendTime | String | 是 | 回复消息的时间。 |
设备端接入说明
NTP服务使用流程,及其Topic说明如下:
1、设备端订阅Topic:tlink/${productKey}/${deviceName}/ext/ntp_reply
2、设备端发送请求Topic : tlink/${productKey}/${deviceName}/ext/ntp
发送一条消息,携带此设备的时间戳,单位为毫秒
3、设备端通过tlink/${productKey}/${deviceName}/ext/ntp_reply
收到设备管理平台回复的消息
4、设备端计算出服务端当前精确的Unix时间。
设备端收到服务端的时间记为${deviceRecvTime},则设备上的精确时间为:(${serverRecvTime}+${serverSendTime}+${deviceRecvTime}-${deviceSendTime})/2
。
使用示例
例如,设备上时间是1632794700000,服务端时间是1632794700100,此时设备和服务端时间相差100ms, 链路延时是10ms,服务端从接收到发送间隔为5毫秒。
操作 | 设备端时间(ms) | 服务端时间(ms) |
---|---|---|
设备端发送 | 1632794700000(deviceSendTime) | 1632794700100 |
服务端接收 | 1632794700010 | 1632794700110(serverRecvTime) |
服务端发送 | 1632794700015 | 1632794700115(serverSendTime) |
设备端接收 | 1632794700025(deviceRecvTime) | 1632794700125 |
则设备端计算出的当前准确时间为(1632794700110+1632794700115+1632794700025-1632794700000)ms÷2=1632794700125ms
。
如果直接采用设备管理平台返回的时间戳,只能得到时间1632794700115ms,与服务端上的时间会有10毫秒的链路延时误差。