基于Node-RED的窄带物联网教学及实验设计

2019-12-06 08:48张笑非曲铭雯段先华刘镇
软件 2019年10期

张笑非 曲铭雯 段先华 刘镇

摘  要: 物联网技术在各行各业的广泛运用使得社会对物联网专业人员的需求急剧增加,而硬件、软件、以及相互間的融合是创新能力培养的重点。本文以窄带物联网技术框架为基础,提出了基于Node-RED流式编程的物联网应用设计教学方法,通过Node-RED提供的基本功能模块节点,示范了以中国移动通信窄带模组M5310-A为硬件、以MQTT为通信协议,通过基于组态软件设计的方式,完成物联网应用的设计与实现方法。通过将该教学方法运用到物联网专业相关课程的理论和实践教学中,学生可以快速有效搭建并验证物联网应用设计的正确性。

关键词: 流式编程;M5310-A;MQTT;有限状态机

中图分类号: TP391.41    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2019.10.005

本文著录格式:张笑非,曲铭雯,段先华,等. 基于Node-RED的窄带物联网教学及实验设计[J]. 软件,2019,40(10):2024

Narrow Band Internet of Things Teaching and Experimental Design Based on Node-RED

ZHANG Xiao-fei1,2, QU Ming-Wen1,3, DUAN Xian-hua1, LIU Zhen1

(1. School of Computer, Jiangsu University of Science and Technology, Zhenjiang 212003, China; 2. Faculty of Information, Beijing University

of Technology, Beijing 100124, China; 3. School of Electronic and Information Engineering, Soochow University 215006, China)

【Abstract】: The widespread use of Internet of Things (IoT) technology in a wide range of industries has led to a sharp increase in the demand for IoT professionals, while hardware, software, and their integration are the focus of students innovation. Based on the framework of narrow band IoT technology, this paper proposes a teaching method for IoT application design with flow-based programming of Node-RED. Through the basic function modular nodes provided by Node-RED, the M5310-A of China Mobile is used as the hardware of narrow band module and MQTT is used as the protocol of end-to-end communication, the design and implementation method of the Internet of Things application is completed based on the pattern of configuration software design. By applying this teaching method to the theoretical and practical teaching of IoT-related courses, students can quickly and effectively build and verify the correctness of IoT application design.

【Key words】: Flow-based programming; M5310-A; Message queuing telemetry transport; Finite state machine

0  引言

当前,窄带技术是物联网(Internet of Things,IoT)领域的一个重要分支,窄带物联网(Narrow Band Internet of Things,NB-IoT)是高校物联网专业教学中的一门重要课程,目前相关的教材更多侧重于NB- IoT底层通信机制的原理和规范,围绕着NB-IoT关键技术进行应用开发的教材还相对较少。Node-RED是由IBM Emerging Technologies团队开发的图形化可拖拽式数据流编程软件,根据服务中数据的处理流程编写flow实现服务程序[1]。一些研究已经开始尝试在物联网专业教学中使用Node-RED,文献[2]展示了使用树莓派(Raspberry Pi,RPi)和Node-RED等高级开源工具在物联网课程教学和学习中的适用性和实用性,文献[3]甚至开始为本科阶段的工程专业学生提供了基于Node-RED的IoT研讨会课程。此外,文献[4]通过Node-RED流实现了边缘侧仿真框架所需的微服务,文献[5]阐述了Node-RED在物联网网关组态软件设计用的应用。一些基于云计算的解决方案[6-8]若采用基于组态方式的技术架构,则可以进行更加灵活的设计开发和组件重用。物联网课程中内容的理解和实践在很大程度上取决于工具的高可用性和易用性,本文将就如何利用Node-RED进行窄带物联网技术课程教学和实验设计给出详细介绍。

1  NB-IoT教学设计

NB-IoT是由3GPP开发的低功率广域网(Low Power Wide Area Network,LPWAN)無线电技术标准,用于为IoT提供广域覆盖[9],M5310-A是一款由中国移动推出的工作在频段band3、band5、band8的工业级多频段NB-IoT模组,MQTT[10]是基于PUB/SUB消息传递协议的ISO标准(ISO/IEC PRF 20922)。本教学设计以中国移动M5310-A使用手册[11]为教学素材,以Node-RED为实验环境,通过设计MQTT协议有限状态自动机,利用串口执行AT命令讲解NB-IoT通信的整个过程。

中国移动M5310-A对MQTT的支持通过十条AT命令完成,如表1所示,主要涉及M5310A的MQTT参数设置、与MQTT Broker的连接、MQTT状态统计、MQTT对话的订阅、MQTT对话的消息推送、MQTT对话订阅的解除、与MQTT Broker连接的断开、MQTT参数的删除、MQTTTO、MQTTPING。

图1给出了M5310-A的6种连接状态以及之间的迁移关系,在教学设计中,本文将通过引入有限状态机对M5310-A的连接状态集合、初始状态、状态迁移函数、终止状态、触发事件集合等进行定义。通过讲解M5310-A如何从‘未初始化状态经过相应的触发及事件逐步迁移到‘已连接状态,以及M5310-A接收的消息如何影响当前状态并迁移到其它的状态,从而帮助学生对M5310-A完成MQTT通信的过程有更深入的理解。

教学内容设计中,将M5310-A的有限状态机定义如下:

定义1 是一个五元组,对应M5310-A的有限状态自动机(Finite State Machine,FSM)。

定义2 Σ={‘OK, ‘Error, ‘Timeout, ‘+MQTTOP EN:OK, ‘+MQTTSUBACK, ‘+MQTTPUBCOMP, ‘+MQTTDISC:OK},是一个集合,元素为M5310-A在执行完相应AT命令后,从串口上能够接收到的返回消息、当前状态的超时消息、以及从MQTT Broker接收到的协议消息,这些元素作为M5310-A的FSM输入,将触发其在不同状态间进行迁移。

定义3  ,是一个有限非空集合,共包含6个元素,分别对应M5310-A的6个连接状态‘未初始化、‘已初始化、‘首次连接、‘已连接、‘重新连接、‘已断开。

定义4 ,是集合中的一个元素,表示M5310-A的初始状态,在这里为‘未初始化,即。

定义5 ,是一个状态迁移函数,函数的输入为两个参数,分别是当前状态和接收到的消息,且。则返回相应迁移后的状态,。

定义6 ,是一个可以为空集的集合,其中的元素代表M5310-A最终的连接状态。由于M5310-A的6个连接状态都可以迁移到其它某个或某些状态,所以不存在最终状态,因此该集合为空。

其中对于状态迁移函数的设计,可以在教学过程中使用通过状态/事件表来进行说明。状态/事件表的表达方式有很多,这里将M5310-A的状态迁移表定义为表2中的内容。

2  NB-IoT实验设计

在窄带物联网实验设计中,可以通过Node-RED提供的若干种节点完成与M5310-A的串口通信、通信状态迁移功能、以及其它一些辅助功能的实现。如图2所示,这些节点包括‘serial输入节点、‘serial输出节点、‘dsm节点、‘inject节点、‘function节点、 ‘delay节点、‘i2c输入节点、以及‘mqtt接收节点。

图2(a)和(b)是负责与M5310-A完成串口通信的Node-RED预装节点,其中(a)是串口消息接收节点、(b)是串口消息发送节点。M5310-A的串口参数为波特率9600、数据位8bit、无奇偶校验、停止位1bit。图2(c)是负责实现M5310-A通信状态迁移的节点,是依据有限状态机模型实现的动态状态机,它是一个没有使用外部库的纯Node.js包。该‘dsm节点对应的GitHub资源地址为https://github. com/cflurin/node-red-contrib-dsm,在Node-RED环境中的安装命令为npm install node-red-contrib-dsm。图2(d)是Node-RED预装的注入节点,用于触发整个实验流程的启动、或者周期性产生消息由M5310-A进行发送。图2(e)是Node-RED预装的函数节点,可以通过编写JavaScript函数处理输入该节点的消息,该消息被称为msg,而该‘function节点缺省会处理msg的属性payload中的内容。图  2(f)是Node-RED预装的延迟节点,可以对经过该节点的消息msg进行延迟转发、或限制msg经过该节点的频率。图2(g)是读取基于I2C接口的传感器的节点,该节点与Raspberry Pi I2C驱动程序通信并使用node-I2C软件包完成I2C通信,对应的GitHub资源地址为https://github.com/nielsnl68/node- red-contrib-i2c,在Node-RED环境中的安装命令为npm install node-red-contrib-i2c。图2(h)是Node- RED预装的MQTT数据接收节点,通过指定MQTT Broker的IP地址、端口号、以及Topic名称,完成MQTT消息的订阅。

面向M5310-A的Node-RED流设计如图3(a)所示,其中注入节点‘开始负责M5310-A启动的触发,其后续节点‘初始化负责设置M5310-A的参数和初始状态(‘未初始化)。节点‘执行AT命令负责根据M5310-A的当前状态构造相应的AT命令,节点‘有限状态机则负责根据当前M5310-A的状态和事件控制其状态的迁移。节点‘M5310-A接收和节点‘M5310-A发送分别通过串口完成消息的接收与发送。节点‘读取光敏强度会周期性地触发下一个节点的运行,节点‘PCF8591负责通过I2C接口读取光敏传感器的数据,节点‘推送数据会判断当前M5310-A是否处于状态‘已连接,如果为真则将读取的光敏强度数据利用节点‘M5310-A进行MQTT推送,反之则不推送。这其中关键的工作是图3(a)节点‘有限状态机的实现细节,需要满足表2中的设计,关键的实现代码如下:

{

"currentState": "UNINIT",

"states": {

"UNINIT": {

"OK": "INITED"

},

"INITED": {

"OK": "CONN"

},

"CONN": {

"+MQTTOPEN:OK": "OPENED"

},

"OPENED": {

"+MQTTDISC:OK": "CLOSED"

}

……

}

}

其中給出了M5310-A在处于每个状态时,在接收到指定消息后迁移目标状态的程序定义。而节点‘执行AT命令中的关键代码如下所示:

if(msg.topic=="UNINIT"){

return {payload:'AT+MQTTCFG="hostname", port,

client_id,keepalive,"user_id","password", 1\r\n'}

}

……

else if(msg.topic=='OPENED'){

global.set('state','OPENED')

}

其中会根据M5310-A的当前状态控制向窄带模组所发送的AT命令,这里的参数通过关键字替代进行表示。为了保证存在有效MQTT连接后才使得向MQTT Broker推送节点‘PCF8591所采集到的光敏数据,特别设置了一个Node-RED全局变量‘state。当M5310-A状态为节‘OPENED时,设置该全局变量也为‘OPENED。因此,节点‘推送数据会根据这个全局变量来控制是否通过AT命令向MQTT Broker推送节点‘PCF8591所采集的光敏数据,关键代码如下:

if(global.get('state')=='OPENED'){

return {payload:'AT+MQTTPUB=

"topic_name",2,0,0,0,'+msg.payload+'\r\n'}

}

其中当该全局变量为‘OPENED时,则通过M5310-A的‘MQTTPUB命令推送数据,其中MQTT的topic name通过关键字进行了替代。

此外,对图3(a)中基于M5310-A的数据发送的正确性,可以通过对其数据进行MQTT订阅来验证。图3(b)中通过节点‘MQTT接收完成MQTT订阅功能,然后将接收到的数据通过节点‘MQTT消息进行输出并作观察。

3  实验与结果

图4中给出了基于Node-RED流设计的M5310- A MQTT连接成功的结果。可以看到,M5310-A接收到了消息‘+MQTTOPEN:OK,该消息属于定义2中的集合。根据M5310-A的状态、表2中定义的状态迁移表、以及Node-RED中的实现代码,实现了M5310-A与MQTT Broker的有效连接。

如图5所示,实验中所连接的MQTT Broker是在中国移动OneNET平台上创建的对象,其中设备ID为525904487的资源就是接入的测试用M5310-A模组。在成功连接后,测试用M5310-A会持续不断通过MQTT协议向OneNET推送Node-RED流中的PCF8591所采集的光敏数据。

4  结束语

本文针对物联网专业窄带技术课程中所涉及的硬件、软件、通信等内容,利用基于组态设计方法的Node-RED平台实现面向M5310-A窄带通信的教学和实验案例,帮助学生掌握开发基于窄带通信的物联网应用所需的基本方法。此外,通过对案例中的传感器模块进行替换、或对Node-RED流进行扩展,融入包括面向Web、数据库管理、机器学习等一系列Node-RED组件,使得学生能够开发具有‘硬、‘通、‘软,‘智等全要素的物联网窄带应用,从而能够更好地进行创新创业活动。

参考文献

[1]王江波. 基于Node-red与Redis的实时流数据处理模型的设计与应用[D]. 电子科技大学, 2017.

[2]Chaczko Z, Braun R. Learning data engineering: Creating IoT apps using the node-RED and the RPI technologies[C]. International Conference on Information Technology Based Higher Education & Training. IEEE, 2017: 1-8.

[3]Krishnamurthi R. Teaching Methodology for IoT Workshop Course Using Node-RED[C]. 2018 Eleventh International Conference on Contemporary Computing (IC3). 2018.

[4]翟岩龙, 孙文心, 包天虹, 杨凯, 卿杜政. 基于微服务的边缘侧仿真方法及框架研究[J]. 系统仿真学报, 2018, 30(12): 4536-4545.

[5]汤学明. 物联网网关数据流图形化组态技术研究[D]. 冶金自动化研究设计院, 2018.

[6]李红辉, 关婷婷, 杨芳南. 云计算平台状态监控技术研究与应用[J]. 软件, 2018, 39(1): 9-13.

[7]王晓晖, 乔通. 云环境下面向感知数据汇集的通信服务系统设计与实现[J]. 软件, 2016, 37(2): 155-159.

[8]尹航, 杨欢, 崔海斌, 汪栋, 郭唐宝. 基于大数据应用的虚拟化云平台建设方法研究[J]. 软件, 2018, 39(4): 201-207.

[9]Wang Y P E, Lin X, Adhikary A, et al. A Primer on 3GPP Narrowband Internet of Things (NB-IoT)[J]. IEEE Communica tions Magazine, 2016, 55(3).

[10]IBM. MQTT 3.1.1 Specification[S]. OASIS. December 10, 2015. Retrieved April 25, 2017.

[11]林紫微. M5310-A MQTT使用指导[EB]. 中国移动通信有限公司, June 11, 2018.