IoT Studio + LoRa打造“又猛又持久”的智能厕所
概述
为了增加厕所使用效率,减少被味道“熏陶”的等待时间,同时也为了增加厕所的清洁效率,我们决定做一个非侵入式的智能厕所改造方案。它可以通过红外热释电检测每个坑位有没有人,在web/app上实时显示,方便如厕人员查询。并且可以检测厕所的臭味,达到阈值时通知清洁工进行清扫。
之前的文章里,我们使用了Link Develop平台 + arduino搭建了一个基于wifi连接的智能厕所demo。实际生产过程中,NodeMCU+PIR有耗电比较高,结构不稳定,没有外壳防水等问题。因此如果需要商用化智能厕所的方案,需要一个更稳定的可靠的办法。
目前Link Develop已经升级成为IoT Studio,我们将会用更强大,更方便的开发能力实现LoRa传感器数据上传+存储,以及对应应用的开发等。
架构

物料清单
慧联无限LoRa红外传感器
一台能联网的电脑
方法&步骤
步骤一:配置LoRa网关-组网络
前往LinkWAN进行网关配置。
关于LoRa以及LoRaWAN的介绍可以查看这篇文档。如果有需要帮助请私信作者。
我们可以选择从清单上:https://linkmarket.aliyun.com/wan 购买网关自己组网络,或是也可以问问其他阿里云用户,透过分享入网凭证给我们,用上他的网络。
这次我们购买慧联的室内小网关G200,自己组建网络。


可以看的到,我们需要插上网线与电源。
然后到Link WAN控制台注册网关



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

这样就是组好网络了。
分配网络给自己用
网络组好之后,我们要把网络分配给自己用,也可以分配其他人使用,当然被分配的人都必须有阿里云账号
PS. 阿里云园区都有LoRaWAN网络,你可以联系阿里云IoT的同学,分享给你用,这样就不用自己买网关组网了。
分配的方式是透过入网凭证来取得网络使用权利。
首先我们来创建自己的网络凭证


我们自己要用网,所以就授权给自己

成功之后,就会在凭证清单看到了,当然如果是别人授权给你的,也会在此清单看到

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

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

然后合上盖子,先不拔掉塑料片。我们需要先在LinkWAN配置LoRa设备信息。
步骤三:在LinkWAN上配置LoRa节点
在步骤一中我们已经把LoRa网关配置完成,获得了GwEUI和JoinEUI,我们只需要填入每个节点的DevEUI和PINCODE即可。
进入LinkWAN平台,首先需要向网关拥有者(即自己)申请一个节点分组(JoinEUI)。

按照图示填写即可。

添加完成后点击授权即可开通权限。


然后进入节点分组管理,点击创建分组。

需要点击“专用凭证”,然后选择之前“入网开通”申请的凭证。

点击完成,即可看到新建的分组,然后点击节点进入管理。

选择添加节点。

然后在弹窗内输入传感器节点上贴纸的信息。(注:作者的传感器为早期版本,只有DevEUI,PINCODE是自己拿的。目前市面的传感器都有贴上DevEUI和PINCODE信息,如果没有请联系供应商。)

添加成功。这样就成功把一个传感器ID授权加入LinkWAN上了。接下来需要前往物联网平台进行节点上云。

步骤四:在物联网平台上配置LoRa节点
首先进入物联网平台Link Platform的产品页面。选择新建产品。产品相当于一个类(class),是某一类设备的集合,该类设备具有相同的功能,您可以根据产品批量管理对应设备。

新建产品时,要选择透传。


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



接下来返回到LinkWAN平台。为刚才的节点分组添加“数据流转”,选择刚才添加的产品。


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

同时物联网平台的设备也收到了日志。

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

下图是原始的上行日志。

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

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

最后结果如图。

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

输入如下的解析脚本。
var COMMAND_REPORT = 02;var COMMAND_SET = 01;var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink JSON格式topic, 设备 上传属性数据到 云端var ALINK_PROP_SET_METHOD = 'thing.service.property.set';function rawDataToProtocol(bytes) { var uint8Array = new Uint8Array(bytes.length); for (var i = 0; i < bytes.length; i++) { uint8Array[i] = bytes[i] & 0xff; } var dataView = new DataView(uint8Array.buffer, 0); var jsonMap = new Object(); var fHead = uint8Array[0]; // 第0个BYTE为上报协议 if (fHead == COMMAND_REPORT) { jsonMap['method'] = ALINK_PROP_REPORT_METHOD; //ALink JSON格式 - 属性上报topic jsonMap['version'] = '1.0'; //ALink JSON格式 - 协议版本号固定字段 jsonMap['id'] = '' + 12345; //ALink JSON格式 - 标示该次请求id值 var params = {}; params['IndoorHumanDetectionSwitch'] = uint8Array[1]; //第1个BYTE为传感器读数判断有没有人 params['SensorProperty'] = uint8Array[2]; //第2个BYTE为传感器本身的状态,对应产品属性中 prop_float jsonMap['params'] = params; //ALink JSON格式 - params标准字段 } return jsonMap;}
然后点击“保存草稿”。之后输入我们的原始数据“020100”进行调试。可以看到右边解析成功了。这时候点击“运行”即可让脚本生效。

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

步骤五:在IoT Studio上配置智能厕所看板
IoT Studio(原Link Develop)是阿里云针对物联网场景提供的生产力工具,可覆盖各个物联网行业核心应用场景,解决物联网开发领域开发链路长、技术栈复杂、协同成本高、方案移植困难的问题。入口在物联网平台的“开发服务”项。
我们首先需要建立一个项目,以项目维度管理我们的智能厕所应用。

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

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

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

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

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

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

步骤六:在IoT Studio上配置智能厕所状态推送&转储
服务开发(原服务编排)可以通过可视化拖拽的方式快速完成所需业务逻辑的设计,例如:设备联动、可视化搭建数据联动、云服务连接、API 生成、数据处理与转储,生成 App 的后端服务。在本文中,我们要使用服务开发完成智能厕所坑位状态的推送,以及把厕所使用状况转储到表格存储Table Store上。
首先新建一个服务——从项目概览页点击“推荐”下的“服务开发”,点击“新建服务”即进入服务开发工作台的新建页面。选择空白模板进行新建。

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

然后在要推送的钉钉群内添加机器人,获得webhook,如下图所示。具体原理可以参考这篇文档,在此不再赘述。

配置webhook以后可以配置推送的信息。钉钉机器人节点目前支持多种消息推送类型,并且支持动态调用设备数据,具体原理可以参考这篇文档。以后也会陆续推出教程教学如何玩转钉钉机器人节点。

框内配置项如下:
{ "msgtype": "text", "text": { "content":"在{{query.props.IndoorHumanDetectionSwitch.time}}时候有{{query.props.IndoorHumanDetectionSwitch.value}}人进坑!" }, "at": { "isAtAll": true }}
配置完成之后,可以点击“部署”对服务进行部署。之后点击“启动”让服务生效。如果设备已经上线,则可以直接看到机器人的消息推送。如图所示。这样就能实现厕所使用状态的实时推送了。


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

最终结果如图:


总结

Link Develop升级为IoT Studio之后,提供了支撑商业化物联网应用的更强大的能力。
本文作者:dupig
本文为云栖社区原创内容,未经允许不得转载。