用画流程图的方式开发物联网应用

    张敬云 谢作如

    

    

    

    物联网(IoT)可以理解为“万物相连的互联网”,其目标是让万物沟通对话。例如,在电视机上装传感器,可以用手机通过网络控制电视机的使用;在空调、电灯上装传感器,计算机可以精确调控、开关,实现有效节能;在窗户上装传感器,你就可以坐在办公室里通过计算机打开家里的窗户透气等。

    流程图是对系统应用的工作流程的一种可视化表达,便于准确判断各个步骤之间的逻辑关系。有时为了说明某个物联网应用的数据流转或工作流程,我们常常会使用流程图来表示。一些对物联网有着浓厚兴趣的非计算机专业的创客,往往空有各种奇妙的想法,原因是他们无法撰写艰深难懂的程序代码。现在,Node-RED的出现给创客们提供了一个很好的解决途径——用基于流程图的可视化界面开发工具,开发物联网应用(如图1)。

    ● Node-RED和MQTT简介

    1.Node-RED简介

    Node-RED是IBM开发的一个基于“流”的可视化界面编程工具。因为编程简单、流程清晰,这个工具很快发展成为一种通用的物联网编程工具。Node-RED提供基于网页的编程环境,通过拖拽已定义的节点到工作区,并用线条连接节点创建数据流来实现编程。程序代码则以JSON字符串的格式保存,方便用户分享与修改。

    Node-RED是基于Nodejs开发的,所以要先安装Node环境,再通过命令安装Node-RED。详细的安装过程可以参考一些网络教程,或者“虚谷物联”项目的官方文档(文档地址:https://github.com/vvlink/SIoT)。

    2.Node-RED连接MQTT服务器

    MQTT是物联网应用的核心协议之一。EasyIoT、SIoT都是典型的MQTT服务器。本文中,使用SIoT作为MQTT服务器,具体的操作过程可参考“虚谷物联”项目的官方文档。在Node-RED中,我们只需将MQTT输入节点拖出,双击修改其中参数,设置好服务端、主题、用户名和密码(SIoT登录的用户名和密码),就可以接收到从MQTT服务器传来的数据。当然,也可以通过MQTT输出节点从Node-RED发送信息到MQTT服务器。

    ● Node-RED的Arduino插件

    Node-RED與Arduino可通过串口进行交互,但默认的Node-RED界面是没有Arduino节点的,需要另外安装。此外,还要给Arduino烧录标准的Firmata协议,在Arduino IDE中可以找到(Files-Examples-Firmata-Standard Firmata)。

    安装Arduino插件后,即可看到Arduino in和Arduino out两个节点。顾名思义,in是引脚信息的输入,out是引脚信号的输出。

    1.传感器信息的输入

    通过输入节点Arduino in,可以将传感器感知到的外界信息,如光照、温度、声音等输入到Node-RED中。本实例是将光线传感器的值输入到Node-RED中,按住鼠标左键将节点拖至流程图中,发现节点的名字发生了改变,这是由于节点被实例化,代表了某个具体的数值。我们可以通过修改节点的名称属性来改变其在流程图中的名字,并不影响整个流程中的其他数据。为了方便观察数据,我们加入了debug节点(如图2)。

    双击Arduino in节点进行编辑,需要选择Arduino的端口号、引脚类型(Type)以及引脚号(Pin)。然后单击“部署”运行程序,在调试窗口便能看到实时输入的光线值信息了(如图3)。

    2.控制信号的输出

    通过Node-RED,还可以控制Arduino的引脚电平变化,从而控制设备的打开或关闭,实现信号的输出。本实例是控制一个LED灯的打开或关闭,用到了Arduino out节点和inject(注入)节点(如图4)。

    双击inject节点进行编辑,将“内容”设置为数字1(也可以选择布尔值);双击Arduino out节点进行编辑,选择引脚类型Type以及引脚号Pin,上一个步骤中已经设置了Arduino的端口号,这里就不用再写了。单击“部署”运行程序,便可以看到LED亮起来了。同理,也可以控制LED的熄灭。如果将Arduino out节点的引脚类型Type选择为模拟输出,则还可以控制LED的亮度输出。

    ● 典型的物联网应用开发

    1.采集数据到服务器

    数据采集是探究性问题研究过程中的关键环节。通过Node-RED,我们可以将传感器感知到的外界数据实时上传到MQTT服务器上,便于数据的分析处理。本实例是将光线传感器的值上传到MQTT服务器。该过程需要用到Arduino in节点和MQTT out节点。双击相应的节点,修改其中的参数,然后单击部署运行程序,便可以看到流程图中“已连接”的标识(如图5),同时,也可以在MQTT服务器端看到实时上传的数据。

    2.远程控制LED模块

    远程控制是物联网应用最常见的操作。本实例将实现从MQTT服务器发送信息远程控制LED灯亮或灭。该过程需要用到Arduino out节点和MQTT in节点。双击相应的节点,修改其中的参数,然后单击部署运行程序,便可以看到流程图中“已连接”的标识。此时我们就可以在MQTT服务端发送消息1或者0来控制LED灯的亮或者灭了。

    3.发送异常信息到邮箱

    利用运动传感器及蜂鸣器,即可制作一个检测到家里有人出入,便有警报声响起,同时通过E-mail的方式向主人发送消息的“安防”系统(如图6)。

    这个应用的编写,需要用到Arduino in节点、Arduino out节点、switch节点、change节点及E-mail的发送节点。(Arduino in和Arduino out节点之前的实例已学过,不再赘述;Node-RED默认是没有安装邮箱节点的,这里也略过安装方式)

    ①“switch”节点可实现是否有人的判断。若检测到有人,即运动传感器的值为1时,“switch”节点的值输出1,同时蜂鸣器响起,并通过E-mail发送消息给主人,否则一切正常。为了增加整个流程的可读性,还可为节点取个名字,如“判断”(如图7)。

    ②“change”节点可改变上一节点流入的内容。为了增加邮件的可读性,将上一节点流入的数据“1”改变为文字“有人闯入”,发送给下一个E-mail节点(如图8)。

    ③“E-mail”的发送节点编辑。我们只要知道收件人的邮箱地址,就可以通过发件人的邮箱地址和密码向收件人发送消息。不同的邮箱地址,需设置不同的邮箱服务器及端口。这里我们是以QQ邮箱用户向QQ邮箱用户发送消息,发件服务器是smtp.qq.com,端口默认为465。

    需要注意的是,现在国内大多数的免费邮箱在默认情况下是關闭SMTP和POP协议的,因此在使用“E-mail”节点收发电子邮件时,需首先开启SMTP和POP协议,具体操作可打开QQ邮箱,到“设置”-“账户”里去开启。如图9所示,Password一栏输入的是QQ邮箱的授权码,而非QQ邮箱的密码。我们可打开QQ邮箱,在“设置”-“账户”里生成授权码。

    至此,单击部署运行流程图,如果检测到有人,则会发送一封邮件提醒主人(如图10)。

    ● Node-RED的应用思考

    Node-RED能够成为众多工程师喜欢的物联网应用程序开发工具,原因是它具备两大优势:一是Node-RED基于流的编程模型。基于流的编程模型可以很好地映射到典型的物联网应用中。二是Node-RED内置了丰富的节点(Node)。通过构建一套强大的输入和输出节点,为开发人员提供了强大的构建模块,使其能够快速组合完成大量的流程,实现与现实世界的交互及控制设备,而无需担心编程细节。

    目前,Node-RED在工业物联网和控制中已经开始广泛应用,如西门子公司的IoT2000、研华公司的WISE PaaS 网关、美国的OPTO? Groov EPIC等设备中都安装了Node-RED。简而言之,Node-RED是一款值得学习的物联网工具,其入门简单且功能强大。为了方便更多人使用Node-RED,开源硬件虚谷号的新固件上集成了Node-RED、SIoT等软件,开机即可使用,对更多的创客来说,物联网的学习门槛更低了。