一种分布式无线传感器节点监控系统设计
2019-02-22孙晓阳苏新彦姚金杰
孙晓阳,苏新彦,姚金杰,韩 焱
(1. 中北大学 信息与通信工程学院,山西 太原 030051;2. 中北大学 信息探测与处理技术重点实验室,山西 太原 030051)
使用分布式测试系统,通过在不同位置布设传感器,可以得到冲击波所造成的伤害随距离的变化规律,直观地反映出地下爆炸目标的毁伤情况,为地下毁伤评估提供数据支持[1]. 近些年,研究人员为了对地下爆炸产生的冲击波等参数进行测试,开发了很多分布式微震监测系统,如南非的ISS微震监测系统、波兰的SOS微震检测系统、潘一山等研制的矿震监测系统和煤科总院中国矿业大学设计的井下爆破震源实时监测与定位系统等[2]. 这些系统的设计绝大多数是针对深层的地下爆炸冲击波参数测试所设计的,针对大区域的浅层地下爆炸毁伤效能参数获取所进行的相关研究和系统设计较少,因此本文设计了基于LabWindows/CVI的远程无线传感器节点监控系统.
在靶场内进行分布式地下毁伤效能测试的实施现场一般具有较大危险性,不适合工作人员在现场进行指挥控制; 同时使用分布式系统进行参数测试时对传感器节点的同步性要求比较严格,因此需要针对分布式测试系统开发远程的无线传感器节点监测软件. 选择在测量控制领域常用的软件LabWindows/CVI,用以保证软件的灵活性、稳定性和界面友好性.
本文主要在软件设计实现过程中提出了基于多线程的多传感器节点同时连接和控制方法; 针对同时接收传感器节点数据的正确性,采用线程安全队列机制,完成了控制协议设计,实现了具有数据预处理功能的LabWindows和MATLAB混合编程技术.
1 系统总体设计
分布式传感器节点监控系统由硬件系统和软件系统组成. 硬件系统主要包括:传感器节点、汇聚节点、无线设备和主控站4部分,如图 1 所示. 本文主要针对安装在主控站计算机的软件系统进行研究.
图 1 分布式节点布设示意图Fig.1 A schematic diagram of distributed nodes
设计软件按照从顶至下的原则,在软件的界面交互性和系统开放性两方面进行系统的总体设计. 借助LabWindows良好的人机交互性能,在软件操作过程中给出必要的操作提示和硬件响应信息,使软件界面更友好; 为了使软件更加灵活、便于修改,采用模块化设计,将不同功能划分为不同的模块,各模块通过接口相互组合,保证了软件的可扩展性、完整性和易维护性,组成结构如图 2 所示.
图 2 软件结构图Fig.2 Structure of the software
在软件操作过程中,首先进行软件的初始化,包括注册TCP服务器端口和开放UDP连接端口,然后等待连接; 已开启的传感器节点开始连接到上位机软件,上位机软件每接收到一个新的传感器连接请求则开启一个新的线程来实现64台传感器节点的同时连接和同步控制; 等待连接稳定后,由上位机发送自检指令给传感器节点,传感器节点自检正常后发送上行指令给上位机软件,上位机软件提示可以进行下一步操作,由用户根据不同需求对传感器节点进行参数配置、参数信息显示和文件信息显示等操作; 待到数据采集完成后开始进行远程的数据回传操作,通过与MATLAB混合编程对数据进行预处理,最后将处理后的波形保存并显示在用户使用界面. 软件操作流程如图 3 所示.
图 3 软件操作流程图Fig.3 Flow chart of the software
2 实现方案
在基于LabWindows/CVI的无线传感器节点监测软件的实现过程中,主要包括多线程、线程安全队列、指令协议、Matlab混合编程等设计.
2.1 控制流程多线程设计
针对LabWindows/CVI中多线程块模型相同块内资源共享、执行速度快等优点[3],软件中利用LabWindows/CVI提供的线程池实现多线程的创建主要用于同时同多个传感器节点保持连接,为了应对分布式测试组网数据发送的突发性和同时性,上位机软件选择每建立一个TCP连接就创建一个新的线程来与对应的传感器节点进行通信,多线程实现通信的流程如图 4 所示.
图 4 线程内流程图Fig.4 Flow chart of the in-thread
上位机软件初始化过程中,打开TCP连接之后,每次收到连接请求(TCP_CONNECT),都会使用CmtScheduleThreadPoolFunction函数来利用默认线程池创建一个新的线程,因为新建的线程为辅助线程,而辅助线程的函数和主线程的调用是同时执行的,因此可以保证主线程能够一直监听TCP连接内的事件并及时做出响应. 在监测到有数据请求的事件(TCP_DATAREADY),即传感器节点向上位机发送数据的事件发生后,会使用PostDeferredCallToThread函数来调用指定的线程进行数据分类接收工作.
创建的每个新线程,在线程不释放的前提下一直运行ProcessSystemEvents函数,当检测到有使用PostDeferredCallToThread函数调用指定线程的事件发生时,会在发生调用事件的线程中调用指定线程,从而完成多传感器节点数据同时回传的操作.
如果发生了传感器节点掉线的情况(TCP_DISCONNECT),在主线程中就会检测到TCP连接断开事件,从而结束断开的线程,同时清除相关的内存. CmtWaitForThreadPoolFunctionCompletion函数使得主线程等待线程池函数结束后再退出,保证辅助线程使用的库能够被正确释放. 由于新线程的建立是使用CmtScheduleThreadPoolFunction函数,因此在释放的时候需要调用CmtReleaseThreadPoolFunctionID函数,在不影响当前正在执行的进程函数条件下彻底结束释放.
在本上位机软件设计过程中有大量的线程在同时执行,存在同一个变量同时被多个线程同时访问的情况,因此需要使用线程锁对这些变量进行保护,防止出现逻辑的错误[4,5]. 使用线程锁需要在程序初始化的时候调用CmtNewLock函数来创建一个保护数据的线程锁的集合,利用其返回的句柄调用指定线程锁. 访问锁保护的数据和代码前,必须调用CmtGetLock函数来获取线程锁,访问结束后,必须调用CmtReleaseLock函数来释放线程锁. 需要特别注意的是可以在同一线程中多次调用CmtGetLock函数,但每次调用都需要调用CmtReleaseLock函数来结束调用. 在程序退出时,也必须调用CmtDiscardLock函数来释放由CmtNewLock函数创建的线程锁资源.
2.2 控制协议设计
指令发送的过程是:上位机软件先将控制指令发送给汇聚节点,然后由汇聚节点将指令转发给指定传感器节点,汇聚节点如图 5 所示. 为了保证上位机软件与远程传感器节点的有效通信,上位机软件通过具体分析传感器节点的任务,设计了通信双方的通信控制指令协议.
图 5 汇聚节点Fig.5 Aggregation nodes
1) 由上位机软件给传感器节点发送控制指令. 根据传感器节点需要,由上位机软件发送控制指令,完成上电、自检、参数配置、参数回传、文件信息回传、数据采集和数据回传等功能,设计下行控制指令数据格式如表 1 所示.
表 1 下行控制指令数据格式
由上位机软件发送给传感器节点的指令共 9 B,说明如下:
帧头:占据2 B.
指令对象:占据1 B,用于指定指令对象是汇聚节点还是分布式传感器节点. 如果代表汇聚节点,则传感器节点选择、指令类型和二级操作码为无效指令.
传感器节点选择:占据1 B,0xff表示发送给所有的传感器节点,范围是0x00~0xff,是传感器节点的编号.
指令类型:占据1 B,表示需要传感器节点返回的是状态反馈信息还是数据信息.
操作指令:占据2 B,表示上位机软件发送给传感器节点的动作信息.
二级操作码:占据2 B,表示指令到达汇聚节点后不做任何处理,直接将指令转发给分布式传感器节点,主要针对传感器节点的三轴信息.
例如给传感器节点发送开始采集命令,控制指令为:0xeb90,0x02,0xff,0x01,0xa900,0xb120.
2) 分布式传感器节点回传数据格式. 传感器回传数据到上位机必须先把数据发送给汇聚节点,然后由汇聚节点统一将数据发送给上位机软件. 分布式传感器数据节点的数据有以下3种:参数配置信息(包括采样通道数、采样频率和采样长度等,共64 B)、传感器节点三轴信息([(HMC5883地磁)X+Y+Z]+[(ADXL345加表)X+Y+Z]+结束码0XFE共31 B)和传感器采集的数据(每次配置不同,数据量不同). 因此汇聚节点向上位机软件发送的数据有:汇聚节点工作状态(包括各开关状态和命令响应情况)、汇聚节点信息(参数信息和文件信息等)以及转发传感器节点数据(传感器节点姿态信息和采集的数据等).
可以将以上数据分为两类:信息量大的冲击波信号模块和信息量小的冲击波信号模块以外的其他模块.
读冲击波信号模块时的数据格式如表 2 所示.
表 2 冲击波信号模块数据格式
由于汇聚节点控制模块所选用ARM芯片的限制,汇聚节点每次最多能够向上位机发送 2 014 B 的数据. 但是由于在实际试验中,汇聚节点的数量较多,网络带宽有限,为了保证不发生网络拥塞[6]而造成数据丢失,冲击波信号模块每次发送515 B数据.
汇聚节点号用于标记冲击波数据来源于众多汇聚节点中的哪个汇聚节点; 因为数据量大,无法一次将所有的数据发送给上位机,在分次数发送的过程中为了保证上位机能够按照顺序存储数据,需要对数据帧进行顺序的标定,由数据帧号完成; 最后冲击波模块的有效数据放在末尾发送.
2.3 MATLAB混合编程设计
在小区域的地下震动波传播过程中,由于传输介质自身的复杂性、不均匀性,震动波的反射和折射等影响[7],使得震动信号中有用信号的能量较弱; 传感器节点的不稳定性使得信号的信噪比较低. 诸如上述因素的影响,使得震源定位精度降低. 因此,为了保证准确定位,需要对采集的数据进行滤波降噪、有效数据提取等操作.
基于MATLAB成本较低、计算灵活、使用方便,且比起Active X技术等,动态链接库只需要在目标主机安装运行库就能使用等优点,本文采用基于动态链接库调用的LabWIndows/CVI同MATLAB混合编程方法[8-10].
MATLAB版本的选用:上位机软件开发所使用的LabWIndows/CVI版本为32 b 2017版,因此选用的MATLAB为32 b 2012版.
在MATLAB中生成动态链接库,选择好要进行编译的m脚本文件,然后选择编译器,此处选择Microsoft Visual C++ 2010 编译器,通过设置.mcc命令的选项,最终除了会生成C/C++源代码、.exe可执行文件和mex文件之外还会生成必须添加到LabWIndows/CVI工程文件中的.lib文件和.dll文件[11].
在使用LabWindows/CVI调用MATLAB动态链接库时,首先将.lib文件、.dll文件和.h文件添加到工程文件内,除此之外,还需要将MATLAB库函数中的mat.h, matrix.h, mclcr.h, tmwtypes.h, wchar.h和win.等文件同时添加到工程文件内进行调用,需要注意的是在MATLAB中用到的函数不同,需要添加的函数库也有所不同.
LabWindows/CVI已ANSIC C为核心,以C语言为基础编程,同MATLAB所使用的数据格式不相同,因此最需要注意的是在LabWindows/CVI同MATLAB之间传递数据的操作,这里可以使用C语言定义的参量传递定义,主要函数使用如表 3 所示.
表 3 数据传递函数
以上函数基本可以完成上位机软件的数据传递操作,对于最终要传递到MATLAB中的数据,数据类型一般定义为mxArray *,同时,为了保证能够实现有效传递,一般都会使用void *memcpy(void *dest, const void *src, size_t n)函数通过内存复制的方式进行赋值. 在成功调用MATLAB动态链接库后,可以使用mxGetPr函数,通过指针读取最终的处理结果.
3 软件测试
实验进行场所位于靶场内80 m×60 m的空旷地区,上位机控制软件位于距离实验场3 km远的实验总部,传感器节点布设现场如图 6 所示.
实验能够同时对16个汇聚节点进行控制,从而实现对64个传感器节点的控制和数据收发. 在实验过程中,汇聚节点和传感器节点没有发生误操作的现象. 图 7 为传感器节点姿态信息回传的结果.
图 6 试验现场Fig.6 The test site
图 7 控制部分结果图Fig.7 The result of control part
回传的数据可以通过上位机软件先进行预处理,处理结果有效实现去噪,波形较为平滑,如图 8 所示.
图 8 回传数据处理结果Fig.8 Return data processing results
通过对同一节点的同一段数据进行比较,如图 9 所示,经过预处理的波形比较平滑,能够有效用于地下毁伤效能测试的评估中.
图 9 处理前后数据比较Fig.9 Data comparison before and after processing
4 结 论
本文设计的基于LabWIndows/CVI无线传感器节点监控系统,使用多线程技术实现了对传感器节点的同步控制,软件的数据传输和存储能够满足要求; 通过对指令数据收发协议进行设计,实现了对汇聚节点的有效控制,完成了传感器节点的数据收发操作; 通过对MATLAB动态链接库的调用,实现了脱离MATLAB庞大的运行环境与MATLAB的混合编程. 同时上位机软件基于模块化设计,结合开发平台的开放性和兼容性,使得本软件具有可扩展性和二次开发性. 本系统可广泛应用于靶场测试、震动监测等分布式传感器网络监测领域.