陳惠玲,劉佳文,秦子敬,宋天琪,蔣羽田,李萬清
(杭州電子科技大學,浙江 杭州 310018)
近五年來,國內火災每年發生次數都在十萬次以上,每年家庭火災發生的次數占總火災發生次數的50%以上,其中家庭火災死亡的人數占到了總人數的70%[1]以上。以杭州藍色錢江保姆縱火案為中心展開調查發現,火災亡人主要原因在于火災發生察覺過晚,家中沒有報警信號發出,未能及時向外界求救等等。雖然現在市場上出現了一些消防產品,然而眾多消防產品卻功能單一,尚無法找到一款能較好解決當前困境的系統,因此國內家庭物業在消防逃生報警系統[2]建設方面還有很大的提升空間。如何利用現代互聯網、物聯網[3]等先進技術提升家庭消防逃生報警系統建設水平是本系統著重要解決的問題。
本系統是一個包括手機APP、火災探測器和具有著火狀態下自動解鎖功能的門鎖,其主要針對家庭設計的消防逃生報警系統[4],具有無線傳輸的優點。如圖1所示,系統通過網絡傳輸硬件設備,將用戶的手機、云服務器、傳感器、門鎖聯系在一起,進行信息的交換和通訊,實現智能化的識別、定位、跟蹤、監控和管理。根據傳感器獲取到的煙霧濃度、溫濕度等數據,對室內進行實時監控,能夠在第一時間發現室內的火情并將門打開,幫助用戶逃生。如果用戶遠在外地,也能及時收到火情并確認火情情況,立即報警以減少財產損失。通過云服務器的篩選管理,將火情及時傳達給居住在火災現場的同一區域用戶,以最大可能地協助救援、減少人員傷亡。

圖1 業務流程
如圖2所示,系統使用Arduino作為核心控制器,采取物聯網和傳感器技術,將ESP8266模塊與相關的硬件電路進行無線連接,通過APP獲取室內實時監測的數據、火災報警、遠程開鎖等。這種系統主要運用物聯網技術,通過MQTT協議實現信號無線實時傳輸,彌補了傳統系統的不足,能在第一時間聯系到干系人,實現預警和協助逃生的目的。

圖2 系統架構
采集端和控制端之間通過MQTT協議形成一個無線通信網絡。采集端主要由傳感器組成。采集端通過測量室內的溫濕度和氣體濃度獲得數據,進而通過ESP8266[5]無線模塊將數據傳輸到控制端。
如圖3所示,系統采用DTHT11[6-7]作為溫濕度傳感器,其溫度量程范圍分別為0 ℃~50 ℃,誤差為2 ℃,具有極高的可靠性與卓越的長期穩定性,因此能較好地滿足前期預警需求。通過將DTHT11的DATA引腳與Arduino相連,人工編寫程序上傳到Arduino并重啟后,DATA引腳可采用單總線數據格式實現DHT11和Arduino的通訊和同步,通訊時間為4 ms左右,通訊成功后可在Arduino IDE的串口監視器中看到測量數據。
主要實現代碼如下:
int chk=DHT11.read(DHT11PIN);
Serial.print("Humidity(%):");
Serial.println((float)DHT11.humidity,2);
Serial.print("Temperature °C):");
Serial.println((float)DHT11.temperature, 2);

圖3 DTH11電路結構
同時,系統還采用了MQ2傳感器,MQ2[8]氣體傳感器對液化氣、丙烷、氫氣的靈敏度高,對天然氣和其他可燃蒸汽的檢測也很理想。但是MQ系列傳感器需要預熱初始化后才可使用,為了提高傳感器準確率,本系統采用了小波能量頻譜分析[9]的方法,以準確判斷MQ系列傳感器能否達到加熱要求,進而進行數據轉換以進行數據傳輸。正常情況下,傳感器以模擬量輸出時,OUT端的電壓在1 V左右,當傳感器檢測到被測氣體時,電壓每升高0.1 V,實際被測氣體的濃度增加200 ppm。因此控制端可根據收到的電壓信號判斷氣體濃度是否達到閾值。
2.2.1 基于TCP/IP的串行通訊
本系統的Arduino與傳感器之間采用基于TCP/IP協議的串行通訊[10]方式,與傳統串行通訊系統相比,其在接受容量、精確程度以及遞送速度上更有效。在火災發生的情況下,信號干擾的現象較多,而串行通訊的通訊時鐘頻率較易提高,因此其抗干擾能力較強,能夠較好滿足設計需要。
2.2.2 基于ESP8266芯片和MQTT協議的無線傳輸
如圖4所示,本系統使用ESP8266芯片作為WIFI[11]模塊,外接DTHT11溫濕度傳感器和MQ2氣體傳感器和Arduino,形成一個組網。Arduino作為控制器,其他設備作為客戶端。客戶端負責采集環境參數[12],并將數據傳送到服務器進行處理。

圖4 WIFI模塊組網
如圖5和圖6所示,Arduino獲取到數據后使用ESP8266芯片作為MQTT協議[13]的Publish,與服務器建立TCP連接,通過post請求將室內數據及相應的數據危險級別作為Topic和payload通過Broke使用Find接口傳遞給用戶設定的Subscribe,實現數據的無線傳輸。MQTT可以通過極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務,這保證了信息傳輸的可靠性。Arduino獲取參數模塊的主要實現代碼如下:
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(requesturl).build();
Response response=client.newCall(request).execute();
String responseData=response.body().string();
userList=(ArrayList

圖5 MQTT協議傳輸示意圖

圖6 MQTT數據交換示意圖
2.3.1 核心控制器
系統采用Arduino UNO Rev3[14]作為核心控制器。與Raspberry Pi相比較,其以ATmega328P作為開源微處理器,不需要設計其他電路即可與不同的傳感器進行交互,更容易連接外部感應器。由于其使用Atmel公司的微處理器嵌入式系統,具有體積小的優點,較好契合系統尺寸小的要求。
Arduino使用onResponse()實現與采集端進行數字信號的交互,再使用5倍dewPoint()快速計算露點(空氣飽和并產生露珠的溫度),數據獲取時延較小。在成功獲取數據后,其通過ESP8266將數據傳送到服務器以獲取執行命令,該模塊主要程序代碼如下:
public void onResponse(org.json.JSONArray jsonArray) {
wendu_length=jsonArray.length();
for(int j=0;j mAdapter.refresh(ardunio_wendu,ardunio_date,arduino_shidu); ardunio_wendu.add(jsonArray.getJSONObject(j).getInt("wendu")); mAdapter.refresh(ardunio_wend); } double dewPoint(double celsius, double humidity){ double A0=373.15/(273.15 + celsius); double SUM=-7.90298*(A0-1); SUM+=5.02808*log10(A0); SUM+=-1.3816e-7*(pow(10, (11.344*(1-1/A0)))-1) ; SUM+=8.1328e-3*(pow(10,(-3.49149*(A0-1)))-1) ; SUM+=log10(1013.246); double VP=pow(10, SUM-3)*humidity; double T=log(VP/0.61078); return (241.88*T)/(17.558-T); } 2.3.2 控制端門鎖編程設計 系統主要利用服務器端傳送的開關鎖命令來實現對門鎖的控制,當收到服務器發來的命令cmd為openthedoor時,Arduino會控制門鎖打開,以下是鎖的收發端程序: data,address=s.recvfrom(2048) cmd=data.decode('utf-8') if cmd=='openthedoor': signalpin=4 GPIO.setmode(GPIO.BCM) GPIO.setup(signalpin,GPIO.OUT,initial=GPIO.LOW) GPIO.output(signalpin,GPIO.HIGH) time.sleep(0.1) GPIO.output(signalpin,GPIO.LOW) else: logging.critical("Wrong Comman") 3.1.1 服務器端架構 為了保證該系統的高并發性,服務端采用了nodejs進行開發,由于nodejs的異步I/O以及事物驅動這些特性,使得其本身對高并發有著較好的處理,可以使服務端在處理大量請求的情況下依舊保持正常服務。系統架構包含應用層、表現層、服務層、數據存儲層以及基礎設施層,如圖7所示。 圖7 系統服務器架構 ·基礎設施層。 基礎設施層是整個平臺架構的最底層,是平臺可以正常運作的最基本要求,其中包含虛擬服務器、硬件資源、存儲設備、網絡設備等。通過該層的各個部分協同工作來保證平臺的正常運行。 ·數據存儲層。 數據存儲層是存放平臺數據的地方,用戶數據、平臺數據以及日志信息都存放在該層中,對于用戶信息以及用戶數據等關系性數據是存放在Mysql關系型數據庫中,對于系統日志以及用戶上傳的附件等信息是采用非結構化存儲保存在服務器中的。數據存儲層為上層的服務層提供了數據支撐,并且采用數據與服務分離的方式,保證了平臺數據的共享性以及高效性。 ·服務層。 服務層是整個平臺的核心,服務層通過對外提供API接口來提供功能,其分為業務服務模塊和基礎服務組件兩個部分,業務服務模塊中提供了用戶的認證授權、工作流、調度服務以及消息推送服務等業務服務,在基礎服務組件中包括了系統配置、日志管理、任務調度、緩存管理、附件管理和連接池。這兩個部分組合起來構成了服務層,提供系統所需功能。 ·表現層。 該平臺是通過手機APP的形式來對服務進行表現的。 ·應用層。 應用層分為了兩個部分,分別是信息部分和服務部分,信息部分主要包括對火災的個性化預測、緊急聯系人信息錄入以及房屋信息錄入,服務部分有自動報警、智能聯動、自動開門以及房屋空氣指標異常提醒功能。 3.1.2 服務器端功能設計 當服務器接收到的數據達到火災報警閾值時,系統會通過接口獲取著火點經緯度和用戶預留信息,進行小區內局域網報警和遠程通知。同時,服務器端通過相關接口獲取危險事項等數據,再通過相關接口發送命令報文到Arduino改變門鎖狀態,實現現場自動或遠程開門功能。 3.2.1 查看溫濕度 用戶出門在外時可通過APP實時查看家中環境情況。當服務器端收到客戶端的request請求后,會通過可對外開放的獲取溫濕度信息的接口來獲取溫濕度信息,再使用MQTT協議將包含溫濕度數據的報文發送到客戶端并顯示出來。 3.2.2 撥打緊急聯系人電話 由于Android系統存在應用權限,所以系統初始化時需要先獲取撥打電話的權限,當獲取到權限后,可使用intent啟動撥打電話。該功能的主要程序如下: //申請授權 ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE); //獲得授權后通過intent撥打電話 Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+mobile)); startActivity(intent);} 3.2.3 控制門鎖狀態 著火情況下,被困者可能因為無法找到鑰匙等打開門鎖無法逃生,而緊急聯系人也無法協助逃生。而本系統中用戶及緊急聯系人可通過輸入密碼打開門鎖。該操作是由APP獲取用戶行為傳輸數據到服務器,再通過服務器傳送命令到Arduino,進而實現開關門。主要實現代碼如下: if entered_passcode==correct_passcode: socket.socket(socket.AF_INET,socket.SOCK_DGRAM).sendto("openthedoor".encode(),('127.0.0.1',2048)) print("密碼正確,開鎖成功") entered_passcode="" else: print("密碼錯誤,開鎖失敗") entered_passcode="" 基于Arduino和物聯網的家庭消防逃生報警系統使用Intel Xeon Platinum 8163(Skylake)2.5 GHz、雙核CPU 4 GB,40 GB存儲、4 G內存的阿里云服務器,服務器帶寬100 Mbps,系統版本采用centos6.1操作系統。部署完畢后,對服務性能進行測試,測試軟件采用loadRunner,通過模擬用戶來對服務器進行大量發包,以進行系統的性能和負載能力檢測。 本測試利用了loadRunner來對服務器進行了大量的并發訪問,對服務端的不同開發語言版本進行了測試,分別對java和nodejs進行了測試。在測試過程中,分別模擬了每秒10,50,100,150個并發請求訪問平臺,測試結果如圖8所示。可以發現,平均響應時間和請求量線性相關,每秒應答處理數量基本上是恒定的。在并發請求量不高的時候,java和nodejs的平均響應時間相差不多,但是當并發請求數量大于50之后,nodejs就明顯要比java的處理速度要快,系統采用nodejs進行開發,在系統大規模使用時,響應時間要優于傳統系統。但是nodejs采用的是單線程,所以在應答時間[15]上nodejs的處理時間要比傳統java服務器要長。但此劣勢可通過反向代替、負載均衡來彌補。基于以上測試和對比,本系統初步實現了高性能服務器的開發目標。 圖8 服務器測試對比 如今市場上的消防報警系統并不只此一款,但缺少輔助逃生功能。所謂知己知彼,百戰不殆,通過前期對同類消防產品的調查和了解發現,這些系統主要都是安裝于居民樓樓道、走廊當中,鮮有安裝于室內的系統,并且存在警報聲傳入室內后聲音很小、門鎖無法打開等問題。與同類系統相比,本系統具有以下創新性: ·個性化定制火災報警指標。根據每家每戶環境的特征進行定性分類,設置不同的火災報警點,彌補了傳統探測器靈敏度不夠高的缺陷,提高系統開鎖的準確度。 ·災情發現早,報警更及時。通過傳感器探頭主動探測陰燃、煙霧、明火,然后在事發現場發出警笛聲,同時也通過物聯網與互聯網融合技術,將報警信息發送到干系人手機。 ·自動開門,提高逃生成功率。家裝火警響起的同時門鎖可通過探頭探測到的情況和控制中心傳來的信息遠程控制使房門自動打開,便于逃生和救援。 ·無線系統,安裝簡便。該方案是一套無線系統,從而安裝時不需要破拆墻體。所有信息互聯全部采用無線網絡,安裝方便。 在人們的家庭火災風險防范意識逐漸增強的環境下,本系統的優勢會逐漸凸顯,因此其擁有較好的使用價值和前景。 設計并實現了基于Arduino和物聯網技術的家庭消防逃生報警系統。該系統可實現對室內溫濕度及可燃氣體濃度的檢測,當檢測的指標達到閾值時,自動開啟門鎖協助逃生并發送火災信息到干系人終端進行報警。系統以Arduino為核心控制器,通過ESP8266與DTHT11和MQ2傳感器及門鎖進行通信和控制,成本低,體積小。組網內部使用串行通信方式,提升了系統的抗干擾性。通過MQTT推送機制,將內外網相連,實現數據無線傳輸,速度快,可靠性高。用戶在日常生活中也可在終端設備查看室內環境信息和密碼開鎖。該系統在保障家庭安全的同時也便利了用戶的生活,為類似物聯網項目提供了一種可行的解決方案。3 系統軟件設計
3.1 服務器端設計

3.2 客戶端程序設計
4 系統測試
4.1 測試環境
4.2 測試結果分析

5 應用效益
6 結束語