周 超
(铜陵学院 电气工程学院,安徽 铜陵 244000)
作为高校开展教学科研工作的重要场所,当前的实验室管理普遍采用非自动化、以纸张文件为基础的传统方式,管理人员定期巡视记录实验室环境工况,效率低下。针对上述不足,基于嵌入式技术和无线网络设计多终端实验室监控系统,采用ARM微处理器和各类传感器采样处理实验室环境信息和控制指令,应用无线网络实现信息传输[1-6]。为提高监控系统的可靠性,提供了多终端监控方式,管理人员可以通过浏览器或上位机实时监控实验室环境,发生异常时会进行声光报警并通过短信方式主动通知用户。该系统简化了实验管理人员的重复性操作,提高管理机制的安全性,降低意外带来的经济损失。
系统包括采集前端、数据处理中心和客户端3个部分,如图1所示。① 采集前端用于采集各类信息,包括实验室环境信息(温湿度、光照等)和辅助信息(三轴加速度等),前端将上述信息处理打包后通过无线网络传输给处理中心,同时接收来自处理中心的控制指令。采集前端具备远控模式和自动控制模式两类,默认情况处于自动控制模式,此时采集前端自行对环境信息进行监控,如温度值偏高则启动风扇设备调节温度,超出阈值则通过LED、蜂鸣器等做声光报警。当接收到控制指令时,切换到远控模式。为提高系统的稳定性,需要考虑处理中心发生故障的情况,若在远控模式下采集前端不能正常接收指令则自行切换到自动控制模式;② 数据处理中心,包括基于EXYnos4412处理器的FS4412控制板和PC机,接收采样数据存储并对采样前端设备进行控制,采用了两种策略保证了数据存储的可靠性:一种是存储到移植Linux系统并搭建了嵌入式Web服务器的FS4412控制板数据库中;另一种是存储到运行LabVIEW上位机程序的PC机数据库中。一旦出现异常情况,处理中心通过GPRS模块主动向用户发送短信通知;③ 客户端,提供了浏览器访问Web服务和LabVIEW上位机程序的监控方式。
2.1.1 硬件设计
数据采集前端实现环境信息和辅助信息采集、数据打包传输和控制指令执行等核心功能。采集前端结构如图2所示。硬件资源及功能包括:① 采用DHT11的温湿度采样电路,该设备采用单总线方式通信,时序要严格参照datasheet进行。由于总线上传输的数据总是上一次的采样值,所以要连续读两次才能获得当前的温湿度信息;② 采用MMA7455L的三轴加速度采样电路,通过测量空间加速度信息,可以有效监测地震等突发事件;③ 采用ISL29003的光照采样电路,该光敏器件内部集成了15 bit的ADC,减小了电路元器件的使用。三轴与光敏传感器都采用IIC总线传输数据,IIC地址分别是0X1B和0X44,LPC11C14的PIN15、PIN16引脚是用于IIC通信的SCL与SDA,传输数据占一个字节;④ 采用ESP8266的WIFI通信电路;⑤ 隔离电路,为提高系统的可靠性,环境传感器采样端与处理器间加入隔离电路提高系统的可靠性,采用基于iCouple技术的ADuM5404数字隔离器。电路设计时要考虑抑制噪声与纹波的影响,在ADuM5404的VDD1、GND1和VISO、GNDISO间至少要并联2个电容,推荐采用0.1 μF和10 μF,其中0.1 μF使用陶瓷电容,因为具有较低的ESR,并且在画PCB的时候,陶瓷电容到电源走线的长度不要超过2 mm;⑥ 摄像头电路,摄像头采用OV7670,每个像素占2个字节,图片分辨率240*320,每幅图片占用的空间大小为240*320*2= 153 600字节。摄像头模块中采用的FIFO型号为AL422B,其容量384 K字节,满足空间要求[7];⑦ 核心处理器及外围电路,处理器采用基于ARM Cortex-M0内核的低功耗、低成本的32位处理器LPC11C14,最高主频可达到50 MHz。其在数据处理、功耗和抗干扰性等方面能够满足前端数据采集的需求;⑧ LED和蜂鸣器电路(用于报警指示);⑨ 风扇电路等。
图1 实验室监控系统结构图 图2 采集前端硬件组成
2.1.2 软件设计
采集前端与处理中心之间的数据交互通过无线网络实现,程序流程如图3所示。
(1)上电初始化采集前端的硬件资源,如GPIO、UART、SPI等。配置中断处理函数、定时器等,默认采集前端处于自控模式。
(2)初始化完成后进行轮询判定,在没有接收到来自无线网络的控制指令(外部中断)时,执行各类信息采集、打包传输等操作:对温湿度信息,微处理器发出一次开始信号,传感器DHT11响应后从低功耗状态切换到高速状态,采样传输40位数据,触发下一次操作;对光照信号,初始化IIC总线和ISL29003引脚,因为PIN15和PIN16默认是GPIO的P0.4和P0.5,所以初始化时要设置IOCON寄存器,之后设置敏感值并读取光照数值。 自动控制模式下的采集前端自发监测环境数据,在发现异常时启动风扇或蜂鸣器等设备。
(3)当接收到来自无线网络的数据时,中断处理函数接收控制指令并执行操作,采集前端切换到远程控制模式,数据采集正常进行。
(4)为保证监控系统的稳定性,需要对可能发生的异常进行估计并提前设计好应对措施。考虑到处理中心可能发生故障的情况,当采集前端在30 s内不能正常接收控制指令时,自行从远程控制模式切换到自动控制模式,对实验室环境信息进行监测并判定是否异常以及是否运行风扇、蜂鸣器等设备。
2.2.1 FS4412控制板
FS4412移植并运行Linux系统,功能如下:① 移植SQLite存储来自采样端的数据;② 向采样端发送控制指令;③ 对采样信息进行判定并进行报警指示;④ 移植BOA构建Web服务器,向客户端提供Web服务;⑤ 当发生异常状况,通过GPRS向用户发送短信。程序核心包括数据接收、数据分析线程和消息处理线程等。数据接收线程接收来自无线网络的数据(消息头ST+正文),根据ST判断消息类型:A表示辅助信息,E表示环境信息,为避免数据丢失,读取正文时要睡眠500 ms。之后插入到数据缓存链表,唤醒数据分析线程,判断缓存链表是否为空,不为空则表示有新的数据,读取链表,如果是环境信息且数值没有超出阈值,加入数据库链表并唤醒数据库线程更新数据库。如果环境信息异常则唤醒短信发送、蜂鸣器等线程实现报警提示,数据接收与分析线程流程如图4所示。消息处理线程处理来自客户端的控制指令,用户通过客户端控制风扇、蜂鸣器等设备,修改温湿度数据的阈值。这些控制指令首先送入消息队列,本文定义了风扇控制、LED控制、蜂鸣器控制、阈值设置等消息类型,Switch函数对不同的消息类型做不同处理,消息处理线程流程如图5所示。
图3 采集前端程序流程图 图4 数据接收与分析线程流程图
(1)SQLite数据库
本文应用场景下的数据存储具备如下特点:① 存储数据量不大,需要频繁读/写磁盘文件,未来有数据移植的需求;② 没有超大数据集、高流量和高并发访问的需求。SQLite是一种类似微软Access的文件型数据库,这类数据库的特点是以文件形式表示数据库,不需要额外配置,备份操作简单。主要API有sqlite3_open、close和exec,操作简单,满足数据库存储的需求,所以采用SQLite提供数据存储功能。SQLite移植较为简单,首先去官网下载解压源码(sqlite-autoconf-3070602),本文采用一台运行Ubuntu的PC进行编译工作。进入目录创建sqlite_insatll目录,打开makefile文件,找到DPACKAGE_STRING行,删除空格并保存,执行make make install,编译后的sqlite3文件保存在sqlite_install目录中,把sqlite3拷贝到数据中心Linux系统的/usr/bin目录下,同时把PC端/usr/lib库中的libsqlite3.so.o和libsqlite3.so.o.8.6两个文件也拷贝到数据中心Linux系统的/usr/lib目录下,执行copy命令时要加-arf参数,完成移植。数据库线程流程如图6所示。主程序初始化后启动数据库线程,创建存储针对数据库操作的数据库链表,之后进入循环等待状态,接收到唤醒信号则开始数据库链表的判定操作,如果链表头的内容为空,则再次进入等待状态,等待下一次的唤醒。如果链表头的内容不为空,则读取表头内容并调用相关函数完成SQLite操作,完成后释放节点空间,如此循环。sqlite_thread是数据库线程,task_sqlite函数用于判定节点信息并执行相关操作。
(2)Web服务
BOA是一款代码只有约60 KB的单任务Web服务器,很适合嵌入式系统开发,支持CGI,能够fork CGI进程执行客户端请求,实现交互功能。Web服务原理如下:管理人员在客户端打开浏览器连接到处理中心的Web服务器,这时打开了一个Socket虚拟文件,通过Socket以GET或POST的方式基于HTTP协议向Web服务器提交请求。Web服务器接收并分析请求,处理不同的事务,返回请求的相关线程或页面文档。下载解压源代码,进入src目录,执行./configure生成makefile,采用flex和yacc进行make编译,执行Arm-non-linux-gnueabi-strip命令瘦身,完成编译。为保证Web服务的正常启动,需要修改boa.conf文件中的Group、User、ScriptAlias、DocumentRootWeb、ServerName和AccessLog等参数。之后把编译好的boa文件拷贝到数据中心Linux系统的/etc/boa目录下,把Ubuntu的mime.types文件拷贝到数据中心Linux系统的/etc目录,相关页面文件拷贝到www目录下,启动boa线程提供Web服务。
图5 消息处理线程流程图
图6 数据库线程流程图 图7 短信流程和效果图
(3)Wi-Fi无线网络
处理中心与客户端通过Wi-Fi无线网络连接,无线网络配置步骤如下:①移植驱动,采用Marvell公司的8686芯片,从官网下载sd8686.bin和sd8686_helper.bin文件,拷贝到linux/fireware目录下,执行make menu config配置内核,make zImage编译内核;②移植wpa_supplicant,下载wpa_supplicant和openssl的源代码,编译移植openssl和wpa-supplicant,其中openssl需要wpa_supplicant提供的openssl-版本号-tls-extensions.patch补丁文件,编译后的wpa_cli和wpa_supplicant文件拷贝到bin目录下;③无线连接,编写域名和无线配置文件resolv.conf和wpa_psk_tkip.conf,创建wpa_supplicant目录,执行ifconfig配置IP地址、route add配置网关、wpa_supplicant连接无线网络,wpa_cli status查看网络连接状态。
(4)短信发送
GPRS[8-9]模块通过AT指令实现短信发送,具有文本和PDU两种模式,前者实现容易但仅支持英文文本,所以选择支持中文文本的PDU模式。操作流程和效果如图7所示。① 硬件初始化,这里用到串口引脚,发送AT指令测试连通性;② 模式设置,选择PDU(AT+CMGF=0),设置信息长度(AT+CMGS=信息长度);③ 发送短信,包括中心号码段、收信方号码段和信息段3部分内容。中心号码段是0891683100501505F0,其中91表示国际化,683100501505F0的奇偶位反转得到8613000551500,86表示中国地区,13000551500是中心号码,如果号码位数是奇数要在末尾加F补齐,所以13000551500就变成了683100501505F0,加上91字段变成91683100501505F0,共计16位,除以2得8,8的16进制表示是08,最终得到了0891683108501505F0。收信方号码段是1100+0D91+ 68XXXXXXXXXXXX+000800,1100和000800是收信方号码段的固定前缀与后缀,68XXXXXXXXXXXX与上述中心号码段的处理是一样的,表示的是短信的接收手机号。0D91中91表示接收方设备是手机,0D是十进制的13,因为86XXXXXXXXXXX接收手机号是13位。最后是以Unicode编码的信息段,也就是在手机上看到的短信内容。比如短信内容为“1号实验室温度异常”,Unicode编码为36位的003153F75B9E9A8C5BA46E295EA65F025E38,除以2得18,18的16进制表示是12,所以信息段最终编码为12003153F75B9E9A8C5BA46E295EA65F025E38,3部分内容组合完成PDU模式的短信发送功能[10]。
2.2.2 PC机
考虑到本文对数据存储的需求比较简单,且实验室PC机性能较为落后,采用SQLite数据库,这里涉及到两种针对数据库的操作:采样数据在SQLite的存储和LabVIEW监控程序对数据库的读取。因为Python内置了sqlite3,所以基于python实现SQLite的数据存储。
(1) Windows端SQLite配置应用
不同于嵌入式应用场景,实验室已有PC机安装了WIN7 32位系统,SQLite配置应用流程如下:① 数据库安装:在sqlite.org官网下载SQLite安装包,分别是precompiled binaries for windows和shell压缩包,前者对应不同位的windows版本。创建一个目录文件夹把解压后的sqlite3.def、sqlite3.dll和sqlite3.exe,将三个文件放到同一个目录下。② 配置测试:将sqlite3.exe的目录途径添加到环境变量PATH中,在cmd环境下输入sqlite3.exe测试。③ 新建数据库与表:sqlite3.命令用来创建新的SQLite数据库:sqlite3 DatabaseName.db该文件将被SQLite引擎用作数据库,创建成功后将提供一个sqlite>提示符。一旦数据库被创建,可以使用.database命令检查是否在数据库列表中。CREATE TABLE语句用于创建表,tables 命令来验证表是否已成功创建。④ 对数据表的操作:sql语言。
(2)数据存储(python)
PC机接收无线网络传输来的环境信息并存储到SQLite中,步骤如下:① 连接数据库:导入sqlite3模块,调用sqlite3的connect方法连接数据库;② 创建表:创建cursor变量,调用execute方法,传入create语句创建数据表,并运行commit方法执行操作;③ 网络监听:导入socket模块,设置好IP地址和端口号,创建socket变量,调用bind和listen方法绑定网络地址、端口和最大连接数。之后调用accept和recv方法即可接收来自网络的数据;④ Insert操作:执行execute(insert into表名)将数据存储到SQLite中。
LabVIEW需要借助其他方式才能进行数据库操作,常用的有:① NI官方提供的LabVIEW sql toolkit工具包;② 微软的ActiveX与ADO控件,基于sql语言对数据库进行访问;③ C++编写的dll(Dynamic Link Library)库;④ labsql等插件实现访问。本文因选择了SQLite数据库,采用第3种方法。Sqlite3提供的sqlite3.dll内封装了数据库操作VIs:sqlite3_open.vi、sqlite3_prepare.vi、sqlite3_step.vi、sqlite3_finalize.vi和sqlite3_close.vi,步骤如下:首先打开数据库文件,声明要执行的SQL操作,这里是读取操作,之后执行声明的SQL语句,操作完成销毁SQL声明并关闭数据库。sqlite3.dll调用过程中需要注意如下两点:CLF(Call Library Function)节点配置时,考虑到如若调用函数返回时间较长可能导致LabVIEW不能执行线程中的其他任务的情况,最好把DLL设置成“在任意线程中运行”,前提要保证该DLL能同时被多个线程安全调用;调用规范一般选择“普通C调用”,但如果是API(Application Programming Interface),要选择stdcall(WINAPI)。
图8 基于HTML的监控页面
客户端提供了通过浏览器访问Web服务器和LabVIEW上位机程序两种方式,浏览器访问的监控页面基于HTML编写,其核心是表单,通过CGI程序解释处理表单。用户通过浏览器访问服务器,实时监控实验室的环境工况并根据需求发送控制指令进行控制的输入信息,并在服务器中进行处理,向浏览器反馈信息。包括登录页面、控制页面、环境信息页面、实时监控页面和历史记录页面等,如图8所示。采样前端接收的每条控制指令占一个字节,按位控制,格式定义如下:命令=实验室编号+设备编号+操作,如表1所示。
表1 操作参数表
LabVIEW监控程序如图9(a)所示,应用LabVIEW的web service提供了浏览器访问功能,点击工具->web发布工具,启动web server,本文要发布动态Vis,选择monitor函数,web用户可以请求Vi控制权获取控制Vi的功能。为保证该功能的正确使用,在配置时要注意几下3点:① 浏览器切换到兼容模式;② web发布选择内嵌模式;③ 服务器配置选择SSL,查询主机上的证书信息,访问效果如图9(b)所示。
图9 基于labview的监控上位机
本文基于嵌入式技术和无线网络设计了多终端的实验室监控系统,采用LPC11C14设计采样前端收集实验室环境信息,通过无线网络将采集的数据传输到数据处理中心,处理中心采用两种存储策略保证了数据存储的可靠性。客户端通过浏览器访问Web服务器或LabVIEW监控程序实时观察实验室工况,根据需要控制采集前端的风扇、蜂鸣器等设备。测试表明:多终端的监控手段有效提升了效率,多存储策略提高了可靠性,达到智能化管理的要求。