阿里云物联网平台NTP服务 JAVA 示例参考

简介: 物联网平台提供NTP服务,解决嵌入式设备资源受限,系统不包含NTP服务,端上没有精确时间戳的问题。物联网平台借鉴NTP协议原理,将云端作为NTP服务器。设备端发送一个特定Topic给云端,payload中带上发送时间。

概述

物联网平台提供NTP服务,解决嵌入式设备资源受限,系统不包含NTP服务,端上没有精确时间戳的问题。物联网平台借鉴NTP协议原理,将云端作为NTP服务器。设备端发送一个特定Topic给云端,payload中带上发送时间。云端回复时在payload中加上云端的接收时间和发送时间。设备端收到回复后,再结合自己本地当前时间,得出一共4个时间。一起计算出设备端与云端的时间差,从而得出端上当前的精确时间。本文主要演示如果使用JAVA SDK实现相关功能。

实验步骤

1、相关Topic

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

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

2、pom.xml

 <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>com.aliyun.alink.linksdk</groupId>
            <artifactId>iot-linkkit-java</artifactId>
            <version>1.2.0.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.40</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>iot-java-sdk</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

3、Code Sample

import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.InitResult;
import com.aliyun.alink.dm.api.IoTApiClientConfig;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttPublishRequest;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
import com.aliyun.alink.linksdk.cmp.core.base.ConnectState;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectNotifyListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;

public class DeviceNTPDemo {

    public static void main(String[] args) {

        String regionId = "cn-shanghai";
        DeviceInfo deviceInfo = new DeviceInfo();
        deviceInfo.productKey = "******";
        deviceInfo.deviceName = "******";
        deviceInfo.deviceSecret = "******";

        LinkKitInitParams params = new LinkKitInitParams();
        IoTMqttClientConfig config = new IoTMqttClientConfig();
        config.productKey = deviceInfo.productKey;
        config.deviceName = deviceInfo.deviceName;
        config.deviceSecret = deviceInfo.deviceSecret;
        config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883";
        params.mqttClientConfig = config;
        params.connectConfig = new IoTApiClientConfig();
        params.deviceInfo = deviceInfo;

        /**建立连接**/
        LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
            @Override
            public void onError(AError aError) {
                System.out.println("初始化失败 " + aError.getMsg());
            }

            @Override
            public void onInitDone(InitResult initResult) {

                System.out.println("初始化成功 " + initResult.tsl);
                String pd = deviceInfo.productKey + "/" + deviceInfo.deviceName;

                // 1、ntp 请求 Topic
                String requestNtpTopic = "/ext/ntp/"+pd+"/request";
                // 2、ntp 响应 Topic
                String responseNtpTopic = "/ext/ntp/"+pd+"/response";


                // 订阅Topic
                MqttSubscribeRequest upgradeTopicRequest = new MqttSubscribeRequest();
                upgradeTopicRequest.topic = responseNtpTopic;
                upgradeTopicRequest.isSubscribe = true;
                LinkKit.getInstance().subscribe(upgradeTopicRequest, new IConnectSubscribeListener(){
                    @Override
                    public void onSuccess() {
                        System.out.println("订阅成功");
                    }

                    @Override
                    public void onFailure(AError aError) {
                        System.out.println("订阅失败" + aError.getMsg());
                    }
                });

                // 注册ota下行监听
                LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {
                    @Override
                    public void onNotify(String s, String s1, AMessage aMessage) {

                        System.out.println("ntp监听响应:");
                        System.out.println(new String((byte[])aMessage.getData()));
                    }

                    @Override
                    public boolean shouldHandle(String s, String s1) {
                        return false;
                    }

                    @Override
                    public void onConnectStateChange(String s, ConnectState connectState) {
                        System.out.println("连接状态发生变化 :" + s + connectState);
                    }
                });

                // 上报设备时间
                MqttPublishRequest progressTopicRequest = new MqttPublishRequest();
                progressTopicRequest.topic = requestNtpTopic;
                progressTopicRequest.payloadObj = "{\n" +
                        "    \"deviceSendTime\":\"1567336250000\"\n" +
                        "}";
                progressTopicRequest.qos = 0;
                LinkKit.getInstance().publish(progressTopicRequest, new IConnectSendListener() {
                    @Override
                    public void onResponse(ARequest aRequest, AResponse aResponse) {
                        System.out.println("ntp请求成功 " + aResponse.getData());
                    }

                    @Override
                    public void onFailure(ARequest aRequest, AError aError) {
                        System.out.println("ntp请求失败 " + aError.getMsg());
                    }
                });
            }
        });
    }
}

4、请求结果

{"deviceSendTime":"1567336250000","serverSendTime":"1567336282175","serverRecvTime":"1567336282175"}

5、时间计算方法

设备端收到服务端的时间记为${deviceRecvTime},则设备上的精确时间为:(${serverRecvTime} + ${serverSendTime} + ${deviceRecvTime} - ${deviceSendTime}) / 2

参考链接

NTP服务

阿里云物联网平台Qucik Start

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
7月前
|
监控 安全 Java
Java与物联网:连接与控制设备
Java与物联网:连接与控制设备
546 0
|
7月前
|
网络协议 物联网 Java
Go与Java:在物联网领域的适用性分析
本文对比分析了Go和Java在物联网领域的适用性。Go语言因其轻量级、高效和并发特性,适合资源受限的物联网设备,特别是处理并发连接和数据流。Java则凭借跨平台性、丰富的生态系统和企业级应用能力,适用于大型物联网系统和复杂业务场景。两者在物联网领域各有优势,开发者可根据项目需求选择合适的语言。
|
7月前
|
小程序 Java 数据安全/隐私保护
Java中心校智慧校园智慧班牌物联网平台源码
班牌首页用于展示班级风采信息,所以,班牌其他页面没有操作的情况下,2分钟后会自动回到首页展示。
89 5
|
7月前
|
数据采集 监控 Java
工业物联网的java应用
工业物联网的java应用
|
7月前
|
人工智能 监控 物联网
基于物联网、大数据、云计算、人工智能等技术的智慧工地源码(Java+Spring Cloud +UniApp +MySql)
基于物联网、大数据、云计算、人工智能等技术的智慧工地源码(Java+Spring Cloud +UniApp +MySql)
812 1
|
7月前
|
人工智能 数据可视化 安全
Java带可视化数据大屏的物联网智慧工地系统源码
通过现场AI智能视频监控、临时设施动态管理,实时检测场地空间、资源、设施的运行状况,及时发现场地安全隐患,确保为工人营造一个安全、文明的场地作业环境。
90 0
|
消息中间件 物联网 Java
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台(一)
[笔记]阿里云物联网之业务服务端(java、php)接入阿里云平台
372 1
|
7月前
|
人工智能 监控 安全
【物联网+JAVA 】智慧工地源码
【物联网+JAVA 】智慧工地源码
94 0
|
7月前
|
人工智能 监控 安全
【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管
【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管
152 0
|
7月前
|
人工智能 监控 Java
Java数字化智慧工地管理云平台源码(人工智能、物联网、大数据)
Java数字化智慧工地管理云平台源码(人工智能、物联网、大数据)
134 0

相关产品

  • 物联网平台