阿里云物联网平台远程配置功能JAVA 示例参考

概述

很多场景下,开发者需要更新设备的配置信息,包括设备的系统参数、网络参数、本地策略等。通常情况下,是通过固件升级的方式更新设备的配置信息。但是,这将加大固件版本的维护工作,并且需要设备中断运行以完成更新。为了解决上述问题,物联网平台提供了远程配置更新的功能,设备无需重启或中断运行即可在线完成配置信息的更新。本文主要演示如何使用JAVA SDK实现两种应用场景。

原理说明

1、物联网平台提供的远程配置功能,支持:

  • 开启/关闭远程配置。
  • 在线编辑配置文件,并管理版本。
  • 批量更新设备配置信息。
  • 设备主动请求更新配置信息。

2、流程图

3、远程配置大致分为三部分:

  • 生成配置文件:您在物联网平台控制台编辑并保存配置信息。
  • 推送配置文件:您在物联网平台控制台批量推送配置信息给设备。设备接收后,修改本地配置文件。
  • 设备主动请求配置信息:设备主动向云端请求新的配置文件,并进行更新。

远程配置使用分为两种场景,一种是云端推送配置信息给设备端,一种是设备端主动请求配置信息。根据场景的不同,远程配置的步骤也有所区别。

场景一:云端推送配置信息给设备端

1、设备端业务代码实现

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.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
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.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tools.AError;public class DeviceCOTADemo1 {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() {@Overridepublic void onError(AError aError) {System.out.println("初始化失败 " + aError.getMsg());}@Overridepublic void onInitDone(InitResult initResult) {System.out.println("初始化成功 " + initResult.tsl);String pd = deviceInfo.productKey + "/" + deviceInfo.deviceName;// 1、cota 请求 TopicString requestcotaTopic = "/sys/"+pd+"/thing/config/push";// 订阅TopicMqttSubscribeRequest upgradeTopicRequest = new MqttSubscribeRequest();upgradeTopicRequest.topic = requestcotaTopic;upgradeTopicRequest.isSubscribe = true;// 直接做Topic的订阅LinkKit.getInstance().subscribe(upgradeTopicRequest, new IConnectSubscribeListener(){@Overridepublic void onSuccess() {System.out.println("cota订阅成功");}@Overridepublic void onFailure(AError aError) {System.out.println("直接订阅失败" + aError.getMsg());}});// 注册ota下行监听LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {@Overridepublic void onNotify(String s, String s1, AMessage aMessage) {System.out.println("cota 监听响应:");System.out.println(new String((byte[])aMessage.getData()));}@Overridepublic boolean shouldHandle(String s, String s1) {return false;}@Overridepublic void onConnectStateChange(String s, ConnectState connectState) {System.out.println("连接状态发生变化 :" + s + connectState);}});}});}
}

2、管理门户配置远程控制,详细步骤参考链接。

3、启动设备端程序,管理门户批量更新,设备端获取信息(批量更新频率限制:一小时内仅允许操作一次):

 

{"method":"thing.config.push","id":"1296799269","params":{"getType":"file","configId":"92eb82a17a7441111f7dcb830e93ed79","sign":"568e9211117eedc9eadbc2907719fe2086348f572ddd3f373d6f297ba5aba4d1","configSize":12,"signMethod":"Sha256","url":"https://otx-devicecenter-thing-config-cn-shanghai-online.oss-cn-shanghai.aliyuncs.com/11zisMUtYDk/1567338668042_gz2Qs7hl?Expires=1567340568&OSSAccessKeyId=1111113rx5dg2JBm&Signature=S0LS9H%1111zJqTg%2Fphf19%2BfE%2F2bs%3D"},"version":"1.0"}

场景二:设备主动请求配置信息

1、设备端业务代码实现

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 DeviceCOTADemo2 {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() {@Overridepublic void onError(AError aError) {System.out.println("初始化失败 " + aError.getMsg());}@Overridepublic void onInitDone(InitResult initResult) {System.out.println("初始化成功 " + initResult.tsl);String pd = deviceInfo.productKey + "/" + deviceInfo.deviceName;// 1、设备端订阅Topic:/sys/${productKey}/${deviceName}/thing/config/get_replyString requestcotaTopic = "/sys/"+pd+"/thing/config/get_reply";MqttSubscribeRequest upgradeTopicRequest = new MqttSubscribeRequest();upgradeTopicRequest.topic = requestcotaTopic;upgradeTopicRequest.isSubscribe = true;LinkKit.getInstance().subscribe(upgradeTopicRequest, new IConnectSubscribeListener(){@Overridepublic void onSuccess() {System.out.println("ota订阅成功");}@Overridepublic void onFailure(AError aError) {System.out.println("直接订阅失败" + aError.getMsg());}});// 注册下行监听LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {@Overridepublic void onNotify(String s, String s1, AMessage aMessage) {System.out.println("cota 监听响应:");System.out.println(new String((byte[])aMessage.getData()));}@Overridepublic boolean shouldHandle(String s, String s1) {return false;}@Overridepublic void onConnectStateChange(String s, ConnectState connectState) {System.out.println("连接状态发生变化 :" + s + connectState);}});// 4、设备通过Topic /sys/${productKey}/${deviceName}/thing/config/get主动查询最新的配置信息String requestTopic = "/sys/"+pd+"/thing/config/get";System.out.println("发送消息" + requestTopic);// 订阅TopicMqttPublishRequest request = new MqttPublishRequest();request.topic = requestTopic;request.payloadObj = "{\"id\":\"123\",\"method\":\"thing.config.get\",\"params\":{\"getType\":\"file\",\"configScope\":\"product\"},\"version\":\"1.0\"}";// 直接做Topic的发送LinkKit.getInstance().publish(request, new IConnectSendListener() {@Overridepublic void onResponse(ARequest aRequest, AResponse aResponse) {System.out.println("请求发送成功 " + aResponse.getData());}@Overridepublic void onFailure(ARequest aRequest, AError aError) {System.out.println("请求发送成功 " + aError.getMsg());}});}});}
}

2、运行结果(/sys/${productKey}/${deviceName}/thing/config/get_reply 订阅获取的内容)

{"code":200,"data":{"configId":"a9415f2d6e444d7f9e60a3d46f11d566","configSize":18,"getType":"file","sign":"112f38e7345a2ac46d9f80a401886727f27de96ebf1c82b6825df4b31116ab02","signMethod":"Sha256","url":"https://otx-devicecenter-thing-config-cn-shanghai-online.oss-cn-shanghai.aliyuncs.com/11D8NwXCe56/1567337893929_gpUFnE69?Expires=1567339979&OSSAccessKeyId=11AIRY3rx5dg2JBm&Signature=1112qy8bOsa48elOQFt4qHQGaqk%3D"},"id":"123","method":"thing.config.get","version":"1.0"}


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 6.0 新特性:多线程连环 13 问!

来源 | 码大叔责编 | Carol封图 | CSDN付费下载自视觉中国支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不…

支付宝这些程序员要逆天,滑板、画漫画、写科幻小说、航拍,玩得太溜

他一边用代码改变世界,一边用科幻小说去创造未来。 他一边用编程书写传奇,一边用画笔记录生活。 他一边用程序驱动科技,一边用滑板挥洒汗水。 他一边用产品推动技术,一边用航拍记录大地。 他们是四位来自蚂蚁金服的普通程序员&…

技术人最不该忽视可视化数据分析!

阿里妹导读:在这个“人人都是数据分析师”的时代,阿里的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环,其质量至关重要。优秀的可视化能促成卓越洞见,糟糕的内容则让所有的努力失去意义…

ETL异构数据源Datax_部署前置环境_01

文章目录一、概述1. 是什么&#xff1f;2. 开源地址二、简介2.1. 设计架构2.2. 框架结构三、检查环境3.1. 检验是否安装JDK(1.8以上&#xff0c;推荐1.8)3.2. 检验是否安装python环境&#xff0c;要求2.6<版本3.3. maven环境四、JDK环境安装4.1. rpm方式安装4.2. gz方式安装…

AI 玩王者荣耀狂上分!打了六局,心态崩了

你造吗&#xff1f;人工智能继进军围棋之后&#xff0c;又来我“王者峡谷”了。腾讯AI LAB与王者荣耀合作开发的AI【绝悟】&#xff0c;在最高规格赛事中获胜&#xff0c;宣布已达到“电竞职业水平”&#xff01;据称&#xff1a;【绝悟】一天的训练强度&#xff0c;高达人类44…

MFC 工具栏

目录 工具栏概述 工具栏的使用 添加工具栏资源 创建&#xff0c;加载工具栏 设置工具栏停靠 工具栏概述 CToolBarCtrl-父类CWnd&#xff0c;封装了关于工具栏控件的各种操作。 CToolBar一父类CControlBar&#xff0c;封装了关于工具栏的操作&#xff0c;以及和框架窗口的…

在SLS中快速实现异常巡检

一、相关算法研究 1.1 常见的开源算法 Yahoo&#xff1a;EGADSFaceBook&#xff1a;ProphetBaidu&#xff1a;OpprenticeTwitter&#xff1a;Anomaly DetectionRedhat&#xff1a;hawkularAliTsinghua&#xff1a;DonutTencent&#xff1a;MetisNumenta&#xff1a;HTMCMU&…

可能是你见过最完善的微前端解决方案

Techniques, strategies and recipes for building a modern web app with multiple teams using different JavaScript frameworks.—— Micro Frontends 前言 TL;DR 想跳过技术细节直接看怎么实践的同学可以拖到文章底部&#xff0c;直接看最后一节。 目前社区有很多关于微…

金山云纳斯达克敲钟上市 不负时代的机遇

5月8日&#xff0c;中国知名的独立云服务商金山云正式在美国纳斯达克挂牌交易&#xff0c;股票代码 “KC”。 金山云依托广泛的云基础架构&#xff0c;通过提供先进可信赖的云服务&#xff0c;为各行业定制了结构完善的解决方案&#xff0c;在中国云计算市场取得了领先地位&am…

前沿 | VLDB论文解读:阿里云超大规模实时分析型数据库AnalyticDB

前言 一年一度的数据库领域顶级会议VLDB 2019于美国当地时间8月26日-8月30日在洛杉矶召开。在本届大会上&#xff0c;阿里云数据库产品团队多篇论文入选Research Track和Industrial Track。 本文将对入围Industrial Track的论文《AnalyticDB: Realtime OLAP Database System at…

第一个Java

Hello World 随便创一个文件夹&#xff0c;储存代码 新建一个Java文件 文件后缀名.javaHello.java[注意]系统可能没有显示后缀名&#xff0c;需要手动打开 编写代码 public class Hello{public static void main(String[] args){System.out.print("Hello Wold");…

Teradata天睿公司任命Steve McMillan为总裁兼首席执行官

Teradata天睿公司日前宣布&#xff0c;公司董事会已经任命Steve McMillan担任总裁兼首席执行官以及董事会成员&#xff0c;自2020年6月8日起生效。McMillan先生曾在F5 Networks公司担任全球服务执行副总裁&#xff0c;未来将接任临时总裁兼首席执行官Victor Lund&#xff0c;在…

蚂蚁金服在云原生架构下的可观察性的探索和实践

本文根据 8 月 11 日 SOFA Meetup#3 广州站 《蚂蚁金服在云原生架构下的可观察性的探索和实践》主题分享整理。现场回顾视频以及 PPT 查看地址见文末链接。 前言 随着应用架构往云原生的方向发展&#xff0c;传统监控技术已经不能满足云原生时代运维的需求&#xff0c;因此&am…

Docker启动Mysql容器失败,挂载时权限不足,chown: changing ownership of ‘/var/lib/mysql/‘: Permission denied

文章目录1. 现象2. 查看日志分析3. 提示信息4. 解决方案5. 再次执行成功6. 技巧1. 现象 今天用Docker运行Mysql容器时&#xff0c;一直启动不了&#xff0c;删除了重新制作容器也不行 镜像用的Mysql5.7 运行镜像用的命令行 为: docker run -d --name fxmysql -v /opt/data:/…

如何实现一次编码,到处运行?新一代云端一体化探索

阿里妹导读&#xff1a;当前移动互联网业务研发运维模式&#xff0c;云与多端互相割裂&#xff0c;有些全栈的探索缺乏成功案例&#xff0c;行业对云端一体化研发这块仍是空白&#xff0c;我们要思考&#xff1a;如何能实现 1 个研发支撑云 android iOS 三端的业务快速落地&a…

这份操作系统词典请查收!

作者 | cxuan责编 | 郭芮头图 | CSDN 下载自东方 IC1. 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优…

使用javax.mail发送邮件

文章目录一、发邮件流程二、关于邮件协议和端口三、开启邮件协议和端口3.1. QQ邮箱3.2. 163邮箱四、实战发送邮件4.1. 引入依赖4.2. 方法重写4.3. 发送邮件核心类工具类EmailUtils五、QQ邮件发送测试5.1. QQ发送测试5.2. 查看QQ发送邮箱5.3. 查看收件人收件箱六、163邮件发送测…

导入Oracle 数据库镜像,创建Oracle虚拟机_01

文章目录1. 创建虚拟机&#xff0c;选择镜像2. 调整内存大小3. 调整处理器大小1. 创建虚拟机&#xff0c;选择镜像 2. 调整内存大小 3. 调整处理器大小 接下一篇&#xff1a;plsql连接 oracle instantclient_11_2 本地机器不安装oracle_02 https://gblfy.blog.csdn.net/article…

阿里技术专家详解 DDD 系列- Domain Primitive

导读&#xff1a;对于一个架构师来说&#xff0c;在软件开发中如何降低系统复杂度是一个永恒的挑战&#xff0c;无论是 94 年 GoF 的 Design Patterns &#xff0c; 99 年的 Martin Fowler 的 Refactoring &#xff0c; 02 年的 P of EAA &#xff0c;还是 03 年的 Enterprise …

别傻了,90%的开发者都没有做好它

上周末和在北京的哥们国仔涮火锅&#xff0c;席间聊起了最近面试的经历。他说想换工作的原因很简单&#xff0c;就是要涨工资&#xff0c;原来的公司呆了两年多&#xff0c;薪资浮动不超过 500 元。而身边跳槽的那些同事&#xff0c;薪资都已经是自己的 2 倍了。在准备面试的过…