向 晟,崔永俊
(中北大学仪器科学与动态测试教育部重点实验室,仪器与电子学院,山西 太原 030051)
火工品是装有火药或炸药,受外界刺激后产生燃烧或爆炸,以引燃火药、引爆炸药或做机械功的一次性使用的元器件和装置的总称,包括雷管、导火索,点火管,火帽、传爆管,导爆索等。火工品的储存环境必须防火、防潮、防盗[1]。目前一般工业和民用火工品的小规模储存防护主要是依靠人员防范和摄像头监控,该方式可以防明火、防盗但无法了解库房内环境数据具体情况。而基于MQTT 和微信小程序的火工品仓库监测系统可以让管理人员通过手机微信小程序实时监测库内环境数据变化情况,方便管理员及时作出处理,可以减少安全隐患,降低风险发生几率。
火工品仓库监测系统由硬件系统、软件系统组成。硬件系统主要包括STM32 微控制器、ESP8266无线WIFI 模块、DHT11 温湿度传感器、HC-SR501人体红外感应传感器、BH1750 光照度传感器、MQ-2烟雾传感器、MQ-6 易燃气体传感器与L298N电机驱动等;软件系统由用户终端和微信小程序组成,集成了数据展示、设备远程控制等程序功能。系统总体结构如图1 所示。
图1 系统方案设计框图
火工品仓库监测系统的运行原理:各传感器采集库内易燃气体含量、烟雾浓度、光照强度、人员数目、温湿度等数据,并由STM32 将数据通过WIFI 方式发送至服务器与客户端,采用MQTT 协议的通信方法来实现数据交互,用户可通过终端软件MQTT.fx 和Web 网页对数据进行实时监测与测试验证,通过微信小程序实时接收服务器推送的传感器数据和远程控制硬件系统。
MQTT(消息队列遥测传输)是轻量级基于代理的发布/订阅的消息传输协议[2]。该协议基于TCP/IP 协议栈,占用开销低、带宽低且易于实现,十分适合于资源受限的场景。
在MQTT 协议中有:发布者(Publisher)、消息代理服务器(Broker)、订阅者(Subscriber)三种通信身份。MQTT 消息的发布者和订阅者都是客户端,消息代理服务器只是作为一个中转的存在,负责接收发布者发布的消息,并将消息传递给消息的订阅者。消息发布者可以同时是订阅者[3]。
图2 为MQTT 协议的工作流程。首先,订阅者向服务器订阅主题,等待接收消息;然后,服务器接收发布者发布的消息并判断消息的主题,若消息主题与订阅者所订阅的主题一致,则将消息转发至订阅者,实现消息从发布者到订阅者之间的传递。
图2 MQTT 工作流程
MQTT 协议通过控制QoS 等级来确定服务质量,QoS 级别越高,服务质量越高,流程越复杂,系统消耗资源越大[4]。本系统根据实际需求选用QoS0,即发布者发送一个Publish 包后,无论接收方是否成功收到数据,删除并丢弃已发送的包。QoS0 服务质量下的发送方式如图3 所示。
图3 QoS0 服务质量下的发送方式
硬件系统的主控芯片选用STM32F103ZET6,其具有丰富的外设,合理的功耗[5]。WIFI 模块ESP8266 支持高效简洁的AT 指令,采用Station 模式,经路由器或移动热点接入网络[6];烟雾传感器MQ-2 和易燃气体传感器MQ-6 用于采集火工品仓库中的烟雾和易燃气体的含量并通过STM32 自带的12 位ADC 读取数值[7];光照传感器BH1750,采用I2C 接口,灵敏度高,直接数字输出光照亮度[8];人体红外感应传感器HC-SR501,用于监测库内人员进出[9];温湿度传感器[10]使用DHT11,测量湿度范围20%RH~90%RH,温度范围0~50 ℃,分辨率湿度1%RH,温度分辨率1 ℃;电机驱动使用L298N以驱动直流电机[11];人机界面使用0.96 寸OLED,将传感器所采集数据直观地显示出来。核心电路引脚如图4 所示。
图4 核心电路引脚图
硬件设备端主函数工作流程如图5 所示。硬件设备端作为订阅者,订阅topic:storehouse/sub,接收来自该topic 的消息,同时作为消息的发布者向topic:storehouse/pub 上传数据。
图5 硬件端主函数流程图
STM32 平台接入MQTT 协议,主要用到三个库:esp8266.c、Mqttkit.c、Aliyun.c 及其对应头文件。
(1)esp8266.c 主要为STM32 提供网络连接配置函数。核心函数:
void ESP8266_Init(void);[初始化]
_Bool ESP8266_SendCmd(char*cmd,char*res);
[发送命令函数,cmd 命令,res 返回指令,返回参数0-成功1-失败],依次发送如下命令:
"AT\r\n"测试AT 启动;
"AT+RST\r\n"重启模块,防止出现错误;
"AT+CIPCLOSE\r\n"关闭TCP 传输;
"AT+CWMODE =1\r\n"设置模式为Station;
"AT+CWDHCP =1,1\r\n"开启DHCP;
"AT+CWJAP =\"nova\",\"66968221\" \r\n"接入WIFI 的名称和密码;
"AT +CIPSTART =\"TCP \",\"mqtt.mqttxsxs.xyz\",1883\r\n"建立TCP 连接,接入的IP 地址和端口号。
(2)Mqttkit.c 提供MQTT 协议所需要的底层函数,主要被Aliyun.c 中的函数调用并实现MQTT 服务器的连接、消息主题的订阅、接收服务器平台返回数据、发布消息等功能。其核心函数如下:
1._Bool Aliyun_DevLink(void);[接入云平台函数,1-成功0-失败];
主要调用:uint8 MQTT_PacketConnect(int8*user,int8*password,int*devid,uint16_t cTime,uint1 qos,MQTT_PACKET_STRUCTURE*mqttPacket);
[user:产品ID,password:鉴权信息或apikey,devid:设备ID,cTime:连接保持时间,qos:QoS 等级,mqttPacket:包指针]。
2.void Aliyun _ Subscribe (char * topics [ ],unsigned char topic_cnt);[订阅topic 函数,topics:topic 名称,topic_cnt:topic 个数];
主要调用:uint8 MQTT_PacketSubscribe(uint16 pkt_id,enum MqttQosLevel qos,const int8*topics[],uint8 topics_cnt,MQTT_PACKET_STRUCTURE*mqttPacket);
[pkt_id:pkt_id,qos:QoS 等级,topics:topic 名称,topics_cnt:topic 个数,mqttPacket:包指针]。
3.void Aliyun_RevPro(unsigned char*dataPtr);[平台返回数据检测,dataPtr:平台返回的数据]
主要调用:uint8 MQTT_UnPacketRecv(uint8*dataPtr);[dataPtr:接收的数据指针]。
4.void Aliyun_Publish(char*topic,char*msg);[发布消息函数,topic:发布的主题,msg:消息内容],
主要调用:uint8 MQTT_PacketPublish(uint16 pkt_id,int8*topic,int8*payload,uint32 payload_len,enum MqttQosLevel qos,MQTT _ PACKET _STRUCTURE*mqttPacket);
[pkt_id,topic:发布的topic,payload:消息体(内容),payload_len:消息体长度,qos:QoS 等级,mqttPacket:包指针]。
微信小程序的设计[12]使用的是开源的mpvue。开发环境配置:安装微信开发者工具、NodeJs、vuecil 脚手架工具和Vscode。微信小程序mpvue 工程建立过程如下:
(1)右键空白处,Vscode 打开并在终端输入命令:
$vue init mpvue/mpvue-quickstart myweapp
创建了模板的新项目,名为myweapp;
(2)用Vscode 打开新建立的myweapp,在其终端依次输入以下命令:
$npm install 安装工程需要的依赖;
$npm run dev 构建工程;
(3)微信开发者工具导入项目myweapp。
至此mpvue 工程创立完毕,微信开发者工具会监听Vscode 对工程文件的修改。另外,工程需安装MQTT 插件以支持MQTT 协议:
$npm install-save mqtt
微信小程序设计主界面如图6 所示。
图6 微信小程序设计主界面
微信小程序软件流程如图7 所示。
图7 微信小程序软件流程图
通信实现关键代码参考如下。
完成系统设计后,对本系统的功能进行测试。功能测试主要测试火工品仓库监测系统硬件主控单元能否正常稳定运行,各传感器能否正常感知数据,警报器、电机能否正常作业,用户终端软件MQTT.fx和微信小程序能否实时接收并推送数据。
打开微信小程序界面端的警报灯,硬件端绿灯亮起,记录并对比微信小程序、MQTT.fx 以及硬件设备端OLED 数据。三方数据如图8~图11 所示。
图8 微信小程序真机调试
图9 MQTT.fx 界面
图10 MQTT.fx 数据
图11 硬件OLED 显示
测试结果表明:平台实时刷新数据功能正常,微信小程序实时接收硬件设备端发布的消息,硬件设备接收到微信端命令并成功作出响应。微信小程序与硬件设备端双向通信成功。
系统运行24 h 并记录整点数据,数据汇总整理如表1 所示。由于篇幅列出8 组数据。
表1 某仓库环境实测数据
其中,烟雾和易燃气体传感器在没有检测到相应数据的情况下会输出0.4 V 和0.5 V 的电压值,在检测到相应烟雾或易燃气体时,电压值会随着检测浓度的增加而增加。
测试过程:初始状态下(0 s)烟雾和易燃气体传感器初值分别为0.4 V、0.5 V。1 s 时在距离硬件设备0.5 m 处加入烟雾与煤气,2 s~7 s 能看到ADC 所采集传感器的电压值迅速增大到3.3 V。第7 s 关闭,随着时间的推移,空气中烟雾和易燃气体含量稀释,传感器输出的电压值回归初始值。图12 为传感器测试结果曲线图。
图12 烟雾和易燃气体传感器测试结果
根据实验数据和测试结果:硬件设备工作稳定,传感器配置正确且正常工作,数据的准确性仅与其传感器的精度相关。长时间运行系统没有出现网络断开连接等现象,表明该系统通信网络稳定。
针对传统火工品仓库安全防范的非全面性,设计基于MQTT 和微信小程序的火工品仓库监测系统,并对系统进行实验测试。结合实验的数据、现象及结果,验证了硬件设备与微信小程序之间数据命令交互具有实时性、稳定性、准确性。该设计方便用户和管理人员从数据角度监测库房内的环境。系统结构相对简单,成本低,可作为独立或辅助设备应用于火工品仓库及其他相关环境,具有实际应用价值。