向 晟,崔永俊
(中北大學(xué)儀器科學(xué)與動態(tài)測試教育部重點(diǎn)實(shí)驗室,儀器與電子學(xué)院,山西 太原 030051)
火工品是裝有火藥或炸藥,受外界刺激后產(chǎn)生燃燒或爆炸,以引燃火藥、引爆炸藥或做機(jī)械功的一次性使用的元器件和裝置的總稱,包括雷管、導(dǎo)火索,點(diǎn)火管,火帽、傳爆管,導(dǎo)爆索等?;鸸て返膬Υ姝h(huán)境必須防火、防潮、防盜[1]。目前一般工業(yè)和民用火工品的小規(guī)模儲存防護(hù)主要是依靠人員防范和攝像頭監(jiān)控,該方式可以防明火、防盜但無法了解庫房內(nèi)環(huán)境數(shù)據(jù)具體情況。而基于MQTT 和微信小程序的火工品倉庫監(jiān)測系統(tǒng)可以讓管理人員通過手機(jī)微信小程序?qū)崟r監(jiān)測庫內(nèi)環(huán)境數(shù)據(jù)變化情況,方便管理員及時作出處理,可以減少安全隱患,降低風(fēng)險發(fā)生幾率。
火工品倉庫監(jiān)測系統(tǒng)由硬件系統(tǒng)、軟件系統(tǒng)組成。硬件系統(tǒng)主要包括STM32 微控制器、ESP8266無線WIFI 模塊、DHT11 溫濕度傳感器、HC-SR501人體紅外感應(yīng)傳感器、BH1750 光照度傳感器、MQ-2煙霧傳感器、MQ-6 易燃?xì)怏w傳感器與L298N電機(jī)驅(qū)動等;軟件系統(tǒng)由用戶終端和微信小程序組成,集成了數(shù)據(jù)展示、設(shè)備遠(yuǎn)程控制等程序功能。系統(tǒng)總體結(jié)構(gòu)如圖1 所示。
圖1 系統(tǒng)方案設(shè)計框圖
火工品倉庫監(jiān)測系統(tǒng)的運(yùn)行原理:各傳感器采集庫內(nèi)易燃?xì)怏w含量、煙霧濃度、光照強(qiáng)度、人員數(shù)目、溫濕度等數(shù)據(jù),并由STM32 將數(shù)據(jù)通過WIFI 方式發(fā)送至服務(wù)器與客戶端,采用MQTT 協(xié)議的通信方法來實(shí)現(xiàn)數(shù)據(jù)交互,用戶可通過終端軟件MQTT.fx 和Web 網(wǎng)頁對數(shù)據(jù)進(jìn)行實(shí)時監(jiān)測與測試驗證,通過微信小程序?qū)崟r接收服務(wù)器推送的傳感器數(shù)據(jù)和遠(yuǎn)程控制硬件系統(tǒng)。
MQTT(消息隊列遙測傳輸)是輕量級基于代理的發(fā)布/訂閱的消息傳輸協(xié)議[2]。該協(xié)議基于TCP/IP 協(xié)議棧,占用開銷低、帶寬低且易于實(shí)現(xiàn),十分適合于資源受限的場景。
在MQTT 協(xié)議中有:發(fā)布者(Publisher)、消息代理服務(wù)器(Broker)、訂閱者(Subscriber)三種通信身份。MQTT 消息的發(fā)布者和訂閱者都是客戶端,消息代理服務(wù)器只是作為一個中轉(zhuǎn)的存在,負(fù)責(zé)接收發(fā)布者發(fā)布的消息,并將消息傳遞給消息的訂閱者。消息發(fā)布者可以同時是訂閱者[3]。
圖2 為MQTT 協(xié)議的工作流程。首先,訂閱者向服務(wù)器訂閱主題,等待接收消息;然后,服務(wù)器接收發(fā)布者發(fā)布的消息并判斷消息的主題,若消息主題與訂閱者所訂閱的主題一致,則將消息轉(zhuǎn)發(fā)至訂閱者,實(shí)現(xiàn)消息從發(fā)布者到訂閱者之間的傳遞。
圖2 MQTT 工作流程
MQTT 協(xié)議通過控制QoS 等級來確定服務(wù)質(zhì)量,QoS 級別越高,服務(wù)質(zhì)量越高,流程越復(fù)雜,系統(tǒng)消耗資源越大[4]。本系統(tǒng)根據(jù)實(shí)際需求選用QoS0,即發(fā)布者發(fā)送一個Publish 包后,無論接收方是否成功收到數(shù)據(jù),刪除并丟棄已發(fā)送的包。QoS0 服務(wù)質(zhì)量下的發(fā)送方式如圖3 所示。
圖3 QoS0 服務(wù)質(zhì)量下的發(fā)送方式
硬件系統(tǒng)的主控芯片選用STM32F103ZET6,其具有豐富的外設(shè),合理的功耗[5]。WIFI 模塊ESP8266 支持高效簡潔的AT 指令,采用Station 模式,經(jīng)路由器或移動熱點(diǎn)接入網(wǎng)絡(luò)[6];煙霧傳感器MQ-2 和易燃?xì)怏w傳感器MQ-6 用于采集火工品倉庫中的煙霧和易燃?xì)怏w的含量并通過STM32 自帶的12 位ADC 讀取數(shù)值[7];光照傳感器BH1750,采用I2C 接口,靈敏度高,直接數(shù)字輸出光照亮度[8];人體紅外感應(yīng)傳感器HC-SR501,用于監(jiān)測庫內(nèi)人員進(jìn)出[9];溫濕度傳感器[10]使用DHT11,測量濕度范圍20%RH~90%RH,溫度范圍0~50 ℃,分辨率濕度1%RH,溫度分辨率1 ℃;電機(jī)驅(qū)動使用L298N以驅(qū)動直流電機(jī)[11];人機(jī)界面使用0.96 寸OLED,將傳感器所采集數(shù)據(jù)直觀地顯示出來。核心電路引腳如圖4 所示。
圖4 核心電路引腳圖
硬件設(shè)備端主函數(shù)工作流程如圖5 所示。硬件設(shè)備端作為訂閱者,訂閱topic:storehouse/sub,接收來自該topic 的消息,同時作為消息的發(fā)布者向topic:storehouse/pub 上傳數(shù)據(jù)。
圖5 硬件端主函數(shù)流程圖
STM32 平臺接入MQTT 協(xié)議,主要用到三個庫:esp8266.c、Mqttkit.c、Aliyun.c 及其對應(yīng)頭文件。
(1)esp8266.c 主要為STM32 提供網(wǎng)絡(luò)連接配置函數(shù)。核心函數(shù):
void ESP8266_Init(void);[初始化]
_Bool ESP8266_SendCmd(char*cmd,char*res);
[發(fā)送命令函數(shù),cmd 命令,res 返回指令,返回參數(shù)0-成功1-失敗],依次發(fā)送如下命令:
"AT\r\n"測試AT 啟動;
"AT+RST\r\n"重啟模塊,防止出現(xiàn)錯誤;
"AT+CIPCLOSE\r\n"關(guān)閉TCP 傳輸;
"AT+CWMODE =1\r\n"設(shè)置模式為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 協(xié)議所需要的底層函數(shù),主要被Aliyun.c 中的函數(shù)調(diào)用并實(shí)現(xiàn)MQTT 服務(wù)器的連接、消息主題的訂閱、接收服務(wù)器平臺返回數(shù)據(jù)、發(fā)布消息等功能。其核心函數(shù)如下:
1._Bool Aliyun_DevLink(void);[接入云平臺函數(shù),1-成功0-失敗];
主要調(diào)用:uint8 MQTT_PacketConnect(int8*user,int8*password,int*devid,uint16_t cTime,uint1 qos,MQTT_PACKET_STRUCTURE*mqttPacket);
[user:產(chǎn)品ID,password:鑒權(quán)信息或apikey,devid:設(shè)備ID,cTime:連接保持時間,qos:QoS 等級,mqttPacket:包指針]。
2.void Aliyun _ Subscribe (char * topics [ ],unsigned char topic_cnt);[訂閱topic 函數(shù),topics:topic 名稱,topic_cnt:topic 個數(shù)];
主要調(diào)用: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 個數(shù),mqttPacket:包指針]。
3.void Aliyun_RevPro(unsigned char*dataPtr);[平臺返回數(shù)據(jù)檢測,dataPtr:平臺返回的數(shù)據(jù)]
主要調(diào)用:uint8 MQTT_UnPacketRecv(uint8*dataPtr);[dataPtr:接收的數(shù)據(jù)指針]。
4.void Aliyun_Publish(char*topic,char*msg);[發(fā)布消息函數(shù),topic:發(fā)布的主題,msg:消息內(nèi)容],
主要調(diào)用:uint8 MQTT_PacketPublish(uint16 pkt_id,int8*topic,int8*payload,uint32 payload_len,enum MqttQosLevel qos,MQTT _ PACKET _STRUCTURE*mqttPacket);
[pkt_id,topic:發(fā)布的topic,payload:消息體(內(nèi)容),payload_len:消息體長度,qos:QoS 等級,mqttPacket:包指針]。
微信小程序的設(shè)計[12]使用的是開源的mpvue。開發(fā)環(huán)境配置:安裝微信開發(fā)者工具、NodeJs、vuecil 腳手架工具和Vscode。微信小程序mpvue 工程建立過程如下:
(1)右鍵空白處,Vscode 打開并在終端輸入命令:
$vue init mpvue/mpvue-quickstart myweapp
創(chuàng)建了模板的新項目,名為myweapp;
(2)用Vscode 打開新建立的myweapp,在其終端依次輸入以下命令:
$npm install 安裝工程需要的依賴;
$npm run dev 構(gòu)建工程;
(3)微信開發(fā)者工具導(dǎo)入項目myweapp。
至此mpvue 工程創(chuàng)立完畢,微信開發(fā)者工具會監(jiān)聽Vscode 對工程文件的修改。另外,工程需安裝MQTT 插件以支持MQTT 協(xié)議:
$npm install-save mqtt
微信小程序設(shè)計主界面如圖6 所示。
圖6 微信小程序設(shè)計主界面
微信小程序軟件流程如圖7 所示。
圖7 微信小程序軟件流程圖
通信實(shí)現(xiàn)關(guān)鍵代碼參考如下。
完成系統(tǒng)設(shè)計后,對本系統(tǒng)的功能進(jìn)行測試。功能測試主要測試火工品倉庫監(jiān)測系統(tǒng)硬件主控單元能否正常穩(wěn)定運(yùn)行,各傳感器能否正常感知數(shù)據(jù),警報器、電機(jī)能否正常作業(yè),用戶終端軟件MQTT.fx和微信小程序能否實(shí)時接收并推送數(shù)據(jù)。
打開微信小程序界面端的警報燈,硬件端綠燈亮起,記錄并對比微信小程序、MQTT.fx 以及硬件設(shè)備端OLED 數(shù)據(jù)。三方數(shù)據(jù)如圖8~圖11 所示。
圖8 微信小程序真機(jī)調(diào)試
圖9 MQTT.fx 界面
圖10 MQTT.fx 數(shù)據(jù)
圖11 硬件OLED 顯示
測試結(jié)果表明:平臺實(shí)時刷新數(shù)據(jù)功能正常,微信小程序?qū)崟r接收硬件設(shè)備端發(fā)布的消息,硬件設(shè)備接收到微信端命令并成功作出響應(yīng)。微信小程序與硬件設(shè)備端雙向通信成功。
系統(tǒng)運(yùn)行24 h 并記錄整點(diǎn)數(shù)據(jù),數(shù)據(jù)匯總整理如表1 所示。由于篇幅列出8 組數(shù)據(jù)。
表1 某倉庫環(huán)境實(shí)測數(shù)據(jù)
其中,煙霧和易燃?xì)怏w傳感器在沒有檢測到相應(yīng)數(shù)據(jù)的情況下會輸出0.4 V 和0.5 V 的電壓值,在檢測到相應(yīng)煙霧或易燃?xì)怏w時,電壓值會隨著檢測濃度的增加而增加。
測試過程:初始狀態(tài)下(0 s)煙霧和易燃?xì)怏w傳感器初值分別為0.4 V、0.5 V。1 s 時在距離硬件設(shè)備0.5 m 處加入煙霧與煤氣,2 s~7 s 能看到ADC 所采集傳感器的電壓值迅速增大到3.3 V。第7 s 關(guān)閉,隨著時間的推移,空氣中煙霧和易燃?xì)怏w含量稀釋,傳感器輸出的電壓值回歸初始值。圖12 為傳感器測試結(jié)果曲線圖。
圖12 煙霧和易燃?xì)怏w傳感器測試結(jié)果
根據(jù)實(shí)驗數(shù)據(jù)和測試結(jié)果:硬件設(shè)備工作穩(wěn)定,傳感器配置正確且正常工作,數(shù)據(jù)的準(zhǔn)確性僅與其傳感器的精度相關(guān)。長時間運(yùn)行系統(tǒng)沒有出現(xiàn)網(wǎng)絡(luò)斷開連接等現(xiàn)象,表明該系統(tǒng)通信網(wǎng)絡(luò)穩(wěn)定。
針對傳統(tǒng)火工品倉庫安全防范的非全面性,設(shè)計基于MQTT 和微信小程序的火工品倉庫監(jiān)測系統(tǒng),并對系統(tǒng)進(jìn)行實(shí)驗測試。結(jié)合實(shí)驗的數(shù)據(jù)、現(xiàn)象及結(jié)果,驗證了硬件設(shè)備與微信小程序之間數(shù)據(jù)命令交互具有實(shí)時性、穩(wěn)定性、準(zhǔn)確性。該設(shè)計方便用戶和管理人員從數(shù)據(jù)角度監(jiān)測庫房內(nèi)的環(huán)境。系統(tǒng)結(jié)構(gòu)相對簡單,成本低,可作為獨(dú)立或輔助設(shè)備應(yīng)用于火工品倉庫及其他相關(guān)環(huán)境,具有實(shí)際應(yīng)用價值。