要想通过物联网平台实现远程监控设备,那么就要建立监控端设备(比如手机)和被监控端设备的数据交互,在阿里云物联网平台完成这个交互功能的方法就是建立两个设备之间的数据流转,对于设备要流转的物模型数据,阿里云网站上已经有详细的示例介绍,但是对于设备上下线状态的数据流转,网站没有进行详细说明,本人经过摸索,整理成此文,予以记录。

目录

一、监控端设备与被监控端设备完成数据交互的过程

第一,在物联网平台创建虚拟设备

第二,将实际设备与虚拟设备连接

第三,设置数据流转

二、设备状态数据流转的设置

第一步、创建数据源

第二步、创建数据目的

第三步、创建解析器并关联启动

第四步,测试

三、脚本程序的解释

第一步、脚本示例,详见脚本语法 (aliyun.com)

第二步、本例脚本

1、设备上下线状态Topic

2、设备上下线流转的数据格式

3、脚本代码


一、监控端设备与被监控端设备完成数据交互的过程

第一,在物联网平台创建虚拟设备

在物联网平台建立实际设备(监控设备和被监控设备)相对应的虚拟设备,获得ProductKey、DeviceName、DeviceSecret三要素。此步属于阿里云物联网平台基本操作,阿里云官方网站有详细说明,可以参考:

创建产品 (aliyun.com)

单个创建设备 (aliyun.com)

批量创建设备 (aliyun.com)

第二,将实际设备与虚拟设备连接

在实际设备接入程序内配置相应的虚拟设备三要素,完成实际设备与物联网平台的连接,注意:虚拟设备和实际设备只能一对一连接。阿里云已经有设备的接入程序例程,可以参考:

下载设备端SDK (aliyun.com)

第三,设置数据流转

建立物联网平台内虚拟设备的数据流转,完成被监控实际设备数据上传到Iot虚拟设备->被监控虚拟设备数据流转到监控虚拟设备->监控虚拟设备数据下发到监控实际设备,完成实际设备之间的数据交互。

此步基本操作可以参考:

设置数据流转解析器 (aliyun.com)

设置数据流转解析器又分为3步:配置数据源、配置数据目的、编写解析器脚本程序。这三步中编写脚本程序难度最大,最为关键。阿里云官网上脚本示例都是以物模型数据上报为例的,可以参考:

脚本语法 (aliyun.com)

二、设备状态数据流转的设置

本文以被监控设备状态流转到监控设备为例,被监控虚拟设备名称:LZM1001,监控虚拟设备名称:LZM1002,这两台设备已经在物联网平台创建,并且已经与实际设备进行了连接。另外注意,阿里云物联网平台数据流转有新版和旧版,本文以新版为例。

数据流转设置的入口:物联网平台->规则引擎->云产品流转

第一步、创建数据源

1、在云产品页面,点“数据源”标签

2、点“创建数据源”按钮,给新的数据流转创建一个新的数据源,本例也就是被监控设备与虚拟设备LZM1001相连接的上下线状态

3、在数据源名称栏内取一个名字:本例取名为“设备LZM1001上下线状态” ,数据源描述可先不填。

4、点“确定”按钮,然后可以在数据源页面看到新创建的这条数据源。

5、点数据源“设备LZM1001上下线状态” 后边操作的“查看”,进入数据源详情界面,此时界面内还没有数据源。

6、在数据源详情界面,点“添加Topic”按钮,弹出“添加Topic”对话框。

7、第一个下拉列表框是Topic类型,选择“设备状态变化通知”。

8、第二个下拉列表框是产品名称,选择LZM1001所属的产品。

9、第三个是设备名称,选择“LZM1001”

10、然后点“确定”按钮。

此时可以看到数据源详情里已经有了一条数据源。

第二步、创建数据目的

1、点“数据目的”按钮。

2、点“创建数据目的”按钮,弹出“创建数据目的”对话框。

3、数据目的名称栏内:本例取名“设备LZM1002接收上线线状态”。

4、选择操作下拉列表框选“发布到另一个Topic”。

5、产品下拉列表框选择LZM1002所属的产品。

6、点“确定”按钮,完成创建。

此时可以看到数据目的页面内,已经有了这条新建的数据目的,注意:要记住这条数据目的ID为1017,一会编写解析器脚本会用到。

第三步、创建解析器并关联启动

1、点“解析器”标签,进入创建解析器页面。

2、点“创建解析器”按钮,弹出“创建解析器”对话框。

3、解析器名称栏,本例取名为“设备LZM1001状态发送到LZM1002”。

4、点“确定”按钮,完成创建。

5、在创建解析器页面可以看到这条新建的解析器,点操作栏“查看”,进入解析器详情页面,对解析器进行下一步操作。

6、在解析器详情页面点“数据源”标签,进入“关联数据源”页面。

7、点“关联数据源”按钮。

8、在“关联数据源”对话框,数据源下拉列表框内选择刚刚创建的数据源“设备LZM1001上下线状态”。

9、然后点“确定”按钮。

此时可以看到关联数据源页面内,已经有了一条数据源。

10、点“数据目的”标签。

11、在“数据目的”页面内,点“关联数据目的”按钮。

12、 在“关联数据目的”对话框内,在数据目的选择下拉列表框选择刚刚创建的数据目的“设备LZM1002接收上线线状态”。

13、点“确定”按钮,完成关联。

此时,在数据目的页面,可以看到有了这条数据目的,数据目的ID为1017。

14、点“解析器脚本”标签,进入“编辑脚本”界面。

15、在编辑框内,输入如下代码:

var data = payload("json");var select = {};
select.put("deviceName", deviceName());
select.put("timestamp", timestamp());
select.put("status", data.status);writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);

16、点“保存”按钮。

17、点“发布”按钮。

18、点解析器“设备LZM1001状态发送到LZM1002”前的后退箭头,返回到“云产品流转”页面。

19、点击“设备LZM1001状态发送到LZM1002” 这条解析器后边的“启动”按钮,启动云产品流转解析器。

第四步,测试

测试设备:LZM1001为一台真实设备,LZM1002用Android studio AVD代替。进行测试的结果如下:

当设备LZM上线时,LZM1002收到的消息中的msg即为数据流转的内容

devicename:LZM1001

timestamp:1661580931561

status:online

当设备LZM下线时,LZM1002收到的消息中的msg即为数据流转的内容

devicename:LZM1001

timestamp:1661590108538

status:offline

测试结果正确,配置成功!

三、脚本程序的解释

下边对脚本的代码进行一下解释:

第一步、脚本示例,详见脚本语法 (aliyun.com)

以下为阿里云上给出的脚本示例:

示例数据为上报的属性数据,输入数据如下:

{"deviceType": "CustomCategory","iotId": "JCp9***","requestId": "1626948228247","checkFailedData": {},"productKey": "a1o***","gmtCreate": 1626948134445,"deviceName": "Device1","items": {"Temperature": {"value": 38,"time": 1626948134319},"Humidity": {"value": 25,"time": 1626948134319}}
}

解析和处理数据的示例如下:

//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
//筛选出上报的温湿度值。
var h = getOrNull(data, "items", "Humidity", "value");
var t = data.items.Temperature.value;
// 设置温度值大于38时触发规则,转发数据到云数据库RDS。
// RDS表结构为id[自增主键]、deviceName、temperature、humidity、time,在writeRds方法中,可以按column:value的形式,将值写入对应的列。
if (t > 38) { writeRds(1000, {"deviceName":deviceName(), "temperature":t, "time":timestamp(), "humidity":h});
}

解析处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。

第二步、本例脚本

首先看一下设备状态变化的Topic和数据格式,此部分内容可以参考数据格式 (aliyun.com)

1、设备上下线状态Topic

Topic:/as/mqtt/status/${productKey}/${deviceName}

通过该Topic获取设备的上下线状态。

此句用在数据源关联。

2、设备上下线流转的数据格式

设备上线的数据格式:

{"status":"online","iotId":"4z819VQHk6VSLmmBJfrf00107e****","productKey":"al12345****","deviceName":"deviceName1234","time":"2018-08-31 15:32:28.205","utcTime":"2018-08-31T07:32:28.205Z","lastTime":"2018-08-31 15:32:28.195","utcLastTime":"2018-08-31T07:32:28.195Z","clientIp":"192.0.2.1"
}

设备下线的数据格式:

{"status":"offline","iotId":"4z819VQHk6VSLmmBJfrf00107e****","offlineReasonCode":427,"productKey":"al12345****","deviceName":"deviceName1234","time":"2018-08-31 15:32:28.205","utcTime":"2018-08-31T07:32:28.205Z","lastTime":"2018-08-31 15:32:28.195","utcLastTime":"2018-08-31T07:32:28.195Z","clientIp":"192.0.2.1"
}

上下线的数据格式中,第1条即为上下线的status的键值对。

3、脚本代码

var data = payload("json");var select = {};
select.put("deviceName", deviceName());
select.put("timestamp", timestamp());
select.put("status", data.status);writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);

(1)第1行代码:

var data = payload("json");

本例脚本代码第一行与脚本示例第一句一致,将设备状态变化通知上报的数据用payload函数,转成json格式,并将此json格式数据赋值给变量data。payload函数详细解释如下表:

payload(textEncoding)

返回设备发布消息payload的转义数据。textEncoding表示payload的转义字符编码,取值如下:

  • 不传入参数:默认按照UTF-8编码转换为字符串,即payload()等价于payload('utf-8')
  • 'json':将payload数据转换成Map格式变量。如果payload不是JSON格式,则返回异常。
  • 'binary':将payload数据转换成二进制变量进行透传。

(2)第2行代码:

 var select = {};

构建一个名为select的map类型数据,map内存储的对象为键值对,第一列为键名,第二列为键值,select初始化为空。

(3)第3-6行代码:

select.put("deviceName", deviceName());select.put("timestamp", timestamp());select.put("status", data.status);

向select内填加三个键值对,分别为设备名deviceName、时间戳timestamp和状态status。

注意键值名为一个标志字段,带双引号,其后的键值是从设备状态变化时上传的消息数据中取出的,所以为一个变量。

devieName和timestamp为设备上下线数据具体内容json之外的部分,所以变量格式为函数形式: deviceName()和timestamp()。

而status是json数据的具体内容,所以格式为data.status,此处是关键!

  • Map类型基本数据类型支持的函数。

    表达式 说明
    [Object] 获取指定键(Key)对应的Value
    size() 获取Map数据中键值对数量。
    containKey(String) 判断Map数据中是否包含指定的键。
    keySet() 获取Map数据中键的集合,返回类型为Array。
    remove(Object) 移除Map数据中指定键对应的键值对。
    put(Object, Object) 在Map数据中添加键值对。
    putAll(map) 在Map数据中批量添加一组Map数据。

(4)第6行:

writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);

数据转发到另外一个Topic,所用的函数为writeIotTopic,此第一个变量为数据目的ID(此ID一般为某个产品,而不是具体的设备),第二个变量为转发目的的Topic(此变量确定为某个设备),第三个为转发的map格式的数据。

本例中:数据目的ID为1017,就是上文创建的数据目的编号。

Topic包含了产品名称:gbsp*******,设备名称:LZM1002,以及下发格式:set

要发送的数据就是2-5行代码创建的select。

writeIotTopic函数的具体说明如下:

writeIotTopic(destinationId, topic, payload, deviceName) 流转数据到另一个Topic。

  • Topic:数据转发目的地Topic,支持以下Topic。

    • 自定义Topic:该自定义Topic的设备操作权限需为订阅,即所属设备可订阅这个Topic,获取转发的消息。
    • 物模型数据下发Topic:/sys/${productKey}/${deviceName}/thing/service/property/set。该Topic为设备接收设置属性值指令的Topic,设备从该Topic接收转发数据,并根据数据内容,设置属性值。用于目的地Topic所属设备根据转发的数据更改属性值的场景。

    Topic中${productKey}必须与destinationId对应数据目的中设置的产品相同。函数中Topic必须指定具体Topic,不支持使用通配符。

    更多信息,请参见创建数据目的。

    注意 目的地Topic所属设备若未订阅该Topic,则收不到转发的消息。

    例如使用MQTT.fx工具接入物联网平台的设备A,不会自动订阅设备Topic,若设备B向设备A的Topic:thing/service/property/set转发数据,而设备A未手动订阅该Topic,则设备A收不到设备B转发的消息。

    设备Topic自动订阅的详细说明,请参见自动订阅Topic说明。

  • deviceName:对于开源MQTT托管形态下产品和设备,及MQTT云网关产品和设备,流转数据到另一个Topic时,需传入该参数。其他业务场景无需传入该参数。

    数据格式为Map类型,Key为"deviceName",Value为deviceName(),表示发送该Topic消息的设备名称。

    更多说明,请参见消息通信说明。

注意 MQTT云网关产品和设备下,流转的数据目的Topic仅支持自定义Topic,且不支持跨产品流转,即仅支持流转到当前产品下的自定义Topic。

开源MQTT托管形态的基础型实例下,仅支持创建一个产品,默认不支持跨产品流转。

数据转发到另一Topic

此段脚本中用的函数具体见:函数列表 (aliyun.com)

阿里云物联网Iot设备上下线状态数据流转的设置相关推荐

  1. 利用设备上下线状态数据流转到TSDB的方法实现监测设备历史在线情况

    在进行今天的正题前,先举个小例子: 甲和乙是同一公司的同事,两个人办公室离得很远,但可以通过单面窗看到公司大门口,当对方上班和下班时都能看到,只是从大门口看不到办公室内的情况.假如甲先到公司,乙后到公 ...

  2. 爬取阿里云物联网平台设备的物模型数据

    背景说明 按项目经理的要求,需要导出阿里云物联网平台上所有设备的物模型数据到Excel上,方便后台导入.给客户演示和备份.但是,阿里云物联网平台没有这个功能,手动一个个处理不现实,因此只能写一个爬虫爬 ...

  3. 阿里云物联网平台设备之间通讯、数据转发

    阿里云物联网平台设备之间通讯.数据转发 阿里云物联网平台设备之间通讯.数据转发 准备工作 创建云产品流转规则 调试 阿里云物联网平台设备之间通讯.数据转发 本文演示使用阿里云物联网平台两设备间的通讯. ...

  4. Python对阿里云物联网MQTT设备接入端开发

    文章目录 前言 一.快速搭建Python对阿里云物联网MQTT设备接入端代码实现 1. mqtt子应用下view.py 主文件 2. wsgi.py 二.具体使用介绍 1. 安装包 2. 设备认证,一 ...

  5. 阿里云物联网平台设备模拟器

    在使用阿里云物联网平台过程中,如果开始调试没有实际的物理设备,可以考虑在阿里云物联网平台使用官方自带的模拟器进行调试.不过也可以通过叶帆科技开发的阿里云物联网平台设备模拟器AliIoTSimulato ...

  6. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  7. 阿里云物联网IOT平台使用案例教程(模拟智能设备)

    我将介绍如何通过MQTT.阿里IOT SDK完成设备与云平台对接 ​ 前言 最近尝试了一下阿里云IoT物联网平台,还是蛮强大的.在此记录一下学习过程. 本教程不需要任何外围硬件,一台电脑和一根能上网的 ...

  8. 实现阿里云物联网平台设备信息到微信小程序分享过程

    简要说明: 实现微信小程序连接阿里云物联网平台并且显示阿里云设备信息等,设备端采用模拟设备进行数据上传,并且利用规则引擎和自定义的Topic进行信息的接受和发送. 目前效果图 步骤: 1.注册阿里云物 ...

  9. ESP8266 基于AT指令集连接阿里云物联网平台设备

    总结一下之前学习的内容.想通过ESP8266连接上阿里云物联网平台上创建的设备. 用ESP8266连接阿里云,本质上就是开启ESP8266的透传模式,发送MQTT报文.所谓MQTT报文,就是符合MQT ...

最新文章

  1. IOS --app微信支付
  2. c语言程序设计第4版pdf荣政_C语言程序设计(第4版) (史蒂芬.寇肯) 中文pdf扫描版[82MB]...
  3. 转adb Shell root 权限
  4. PHP框架 one 1.6.0 发布
  5. 在Linux下禁用键盘、鼠标、触摸板(笔记本)等输入设备
  6. cat命令详解_好程序员Python培训之详解eval好与坏
  7. mysql 性能问题_mysql性能问题
  8. 2021年软考+BGP邻居实验
  9. html如何根据tr自动换行,css实现表格td 自动换行样式
  10. How to Root Nexus 5 on Android 4.4.4 KTU84P and Install CWM Recovery
  11. 儿童专注力训练之数图形
  12. 服务器非80端口无法访问网页,使用非80网站访问服务器web提示需要备案呢?
  13. orcal添加序列让主键的自动增长
  14. 谷歌神经网络机器翻译NMT:人人可利用TensorFlow快速建立翻译模型
  15. 基尼指数 Gini Index
  16. 游戏受计算机限制,玩游戏的时候突然电脑显示本地连接受限制或无连接怎么处理...
  17. 天数计算(某日(时间戳)到今天的天数、两个日期相差的天数)
  18. fets去除回车符号
  19. shiro权限拦截失效
  20. Keras之TCN:基于keras框架利用时间卷积网络TCN算法对上海最高气温实现回归预测(把时间序列数据集转化为有监督学习数据集)案例

热门文章

  1. 华硕FL5600l拆机
  2. vue3.0 + xlsx 实现纯前端生成excel表格
  3. 智能手机也是一种计算机对不对,介绍手机内存的新闻,我转的,对不对不要喷啊...
  4. 【web前端开发教程】
  5. linux系统微内核,微内核操作系统的定义及用微内核设计的系统,附Linux是单内核结构介绍...
  6. 【ASE入门学习】ASE入门系列六——塞尔达扰动火焰
  7. 【规范】万字集大成的C编写规范
  8. Centos7安裝GitHub
  9. 微趣能Weiqn(微信源码下载)V1.5.0.2beta官方版
  10. Docker安装配置Redis最全教程