一种通用MODBUS物联网网关设计与实现
2019-09-05陈文艺张杨旭
陈文艺, 张杨旭, 杨 辉
(1.西安邮电大学 物联网与两化融合研究院, 陕西 西安 710061;2.西安邮电大学 通信与信息工程学院, 陕西 西安 710121)
物联网即物物相连的互联网[1]。作为一种通过信息交互以实现智能化识别、定位、监控和管理的网络,目前广泛应用于智能物流、智能交通等各个领域[2]。网关作为物联网中连接感知网络和传统网络的桥梁[3],可以实现不同协议设备之间信息的传递,网关可以屏蔽各种底层差异,实现通信技术标准的互联互通与平台之间的数据实时同步,提高物联网系统的可靠性与稳定性,可以将分散在不同区域感知网络的信息孤岛连接在一起,完成各种传感设备稳定的接入、控制、数据存储等,实现不同子网的信息交互和通信[4]。
目前关于物联网网关的研究主要包含两方面内容。一是如何屏蔽底层网络,实现各类传感设备的快速接入。文献[5]实现了协议转换、数据转发、感知网络以及网关的管理和控制,但缺少对感知网络接入设备类型的丰富以及故障的处理[6];文献[7]针对MODBUS协议中远程终端单元(remote terminal unit,RTU)模式进行网关设计,只是通过仿真来进行验证,并没有对网关实际的功能和性能进行测试[8]。二是如何实现与云平台之间数据快速、安全、稳定的传输。传统网关和物联网资源平台的通信协议有超文本传输协议(hypertext transport protocol,HTTP)[9]和消息队列遥测传输协议(message queuing telemetry transport,MQTT)[10]。HTTP采用“请求-响应”方式进行通信,只有客户端发起请求,服务端才会做出响应,服务端不能主动向客户端推送数据[11],其缺点是缺乏实时性、采用明文通信,数据传输并不可靠[12]。MQTT是轻量级基于代理的发布/订阅的消息传输协议,其设计简单,易于实现[13],缺点是只适用资源有限的嵌入式设备,并且只能进行小数据链的传输、带宽低、安全性差[14]。
考虑到传感数据在物联网系统传输中的安全、高效和稳定,提出一种支持MODBUS的通用物联网网关架构模型,该模型中采用串口作为设备接入协议,使用标准传输控制协议(transmission control protocol,TCP)[15]作为网关与设备通信协议,应用标准WebSocket协议[16]作为网关与平台通信协议,实现设备根据统一标准接入网关并实现与平台之间信息双向实时交互,用实例来验证网关架构模型的功能和性能。
1 建立物联网平台架构
物联网网关作为连接设备与平台的枢纽,主要完成数据模型的建立与维护、协议的转换、设备的接入与控制以及数据同步等。网关主要依赖于物联网平台进行构建,其中物联网平台的架构如图1所示。
图1 物联网平台架构
图1中,物联网平台架构由浏览器、手机应用、云平台、网关及设备组成,是一种人机交互的实时用户浏览器/物联网云平台/物联网网关(browser/server/model,B/S/M)系统,其中底层设备将获取到的数据安全、高效、稳定的传入网关,网关对传入的数据做相应处理,然后将处理之后数据发往云平台,云平台具有强大计算及存储能力,对用户进行授权,用户通过浏览器、手机应用等来管理物联网资源。
2 构建MODBUS网关架构
设计一种通用的MODBUS网关架构模型,主要目的是完成对设备的接入、控制、协议转换、数据封装、模型同步以及数据的上传与下发。4层网关架构模型如图2所示。
图2 4层网关架构
图2中,将网关分为网关内部模块和设备接入模块。其中设备接入模块包含感知接口层和协议适配层,网关内部模块包含数据模型同步层和平台通信层,两模块之间采用TCP方式通信,网关与设备采用标准MODBUS协议进行通信,网关与平台采用标准Websocket协议进行通信。
2.1 感知接口层
感知接口层作为MODBUS网关最底层,通过相应硬件接口与物理设备连接,实现设备的接入及控制,感知接口层模块架构如图3所示。
图3 感知接口层模块架构
图3中,感知接口层包含设备驱动和控制两个模块。设备驱动模块主要用于实现设备的接入,设备控制模块完成对设备的具体相关操作,完成对设备的接入及控制后,再通过协议适配层进行调用。
2.2 协议适配层
协议适配层作为物联网网关架构中关键一层,主要完成协议转换,协议适配层模块架构如图4所示。
图4 协议适配层模块架构
图4中,协议适配层包含协议转化和数据包封装与解析模块。协议转换模块完成对感知接口层上传的数据与平台定义JS对象标记(javascript object notation,JSON)设备数据模型之间的数据格式转换。然后采用平台定义的统一数据帧格式对数据进行封装与解析,若为数据上传,则对上传数据进行封装并推送数据包到TCP客户端;若为数据下发,则接收TCP客户端下发数据,完成数据包的解析。
2.3 TCP模块
TCP模块作为连接设备接入模块和网关内部模块的桥梁,可实现设备与网关的全双工通信,TCP模块架构如图5所示。
图5 TCP模块架构
图5中,TCP模块包含客户端和服务器两部分,两者之间的通信采用套接字实现,该模块主要用于实现物联网平台统一数据帧的上传与下发。
2.4 数据模型同步层
数据模型同步主要是指平台网关和设备模型与物理网关数据模型保持一致的操作过程,即任何时刻只要平台模型发生变化,对应物理模型也要同步变化,并保持与平台模型一致性,反之亦然。数据模型同步包含3方面作用:一是接收平台下发数据完成平台模型到网关模型同步,并按协议转发平台数据到相应设备;二是接收设备上传数据,更新网关模型,上传网关模型到平台模型的同步包;三是监测设备上传的数据,完成网关域事件处理,并上传平台域事件包。
2.5 平台通信层
平台通信层完成网关与平台之间通信,采用Websocket协议实现网关与平台所定义的机器服务器双向实时通信,并完成网关设备的认证接入、身份验证、模型同步,并为计算设备推送/读取平台设备数据。
3 MODBUS网关实现
MODBUS网关,主要实现对支持该协议的底层各种设备的互联互通,以及与物联网平台之间的实时双向通信。MODBUS作为主从应答协议采用半双工方式通信,主从通信方式如图6所示。
图6 主从通信方式
图6中,主站向从站发送查询信息,从站通过读取主站的指令,然后根据指令回复主站相应数据。
MODBUS协议包含RTU、ASCII、TCP 3种模式,因为绝大部分MODBUS设备支持RTU模式,所以针对RTU模式对网关进行设计,该模式协议的帧结构包含6部分内容:起始位、设备地址、功能码、数据、校验以及结束符。其中起始位占3.5个字符,设备地址和功能码各占一个字节,数据占N个字节,校验占两个字节,结束符占3.5个字符,并且协议帧中各数据位间隔不超过1.5个字符时钟间隔。
3.1 感知接口层实现
感知接口层包含驱动和控制两模块,主要为了实现对MODBUS传感设备的接入及控制,其中MODBUS主从通信模块架构,如图7所示。
图7 主从通信模块架构
图7中,包含协议适配层、应用程序接口(application programming interface,API)及传感设备3部分。为使协议适配层方便调用,采用API对驱动模块和控制模块进行封装,其中控制模块对应功能模块,用于将平台下发的请求转化为对具体设备的一系列通信操作转化为平台所请求的结果;驱动模块对应串口模块、循环冗余校验(cyclic redundancy check,CRC)模块及读写模块,用于设备检测,完成对设备的接入、退出及系统检测。
驱动及控制程序流程如图8所示。其中包含3部分内容,一是对串口进行初始化并对设备进行超时检测;二是调用读数据功能块完成数据的读取,并通过校验对数据进行验证,验证无误后再对数据进行读处理;三是读数据处理完成后,调用写数据功能块完成对数据的写入,检测数据是否有错,若没有再对数据进行写处理。完成对程序的编写并实现对设备的相应操作。
感知接口层各模块具体实现过程如下。
步骤1 驱动。
①串口模块是采用淘宝cnpm镜像安装第三方serialport模块创建串口,匹配设备参数。
②CRC模块是用于将一帧除CRC校验之外的数据进行计算生成CRC校验码,用于数据传输检错,以确保数据正确读写。
③数据读/写模块是完成对寄存器中设备数据的读写操作,供设备控制模块调用。
步骤2 控制。
控制主要完成对MODBUS常用功能码的封装,实现对设备的相关操作,模块中每一个函数对应实现某一功能码特定功能,实际所需哪种,直接调用其对应函数即可。以03H功能码为例,用于读取保持寄存器中温/湿度值,调用封装好的函数readHoldRegisters(address,dataAddress,length,next)可获取设备数据,其中address代表从机地址,dataAddress代表寄存器中数据初始位,length代表寄存器长度,next表示进入下一个处理函数。本系统可实现8种常用功能码,具体接口函数如下。
01H:readCoilsState() 读线圈的状态
02H:readDiscreteState() 读离散状态
03H:readHoldRegisters() 读保持寄存器
04H:readInputRegisters() 读输入寄存器
05H:writeCoil() 写单个线圈
06H:writeRegister() 写单个寄存器
0FH:writeCoils() 写多个线圈
10H:writeRegisters() 写多个寄存器
图8 驱动及控制程序流程
3.2 协议适配层实现
协议适配层包含协议转换和数据封装与解析两个模块。协议转换完成MODBUS传感设备数据与平台定义JSON格式设备数据模型的格式转换,数据封装是将JSON数据模型按照物联网平台定义的统一数据帧格式进行封装。主要采用JSON格式数据,具体包含3种类型:设备认证、设备心跳和设备数据更新。各类型所对应的相关函数、JSON数据格式及具体功能如下。
(1)设备认证
①认证函数及JSON格式数据模型如下。
devCertificate(gid,did,userkey,function(err)
{//应答消息处理
})
sendDoc = {
msgType : string, // devCertificate操作
gwid : gid, //网关ID
devid : did, //设备ID
userkey : userkey //用户秘钥
}
②功能:设备发送认证请求消息到网关,网关认证通过后激活设备,设备处于on状态。
(2)设备心跳
①心跳函数及JSON格式数据模型如下。
devHeartBeat(did,function(err){
//应答消息处理
})
sendDoc = {
msgType : string, // devHeartBeat操作
devid : did, //设备ID
n : num //心跳包序列号
}
②功能:设备定时发送心跳消息到网关,用于检测设备在线状态。
(3)设备数据更新
①数据更新函数及JSON数据模型如下。
devUpdateData(did,doc,loc,function(err){
//应答消息处理
})
sendDoc = {
msgType : string, //devUpdataData操作
devid : did, //设备ID
v : num, //数据点值(温度)
time : string}
②功能:添加更新设备数据到JSON格式设备数据模型,并同步网关设备数据模型。
3.3 TCP通信实现
作为连接网关和设备之间的通信协议,TCP通信主要包含客户端和服务器的建立两部分内容,具体TCP通信实现流程如图9所示。
图9 TCP通信实现流程
TCP通信实现步骤如下。
步骤1 建立TCP客户端,通过使用socket套接字将协议转换所生成的3种类型的物联网平台统一帧格式的完整数据包发送到TCP服务端。
步骤2 调用node.js原生net模块[17],构建TCP服务器,监听来自TCP客户端事件,当客户端套接字连接到服务端时触发连接事件。通过socket监听事件[18],若监听到结束事件,删除网关列表对应网关;若监听到关闭事件,关闭网关;若监听到数据事件,对一帧完整数据包里的JSON数据的解析,将解析到的JSON数据上传至数据模型同步层,再作相应处理。
3.4 数据模型同步层实现
数据模型同步层包含数据上传和下发的同步,主要是指平台虚拟网关和设备数据模型与物理网关和设备数据保持一致的操作过程,具体实现步骤如下。
步骤1 设备数据上传,通过接收来自客户端的事件并做相应的处理,设备数据上传步骤如图10所示。
图10中,TCP服务端监听来自TCP客户端data事件所上传的设备JSON数据,通过判断数据类型来做相应处理。若为设备认证,经平台通信层发送消息到平台完成设备两次认证;若为心跳,经平台通信层发送心跳到平台;若为设备数据更新,同步更新设备数据到平台。
图10 设备数据上传步骤
步骤2 平台数据下发,通过接收来自平台的事件并做相应的处理,平台数据下发设备控制消息如图11所示。
图11 平台数据下发设备控制消息
图11中,网关通过客户端监听来自平台的事件。若监听到连接事件则与平台建立连接,连接成功后接收平台下发的数据到数据模型同步层,经TCP模块、设备控制和驱动模块转发平台数据到设备,完成对底层设备的控制操作;若监听到断开事件,则断开与平台之间的连接。
3.4 平台通信层实现
构建基于WebSocket协议的socket.io客户端将解析后的数据上传至云平台,实现数据模型同步更新。分别对解析到设备认证、心跳请求、设备数据更新3类消息类型作相应处理,具体处理流程如下。
步骤1 设备认证,通过两次握手实现,两次握手实现步骤如图12所示。
图12 两次握手实现步骤
图12中,网关和平台进行两次握手已达到设备的认证。首次握手,网关向平台发送网关和设备认证识别号,平台接收到数据后,生成验证随机数,发送到网关;二次握手,网关对随机数和用户秘钥一起加密,平台认证成功返回网关和设备模型到网关,两次握手结束。
步骤2 用设备心跳来判断网关从属设备状态,若为off,将其设为on,开启网关设备,通过socket.io将更新的设备状态上传至云平台。
步骤3 设备数据更新,通过利用Websocket协议中socket.emit方法将设备的数据发送至云平台,同步更新设备数据模型。
4 测试
测试包含功能及性能测试两部分,功能测试完成API接口测试和设备数据上传与平台控制命令下发测试;性能测试通过增加测试数据完成对整个系统的丢包率、时延等各种性能参数的测试。
4.1 功能测试
(1)API接口测试
调用API接口中相应函数,完成对传感器接入数据采集,温湿度数据采集如图13所示。
图13 温湿度数据采集
图13中,实现对传感器温湿度数据的采集,规定采集间隔为5秒。以其中一组数据为例,其中温度值为24.5℃,湿度值为48.3%RH,并增加实时采样时间。
(2)设备数据上传
①设备接入模块测试
测试之前需在本平台对设备进行注册,平台分配给用户相应网关ID(gwid)、设备ID(devid)和用户秘钥(userkey),全网唯一。设备数据上传之前需要先进行认证,若存在有多个设备接入,则将设备注册信息存放于单独配置文件,便于后期更新维护。以温度传感(AM2301)为例进行测试,设备接入模块测试如图14所示。
图14中,设备请求消息包含3部分:一是设备的认证请求,构造认证消息填充到JSON数据结构;二是设备的数据请求,将实时温度填充到JSON数据结构;三是设备的心跳请求,心跳间隔为10秒,用于检测设备是否在线。对构造的3种类型请求按照平台统一数据封装格式进行封装,最后通过TCP对封装好的buffer数据包进行上传。
②网关内部模块测试
作为网关内部模块,数据模型同步层及平台通信层接收来自传感设备3种类型数据并进行相应处理,网关内部模块测试如图15所示。
图15 网关内部模块测试
图15中,包含3部分内容:一是网关将接收到的认证消息发送到平台并接收到来自平台的认证随机数,然后对随机数和userkey采用MD5加密,重新组包发往平台两次握手结束,完成设备认证;二是设备温度数据测试,同步更新设备数据到平台;三是心跳测试,同步更新心跳到平台。
(3)平台数据下发
平台通过构造控制命令经网关发送到对应设备,完成对设备的控制操作,平台数据下发如图16所示。
图16 平台数据下发
图16中,包含两部分内容:一是网关解析来自平台buffer数据获取JSON格式设备控制命令;二是打开设备,获取设备温度数据,每5秒更新一次,更新后的数据会重新组包经网关发往平台实现数据模型的同步。
4.2 性能测试
采用Jmeter软件取1 000个样本,测试网关性能[19]。各性能参数与预期聚合报告对比如表1所示。
表1 聚合报告对比
表1中,对网关性能测试的参数主要包含平均响应时间、丢包率、错误率、时延以及传输速率5部分,通过聚合报告分析,对比得出,实测各类参数均符合预期目标范围,且网关通信良好。
测试结果,网关中各模块均以实现各自功能。网关能够实现传感设备的接入、控制以及数据的上传与下发,并且各种性能参数均符合预期设计的目标。MODBUS网关的构建实现了设备与平台之间的高效,稳定的双向通信。
5 结语
采用TCP服务器搭建技术、Socket.IO双向通信技术、Node.js技术以及MODBUS客户端搭建技术设计并实现了一种通用MODBUS物联网网关。首先,在云平台的基础之上构建网关的模型架构,将网关分为感知接口层,协议适配层,数据模型同步层和平台通信层4层方便进行实现;其次,从网关的模块化设计与通信系统的设计需求两方面出发,对网关通信系统设计,采用MODBUS、TCP与Socket.IO的实现路径,具体实现设备、物联网网关及平台三者之间的设备认证,数据上传与下发,设备心跳3大类实时信令的双向交互;最后,对网关功能和性能进行测试。通过测试表明,网关可实现对于支持标准MODBUS协议的各类传感设备的接入、控制以及数据的上传与下发,从而实现设备与平台之间的双向通信。通过性能对比,其丢包率、时延等各类性能参数均满足预期标准,且网关通信良好,基本满足设计要求。