向 晟,崔永俊
(中北大學儀器科學與動態測試教育部重點實驗室,儀器與電子學院,山西 太原 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 和微信小程序的火工品倉庫監測系統,并對系統進行實驗測試。結合實驗的數據、現象及結果,驗證了硬件設備與微信小程序之間數據命令交互具有實時性、穩定性、準確性。該設計方便用戶和管理人員從數據角度監測庫房內的環境。系統結構相對簡單,成本低,可作為獨立或輔助設備應用于火工品倉庫及其他相關環境,具有實際應用價值。