李晓明 Thierno Gueye
摘 要:在物联网应用开发中,其软件系统的开发往往受制于硬件节点的开发进度和完善程度,造成开发进度缓慢,需求不断变更,软件测试维护困难等问题。如果能在开发初期迅速搭建一个物联网节点的模拟单元则能够极大促进系统的开发和完善。Arduino提供了一个开源的、通用的、简单易用的硬件平台,非常适合模拟物联网的硬件节点功能。本论文基于Arduino及其开发框架,提出了一个通用的物联网节点的模拟单元模型,基于该模型开发了智能靶的虚拟节點用于智能靶网管控系统的开发,开发实践表明该模型和方法可以快速实现物联网节点功能和数据的模拟,提高物联网系统的开发质量。
关键词:物联网;Arduino;软件框架
中图分类号:TP311.5 文献标识码:A
Abstract:Software development in Internet of Things (IoT) is often constrained by the development progress and the perfection of hardware nodes,resulting in slow development progress,changing requirements,and difficulties in software testing and maintenance.If an IoT node simulation unit can be built in the early stage of the development,it will greatly promote the development of the system.Arduino provides an open-source,universal and easy-to-use hardware platform,which is very suitable for simulating the hardware node functions.This paper presents a general simulation unit model of Internet of Things nodes.Based on this model,a simulated intelligent target node is developed for the intelligent targets control system.The development practice shows that the proposed model and software framework can be used to quickly realize the simulation of functions and the data of nodes in IoT system,and can improve the development quality of IoT system as well.
Keywords:Internet of Things;Arduino;software framework
1 引言(Introduction)
物联网(IoT, Internet of Things)的繁荣带动了大量的物联网应用的开发需求,一个完整的物联网应用开发包括基于智能硬件的节点开发,以及移动端、PC端的网络应用开发,即使是一个小规模的物联网应用也是如此。由于硬件开发的周期较长,网络应用软件的开发则相对较快,造成了软件测试受制于硬件开发进度的矛盾,特别是对于那些依赖于快速迭代的软件开发技术的项目,会因此而受到很大的制约。此外,由于软硬件开发通常由不同的团队完成,测试带来的人力和协调方面的成本也会很高[1]。
为了解决上述问题,在软件工程实践中,通常是采用标准化的物联网通讯协议或者数据封装来解耦硬件和软件系统之间的依赖。例如在物联网应用开发中广泛使用的MQTT协议[2,3],以及基于TLV的数据封装格式[4]等。但由于具体应用千变万化,物联网络结构复杂,感知层网络类型不统一等问题的存在,这种方法并不能很好地解决开发中的问题。半物理仿真的概念是在仿真回路中引入部分实物,即硬件在环的方法,进行控制系统的仿真[5],同样,在软件开发和测试过程中,借鉴半物理仿真的思想,引入通用硬件技术,对物联网节点进行模拟,可以很好地解决物联网应用开发过程中的矛盾。
Arduino是一种开源的通用硬件平台,具有开发简单,接口丰富,成本低廉等优点,非常适合作为物联网节点的模拟设备[6]。本论文将基于Arduino硬件平台,通过设计实现面向物联网应用的节点模拟软件框架和模型,并以靶网管理系统软件开发为应用背景,探讨如何实现智能靶节点的模拟,以降低软件开发的周期和成本。
2 软件系统建模(Software modeling)
2.1 框架设计
对于物联网应用来说,本质上是物联网智能节点与服务器之间的数据交换。由于物联网底层和互联网通常采用的协议不同,数据交换通常是基于一个物联网关实现[2,7]。物联网应用系统的典型结构模型如图1所示。
物联网传输协议有很多种,例如Zigbee、工业以太网、工业总线、NB-IoT等。对于Arduino而言,都有专门的模块和转接板对应于这些网络。通常Arduino与这些模块之间是通过串口进行通讯的,因此在设计基于Arduino的物联网节点模拟软件框架如图2所示。
该软件框架是从基于时间的嵌入式多任务框架[8]中扩展而来,其中方框表示软件模块/任务,而箭头表示调用关系。该框架包括以下内容:
(1)“定时器”模块提供了多任务的运行时间片参考。该定时器使用了Arduino板上单片机的硬件定时器,并利用定时器的中断服务来运行任务调度模块。
(2)“任务调度模块”实现了对任务的管理和执行。任务调度模块会在定时器产生的时间间隔内依次调用系统内的任务模块,这些任务模块实现了对输入的协议数据的解析,数据处理,模拟设备模型的执行,以及生成返回给服务器的数据。这些任务模块包括数据解析任务模块、协议处理任务模块、模拟设备任务模块和数据发送任务模块。其中模拟设备任务模块是为了模拟节点的功能,例如和执行控制、状态更新等。
(3)“数据通讯模块”实现了基于串口的与通讯设备的数据交换机制,针对不同的通讯设备,该模块的实现不同,主要封装了针对不同设备的通讯细节;“设备实体/状态模拟模块”实现了节点功能和状态的仿真,通常情况下是存储与被模拟节点相关的数据。
2.2 工作原理
该框架的工作原理如图3所示。根据程序流程分为Setup(设置)和Loop(运行)两个部分,前者主要完成调度器的初始化,后者主要负责执行任务和与通讯设备通讯。
首先,系统上电后执行Setup()部分,该部分主要是初始化任务调度器,并将需要运行的任务增加到任务列表中,并在最后启动任务调度器的执行,完成初始化的工作。然后系统进入运行状态,开始循环调用loop()部分。在这部分主要工作是(1)根据调度结果执行任务调度器中的任务,主要包括获取接收缓冲区的数据,根据具体的应用协议进行解析,然后根据解析的结果执行对应的操作,之后运行被模拟设备的控制功能,并更新被模拟设备的状态。最后根据应用协议的要求生成相应的数据并放入发送缓冲区。(2)处理串口应用层数据的收发。其主要操作是判断是否有串口数据需要读取,如有数据则根据具体设备的传输层通讯协议进行解析和接收,将收到的合法数据存入接收缓冲区内。然后判断发送缓冲区是否有数据需要发送,如有则将其按照传输协议写入串口中。除了loop()主线程外,还有定时器周期触发的中断线程,在该线程中主要是进行任务的调度[5]。
3 系统实现(Implementation)
3.1 Arduino的编程框架
Arduino的编程是采用一种类似Java和C的语言,本质是C++的语言,因此采用C程序设计的风格对上一节描述的框架进行了实现。
将整个框架功能分散在多个C和h文件中实现,其中TaskManager、Main等有具体的代码实现,并提供Jobs和Communication的头文件,供用户在进行具体测试应用时进行开发。
3.2 接收/发送缓冲区的数据结构
考虑到存在变长数据帧的情况,将通讯数据缓冲区长度设置为1024个字节,同时只存放一帧数据(即最新),并设置一个Ready变量解决读写的同步问题。即对于输入缓冲区通讯模块在写完完整一帧数据后将ready置1,对于输出缓冲区则只有在ready为1时才读取并发送。
4 应用:智能靶网控制系统软件测试(Application:Testing in target network control software system)
4.1 智能靶网控制系统结构及靶网节点功能
智能靶网控制系统是将智能靶机组合成网络,结合控制软件和触控面板,用于部队射击和战术训练的一整套系统。其核心是智能靶机组成的物联网络,其结构如图5所示。
智能靶与服务器通过Zigbee网络进行数据交换,操作人员可通过服务器控制靶的动作(举靶、倒靶),对靶进行编组,并进行成组控制,可控制多个靶和靶组按照指定的顺序进行动作等。智能靶同时可以通过Zigbee网络上传靶机状态数据,并且在射击时主动上报射击成绩等。由于靶機数量多、功能多,靶网数据流量较大(随着节点数目增多而增大),Zigbee通讯不稳定等问题会导致服务器端软件开发简单但调试工作量巨大。另外智能靶机成本高,体积重量大,移动困难,可用于调试的靶机数量不能满足开发需要,造成后期开发人力成本居高不下。
4.2 智能靶网节点模拟方案
为了解决上述问题,基于Arduino和物联网节点模拟框架,开发了智能靶网节点模拟单元,以一块Arduino板代替了图5中的“智能靶”硬件设备,降低了测试成本,提高了开发效率。
在图6中,Arduino板子上外接了一块XBee/Zigbee通讯模块用于和服务器通讯,并基于Arduino的I/O口模拟了报靶、故障注入、靶机编码等触发功能和立倒状态指示灯等显示功能。其中状态指示灯利用的Arduino的板载LED代替,这样几乎就没有什么外接设备。
4.3 具体模块实现
(1)数据通讯模块
数据通讯模块实现有两种方案,一种是基于XBee提供的Arduino开发库开发[9]。使用该库使得Arduino与Zigbee设备的通讯极大简化,并使得通讯更为可靠。另外一种是使用XBee提供的透传模式[10]。在透传模式下只需要根据应用协议检测数据的帧头并按长度接收即可。不过透传模式无法对XBee设备进行更多的控制,牺牲了灵活性。本系统中使用XBee的透传模式,根据应用协议,服务器发送的数据是以0x55开头,固定长度的数据包,根据该特点就可以实现数据通讯模块的接收。发送数据由于是已经按照应用协议编码之后的数据,因此可以直接发送。
(2)协议解析与处理
根据靶网通讯协议,节点与服务器之间的通讯主要包括以下过程,如图8所示。其中每一行代表一条通讯协议。其中协议1—4需要按照流程顺序执行,而协议6—8则根据需要随机发起,协议5则为周期性发送的状态数据。协议解析与处理模块主要工作流程为:a.解析协议,判断其为协议1—8中的哪种;b.执行对应协议的命令动作;c.对于NETINIT和SETID协议,生成应答数据帧并存入发送缓冲区。
(3)设备模拟模块
设备模拟模块主要存储了靶机的状态(ID、服务器节点MAC地址、立/倒状态、配置参数、分组编号、模拟的GPS数据等),并在立靶/倒靶命令时加入时延,模拟物理靶机执行所需的时间。设备模拟模块根据协议解析模块收到的命令和数据进行相应的虚拟动作,并根据状态变化发送到I/O口显示靶机状态。
(4)数据发送模块
根据协议要求,靶机节点需要定期发送状态信息给服务器,该功能由数据发送模块实现。数据发送模块根据设备模拟模块的数据进行封装后写入通讯模块的发送数据缓冲区。该模块按照一定的频率(默认执行周期为5秒)由任务调度器调度执行,同时如果发送数据缓冲区已有其他数据则暂缓一个周期的数据发送。
以上各个模块通过全局数据变量(定义在Main模块中)进行之间的数据交换。
4.4 测试
按照上述设计编写程序后下载到Arduino上执行。然后在计算机上连接XBee的模块,搭建测试系统如图7所示,通过串口调试助手发送和接收测试数据。上位机的XBee模块工作在API模式下,因此发送和接收数据时候包含了XBee本身的数据帧结构。以下为网络初始化指令(NETINIT)和状态指令(STATUS)为例说明测试结果。
图9显示了发送网络初始化NETINIT指令数据,以及收到的应答数据。发送区发送的是网络初始化指令(0x55后的0x01),收到的是应答指令(接收区两个连续的0x01,第一个0x01表示NETINIT_READY,第二个表示靶机内部保存的ID,此例为1)。
报靶指令是将IO口(2)与Arduino电源相连,触发高电平,模拟子弹射中靶板的状态,此时Arduino将模拟的命中数据发送给服务器。其中0x06表示SHOOT指令,0x01为模拟的靶ID,0x0C代表命中区域,0x09代表命中环数。
5 结论(Conclusion)
本文提出了一种以Arduino作为硬件载体模拟物联网系统的节点功能及其通讯的模型,用于物联网应用软件的测试,采用半实物仿真的思想,让软件测试过程更接近真实场景,从而加速软件开发的进程,提高物联网应用软件系统的开发效率,降低开发成本。所开发的模拟节点获得的经验更可以用于指导真实物联网智能硬件节点的设计和开发。本文提出了基于Arduino的物联网节点的模拟软件框架和实现方法,该软件框架和实现在智能靶网控制软件中进行了应用,所获得的模拟靶机硬件能够真实地模拟靶机的功能和交互,为靶网控制软件的快速迭代发挥了重要作用。
目前该软件框架以源码的方式应用在开发中,在将来可以将其封装成Arduino的库,以库的形式集成在应用中,这样可以进一步简化开发,实现代码分离。
参考文献(References)
[1] Antero Taivalsaari,Tommi Mikkonen.A Roadmap to the Programmable World:Software Challenges in IoT Era[J].IEEE Software,2017,34(1):72-80.
[2] 赵丹,谌建飞,邓敏,等.基于MQTT的步进电机远程控制方案实现[J].测控技术,2018(6):126-129.
[3] 谭方勇,王昂,刘子寧.基于Zigbee与MQTT的物联网网关通信框架的设计与实现[J].软件工程,2017(4):43-45.
[4] 朱江彦,吕霖,向晋祥,等.基于BER-TLV报文格式的航标与水位动态数据交换技术[J].中国水运,2017(7):81-87.
[5] 蔡安江,蒋周月,郭师虹,等.半物理仿真技术工业应用现状及发展趋势[J].航天控制,2018(6):52-56.
[6] Anand Nayyar,Er Vikram Puri.A Review of Arduino Board's,Lilypad's & Arduino Shields[C].2016 3rd International Conference on Computing for Sustainable Global Development,New Delhi,2016:1485-1492.
[7] 陈琦,韩冰,秦伟俊,等.基于Zigbee/GPRS物联网网关系统的设计与实现[J].计算机研究与发展,2011(S2):367-372.
[8] Micheal J.Pont.Patterns for time-triggered embedded system[M].Addison Wesley,2001.
[9] Andrew Rapp.Arduino library for communicating with XBee radios in API mode[EB/OL].https://github.com/andrewrapp/xbee-arduino.
[10] Digi International Inc.XBee/Xbee-PRO S2C Zigbee RF Module User Guide[EB/OL].2018.