全部产品
云市场

LoRaWAN智能厕所

更新时间:2019-05-27 14:49:43

前言

本实践推荐使用阿里云的物联网平台一站式完成应用开发,物联网平台可直接调用Link WAN网管服务。

应用概述

为了增加厕所使用效率,减少被味道“熏陶”的等待时间,同时也为了增加厕所的清洁效率,可以做一个非侵入式的智能厕所改造方案。通过红外热释电检测每个坑位有没有人,在web/app上实时显示,方便如厕人员查询。并且可以检测厕所的臭味,达到阈值时通知清洁工进行清扫。

本文中将使用阿里云的物联网平台 搭建了一个基于LoRaWAN连接的智能厕所demo。

物料清单

慧联无限G200 LoRaWAN网关

慧联无限LoRa红外传感器

一台能联网的电脑

步骤一:配置LoRaWAN网关-自建LoRaWAN网络

用户可选择从阿里云IoT市场上购买网关自己组成网络。

这是本次示范的室内小网关G200:网关图1

网关图2

插上网线与电源,然后到Link WAN管理平台控制台注册网关。加网关1

加网关2

加网关3

G200回传网默认是DHCP上网配置,如果你是固定IP或PPPoE在依照实际环境调整,方法可以参考G200网关手册,如果一切顺利可以再Link WAN网关页面显示在线。网关在线

分配网络给自己用

网络组好之后,把网络分配给自己账号使用。分配后透过入网凭证来取得网络使用权利,首先第一步来创建自己的网络凭证。网关3

全局凭证

我们自己账号要用网,所以就授权给自己。全局凭证2成功之后,就会在凭证清单看到了,当然如果是别人授权给你的,也会在此清单看到。全局3

步骤二:拆封LoRaWAN硬件

从网上购买来的认证过的LoRa传感器,拆出来的时候可以看到后面附了一个16位码的贴纸。这个是节点的DevEUI,在后面的新版硬件中还会加上6位的PINCODE字段。

按照说明书,默认是5分钟模式——即收到一次警报之后5分钟之内不会再上传。这跟厕所的使用场景不一致,我们需要调成测试模式——即每次收到警报都会上传。把背部的壳子掰开(不需要螺丝刀)之后,调整跳针针帽位置到ON,然后合上盖子,先不拔掉塑料片。

步骤三:在物联网平台上配置LoRa节点

首先进入物联网平台的产品页面。选择新建产品。产品相当于一个类(class),是某一类设备的集合,该类设备具有相同的功能,可以根据产品批量管理对应设备。

1

新建产品时,入网方式选择”LoRaWAN”,入网凭证选择刚刚创建分配给自己的凭证,数据格式选”透传/自定义”。

a

b

c

建立了产品之后,点击“设备管理”前往设备管理页面。然后选择“添加设备”。输入16位DevEUI作为DeviceName(注意要小写)。然后确定。

3

4

5

接下来返回到网管平台。可以看到LoRaWAN链路层数据通信上下行。

e

7

这时候可以拔掉塑料片让传感器上电了。可以看到网管平台有收到上行日志。

8

上图可在物联网平台查阅,此时设备也收到了数据日志,这表示所有通讯链路都打通了

下图是原始的上行日志。10

接下来就是解析设备上传的信息了。从传感器的说明文件可以得知,传感器上报的是二进制数据。我们如何把二进制数据转化为可以理解的属性名称呢?

下图是厂家提供的传感器的二进制配置文件。9

11

对这个传感器,“020100”中的第一个BYTE“02”表示协议,“01”对红外传感器表示“有人”,“00”表示传感器状态正常。我们首先需要在产品里定义“有人经过”和“传感器状态”两个功能,用于记录这两个属性。前往产品详情页的“功能定义”tab,点击右下方“自定义功能”的“添加功能”(注意不要在“标准功能”处添加,限制较多)。

12

然后在弹窗内配置属性,“室内人体探测开关”配置为布尔型,“传感器属性”配置为枚举型。注意要是“读写型”。点击确定添加属性。

13

最后结果如图。

14

接下来需要使用产品定义里的数据解析,把二进制数据自动转化为Alink-JSON格式,以对应上刚才设置的“室内人体探测开关”与“传感器属性”。转化规则可以参考文档。我们这里只放出最后的代码。注意:数据解析需要产品为“未发布”状态。如果已经发布请点击右上角“撤回发布”。

15

输入如下的解析脚本。

  1. var COMMAND_REPORT = 02;
  2. var COMMAND_SET = 01;
  3. var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink JSON格式topic, 设备 上传属性数据到 云端
  4. var ALINK_PROP_SET_METHOD = 'thing.service.property.set';
  5. function rawDataToProtocol(bytes) {
  6. var uint8Array = new Uint8Array(bytes.length);
  7. for (var i = 0; i < bytes.length; i++) {
  8. uint8Array[i] = bytes[i] & 0xff;
  9. }
  10. var dataView = new DataView(uint8Array.buffer, 0);
  11. var jsonMap = new Object();
  12. var fHead = uint8Array[0]; // 第0个BYTE为上报协议
  13. if (fHead == COMMAND_REPORT) {
  14. jsonMap['method'] = ALINK_PROP_REPORT_METHOD; //ALink JSON格式 - 属性上报topic
  15. jsonMap['version'] = '1.0'; //ALink JSON格式 - 协议版本号固定字段
  16. jsonMap['id'] = '' + 12345; //ALink JSON格式 - 标示该次请求id值
  17. var params = {};
  18. params['IndoorHumanDetectionSwitch'] = uint8Array[1]; //第1个BYTE为传感器读数判断有没有人
  19. params['SensorProperty'] = uint8Array[2]; //第2个BYTE为传感器本身的状态,对应产品属性中 prop_float
  20. jsonMap['params'] = params; //ALink JSON格式 - params标准字段
  21. }
  22. return jsonMap;
  23. }

然后点击“保存草稿”。之后输入我们的原始数据“020100”进行调试。可以看到右边解析成功了。这时候点击“运行”即可让脚本生效。

16

在日志里可以看到二进制的020100已经转为{“SensorProperty”:0,”IndoorHumanDetectionSwitch”:1}了。这样就完成了设备接入。

17

步骤四:在IoT Studio上配置智能厕所看板

IoT Studio(原Link Develop)是阿里云针对物联网场景提供的生产力工具,可覆盖各个物联网行业核心应用场景,解决物联网开发领域开发链路长、技术栈复杂、协同成本高、方案移植困难的问题。入口在物联网平台的“开发服务”项。

我们首先需要建立一个项目,以项目维度管理我们的智能厕所应用。

18

创建项目之后可以看到右边栏多了一项“SmartToilet”,点击查看进入项目详情。然后在项目概览页点击右上角导入产品,把刚才创建的产品导入到项目内。

19

然后在左侧栏点击“推荐”下的“Web可视化开发”,点击“新建应用”进入Web可视化开发工作台,然后选择空白模板进行新建。

20

进入编辑中,可以改变背景色,添加标题文字等。对最重要的厕所占位状态,可以理解为一个“有人”、“没人”的指示灯,因此把指示灯组件放入画布中。并配置数据源。

21

配置数据源时,选择产品,关联的设备,以及关联的布尔型属性。点击“验证数据格式”获得通过,之后点击确定完成配置。配置之后可以通过上传图片等修改指示灯开关状态的样式。

22

点击预览,完成整个Web应用的链路调试。

23

假设有7个坑位,只需要重复上述步骤即可(可以使用上传excel格式批量添加设备)。另外GUI配置的部分与之前的版本操作一致,在此不再赘述。最终效果图如图。

24

步骤五:在IoT Studio上配置智能厕所状态推送&转储

服务开发(原服务编排)可以通过可视化拖拽的方式快速完成所需业务逻辑的设计,例如:设备联动、可视化搭建数据联动、云服务连接、API 生成、数据处理与转储,生成 App 的后端服务。在本文中,我们要使用服务开发完成智能厕所坑位状态的推送,以及把厕所使用状况转储到表格存储Table Store上。

首先新建一个服务——从项目概览页点击“推荐”下的“服务开发”,点击“新建服务”即进入服务开发工作台的新建页面。选择空白模板进行新建。

25

我们首先把厕所的占用时间推送到钉钉机器人上。首先配置一个“设备触发”节点作为输入,选择之前创建的产品,然后选择“所有设备”以监听所有设备上报的信息。最后选择监听“属性上报”。之后配置一个钉钉机器人节点作为消息推送节点。

26

然后在要推送的钉钉群内添加机器人,获得webhook,如下图所示。

27

配置webhook以后可以配置推送的信息。钉钉机器人节点目前支持多种消息推送类型,并且支持动态调用设备数据。

28

框内配置项如下:

  1. {
  2. "msgtype": "text",
  3. "text": {
  4. "content":"在{{query.props.IndoorHumanDetectionSwitch.time}}时候有{{query.props.IndoorHumanDetectionSwitch.value}}人进坑!"
  5. },
  6. "at": {
  7. "isAtAll": true
  8. }
  9. }

配置完成之后,可以点击“部署”对服务进行部署。之后点击“启动”让服务生效。如果设备已经上线,则可以直接看到机器人的消息推送。如图所示。这样就能实现厕所使用状态的实时推送了。

29

30

如果需要把厕所的使用状况使用TableStore,云数据库MySQL等云产品存储起来,可以使用存储节点。

31

最终结果如图:

32

结语

33