阿里云物联网平台物模型SDK试用
1. 概述
“设备可以使用物模型功能,实现属性上报(如上报设备状态)、事件上报(上报设备异常或错误)和服务调用(通过云端调用设备提供的服务)。”[1]
用户可在设备上安装Link Kit SDK,通过Link Kit SDK实现属性上报、事件上报,服务定义等功能。同时,用户也可在云端通过IOT云端SDK实现属性设置、服务调用等功能。此外,用户也可以通过自定义MQTT Topic和云端通信。
本文主要采用产品管理高级版,实现属性上报/获得、事件上报以及服务定义/调用。代码源自官方提供的设备端SDK以及云端SDK的DEMO。
2. 架构
工业上使用较常见的场景是在工控机通用操作系统上安装Link Kit SDK与云端进行通讯。
图 1 在通用OS上物模型样例架构
3. 功能
3.1. 创建产品
在物联网平台中创建产品Robot(高级版),并在产品的【功能定义】中添加属性、事件和服务,详情参见官方帮助。
图 2 属性、事件和服务的定义
图 3 自定义事件
图 4 事件参数
图 5 服务定义
3.2. 添加设备
在物联网平台中创建设备robot,详情参见官方帮助。
3.3. 设备端开发
3.3.1. 下载Demo
在阿里云帮助文档“设备接入Link Kit SDK”[2]中下载Java SDK Demo程序。
l 物联网平台产品文档:【阿里云物联网平台】-【设备端开发指南】-【下载设备端SDK】
l http://gaic.alicdn.com/ztms/java-iot-device-sdk-demo-v1130/JavaLinkKitDemo.zip?spm=a2c4g.11186623.2.14.2fdd1058TJhODe&file=JavaLinkKitDemo.zip
l 下载源码后导入IDE
3.3.2. 修改Demo
(1) device_id.json
修改device_id.json文件,填写三元组:
{ "productKey": "a1l3AKuGZ**", "deviceName": "robot", "productSecret":"xLDfQY1XTYru****", "deviceSecret": "kUbuNQvdLRDvlJtiGkuOk95SLGXm****", } |
(2) HelloWorld.java
在HelloWorld.java文件中修改executeScheduler方法,添加test();
public void executeScheduler(DeviceInfoData deviceInfoData) { thingTestManager.readData(System.getProperty("user.dir") + "/test_case.json"); thingTestManager.setServiceHandler(); test(); } |
(3) HelloWorld.java
test()分三部分,分别是:
l 属性上报:设备属性上报云端物模型
private void test() { // (1)设备属性上报云端物模型 // 设备属性上报值 Map<String, ValueWrapper> reportData = new HashMap<String, ValueWrapper>(); reportData.put("myname", new ValueWrapper.StringValueWrapper("shoen")); // identifier 是云端定义的属性的唯一标识,valueWrapper是属性的值 reportData.put("myage", new ValueWrapper.IntValueWrapper(20)); // 设备属性上报和回调 LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() { public void onSuccess(String s, Object o) { // 属性上报成功 } public void onError(String s, AError aError) { // 属性上报失败 } }); |
l 属性获取:从云端物模型获取设备属性
// (2)从云端物模型获取设备属性,根据 identifier 获取当前物模型中该属性的值 String identifier = "myname"; String myname=(String)LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier).getValue(); ALog.d("helloTag:","shoen:"+myname); String identifier1 = "myage"; int myage=(Integer)LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier1).getValue(); ALog.d("helloTag:","age:"+myage); |
l 事件上报:设备事件上报云端
// (3)设备事件上报云端 HashMap<String, ValueWrapper> valueWrapperMap = new HashMap<String, ValueWrapper>();; String identity = "myevent"; valueWrapperMap.put("p1", new ValueWrapper.IntValueWrapper(50)); // 参考示例,更多使用可参考demo OutputParams params = new OutputParams(valueWrapperMap); LinkKit.getInstance().getDeviceThing().thingEventPost(identity, params, new IPublishResourceListener() { public void onSuccess(String resId, Object o) { // 事件上报成功 ALog.d(TAG, "onSuccess() called with: s = [" + resId + "], o = [" + o + "]"); } public void onError(String resId, AError aError) { // 事件上报失败 ALog.w(TAG, "onError() called with: s = [" + resId + "], aError = [" + aError.toString() + "]"); } }); |
l 服务:设备先注册服务的处理监听器
// (4)设备先注册服务的处理监听器 ThingSample ts=new ThingSample(pk, dn); ts.setServiceHandler(); } |
(4) ThingSample.java
l 服务定义:定义可供云端调研的服务
l 在mCommonHandler方法中添加如下代码:
} else if (SERVICE_GET.equals(identify)) { // 初始化的时候将默认值初始化传进来,物模型内部会直接返回云端缓存的值 } else if ("myscore".equals(identify)) { /// 响应云端SDK的myscore服务调用 ALog.d(TAG, "响应云端SDK的myscore服务调用"); OutputParams outputParams = new OutputParams(); outputParams.put("out1", new ValueWrapper.IntValueWrapper(50)); itResResponseCallback.onComplete(identify, null, outputParams); } else { |
3.4. 云端开发
3.4.1. 下载Demo
在github上下载IoT套件服务端API使用demo [3]
l 【阿里云物联网平台】-【云端开发指南】-【云端SDK参考】- 【SDK下载】
l 下载源码后导入IDE
3.4.2. 修改Demo
(1) Test.java
l 修改main方法
l 属性设置:云端SDK直接设置设备属性
public static void main(String[] args) throws ClientException { String accessKey = "LTAIUa25no******"; String accessSecret = "1ktxeXGKyFyiOxiMmb************"; DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com"); IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret); DefaultAcsClient client = new DefaultAcsClient(profile); // (1) 云端SDK直接设置设备属性 SetDevicePropertyRequest request = new SetDevicePropertyRequest(); request.setProductKey("a1l3AKuGZMp"); request.setDeviceName("robot"); JSONObject itemJson = new JSONObject(); itemJson.put("myage", 2); request.setItems(itemJson.toString()); try { SetDevicePropertyResponse response = client.getAcsResponse(request); System.out.println(response.getRequestId() + ", success: " + response.getSuccess()); } catch (ClientException e) { e.printStackTrace(); } |
l 修改main方法
l 服务调用:云端SDK调用设备端服务
//(2)云端SDK调用设备端服务 InvokeThingServiceRequest request1=new InvokeThingServiceRequest(); request1.setProductKey("a1l3AKuGZMp"); request1.setDeviceName("robot"); request1.setIdentifier("myscore"); request1.setArgs("{\"in1\":1}"); //request1.setArgs("{\"LightStatus\":1,\"LightNo\":2}"); try { InvokeThingServiceResponse response = client.getAcsResponse(request1); if (response.getSuccess()) { System.out.println("调用成功"); } else { System.out.println("error:" + response.getErrorMessage()); } } catch (ClientException e) { e.printStackTrace(); } } |
3.5. 测试运行
先执行设备端程序,在云端设备显示“在线”后,查看设备属性值以及设备事件上报结果。然后,再执行云端程序,查看服务调用和属性设置结果。
3.5.1. 设备属性上报
查看设备属性值。
图 6 设备属性
3.5.2. 设备事件上报
图 7 设备事件
3.5.3. 云端服务调用和云端属性设置
图 8 云端服务
图 9 云端属性
3.5.4. 云端调用服务返回值
l 参考帮助文件[4]介绍的样例实现:采用服务端订阅的方式获得云端调用设备端服务的返回参数。
l 返回:
topic=/a1l3AKuGZMp/robot/thing/downlink/reply/message
payload={"iotId":"IaCkVvrHpvXBFqXWteqJ0010a87900","code":200,"data":{"out1":50},"requestId":"234609380","topic":"/sys/a1l3AKuGZMp/robot/thing/service/myscore_reply","source":"DEVICE","gmtCreate":1547548002868,"productKey":"a1l3AKuGZMp","deviceName":"robot"}
generateTime=1547548002869
3.5.5. 数据转发获得属性
l 物模型中的属性可通过规则引擎转发至Datahub,通过Datahub查看属性值。
l SELECT items.myname.value as name, items.myage.value as age FROM "/sys/a1l3AKuGZMp/robot/thing/event/property/post"
图 10 规则引擎的设置
3.6. 小结
试用过程中,云端SDK读取设备属性仍有问题,样例中的QueryDevicePropRequest返回错误的属性值,帮助也不完善,的确很有“开源的味道”,希望IOT团队能快速完善SDK,提供优质的API。
目前,在我们的实际工程中,一般使用“服务端订阅的方式”[4]或者通过规则引擎“数据转发”两种方式获得设备的属性值或者调用服务的返回值。
参考文献
[1] 物模型开发[EB/OL]. https://help.aliyun.com/document_detail/97333.html.
[2] 设备接入Link Kit SDK[EB/OL]. https://help.aliyun.com/document_detail/97333.html.
[3] IoT套件服务端API使用demo[EB/OL]. https://github.com/aliyun/iotx-api-demo.
[4] 服务端订阅[EB/OL]. https://help.aliyun.com/document_detail/89906.html.
阿里云物联网平台物模型SDK试用相关推荐
- 阿里云物联网平台物模型数据解析脚本
在一些物联网业务场景中,由于资源受限或配置较低,设备端不适合直接构造物模型的JSON数据结构体与物联网平台进行直接通信.这种情况下,可以将设备上报的原数据直接透传到物联网平台.物联网平台调用您提交的数 ...
- MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息
目录 1. 准备 2. MQTT.fx 设置登录名.密码 3. MQTT.fx 接入阿里云,订阅Topic 4. 阿里云下发数据给 MQTT.fx 5. MQTT.fx 发布消息给服务器 相关链接:M ...
- 阿里云物联网平台测评:以温度报警器开发为例
点此查看 所有教程.项目.源码导航 文章目录 1. 物联网平台概述 2. 阿里云物联网平台的优势 2.1 快速接入 2.2 超高负载能力 2.3 可用性 2.4 安全性 2.5 性价比 3. 温度报警 ...
- 爬取阿里云物联网平台设备的物模型数据
背景说明 按项目经理的要求,需要导出阿里云物联网平台上所有设备的物模型数据到Excel上,方便后台导入.给客户演示和备份.但是,阿里云物联网平台没有这个功能,手动一个个处理不现实,因此只能写一个爬虫爬 ...
- 使用ESP8266(基于官方SDK)接入阿里云物联网平台
引言 作为物联网开发者,ESP8266应该一点都不陌生了.只需十几块钱淘宝一个小开发板,就可以连上Wi-Fi接入互联网,尽情享受从手机端或Web端控制设备的乐趣.ESP8266接入Wi-Fi是没问题, ...
- 物联网却不能物物相联?阿里云物联网平台得这么设置!
阿里云物联网服务器创建步骤 如果你想入门物联网,并参考了网上关于阿里云物联网的教程.你会发现你最终只能实现物与网连接,无法实现物和物通过网连接.那是因为你忽略了一些步骤. 本文主要以图片形式并配以一定 ...
- 【4G模块】中移物联ML302 + GD32F407 使用支持MQTT协议AT指令接入阿里云物联网平台
目录 〇.目的.GD32.ML302相关简介 0.目的: 1.ML302: 2.LTE Cat.1: 3.GD32F407 一.GD芯片创建工程写驱动:LED.串口4.4G模块 1.创建工程 2.LE ...
- 【阿里云生活物联网架构师专题 ②】esp8266 sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制;
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.esp32接入阿里云物联网平台,实现天猫精灵语音控制: 2.es ...
- 【阿里云生活物联网架构师专题 ①】esp32 sdk 直连接入阿里云物联网平台,实现天猫精灵语音控制;
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.esp32接入阿里云物联网平台,实现天猫精灵语音控制: 2.es ...
- 利用PYTHON连接阿里云物联网平台
语言:python 3.7 环境:windows 10 实例:公共实例(免费) 阿里云的官方文档只有C语言和Linux环境,因此自我探索出利用PYTHON连接阿里云物联网平台的方法和步骤. 概述 - ...
最新文章
- redis缓存java对象_Redis缓存系统-Java-Jedis操作Redis,基本操作以及 实现对象保存...
- 编写易于理解代码的六种方式
- SpringBoot rest映射及源码解析
- 基于Proxy思想的Android插件框架
- login窗口for mysql_CTF| SQL注入之login界面
- 晋级赛关键一场遇到服务器中途维护,第四届全球争霸赛-大区赛常见问题说明...
- 操作系统源代码_国产操作系统“之光”?Windows XP绝密源代码泄露,BT种子已在网上疯传...
- oracle 11g 通过在线重定义方式修改表结构
- 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:预先加载和延迟加载...
- vue获取url中ip_Kubernetes 集群中这样获取客户端真实 IP
- Chrome 开发者工具网络性能使用
- java的ArrayList分析
- 计算机基础第四章excel,计算机基础第4次作业 第四章 Excel知识题
- RapidMiner遇到的问题
- 64位Win10 2004正式版_MSDN我告诉你win10 2004镜像下载
- 一、【VUE-CLI】Vue CLI 脚手架介绍及安装
- 对办公文档加密 到了外部计算机就无法打开,使用文件夹加密超级大师加密了文件,更换电脑后加密文件打不开了怎么办?...
- 华为设备Loopback Detection配置命令
- Python订票系统这才是看电影选座的正确方法,原来我们都上当了