1. 功能介紹
隨著全球氣候變化和人類活動(dòng)的增加,森林火災(zāi)成為了一個(gè)嚴(yán)重的環(huán)境問(wèn)題。及早發(fā)現(xiàn)和迅速響應(yīng)火災(zāi)事件對(duì)于減少火災(zāi)的損失至關(guān)重要。為了實(shí)現(xiàn)對(duì)森林火災(zāi)的快速預(yù)警和聯(lián)動(dòng)控制,決定利用華為云IoT物聯(lián)網(wǎng)平臺(tái)來(lái)搭建一個(gè)高效的系統(tǒng)模型。
該系統(tǒng)模型的目標(biāo)是在檢測(cè)到森林火災(zāi)后,能夠快速將火災(zāi)信息上報(bào)到云平臺(tái),并與指定的服務(wù)器進(jìn)行數(shù)據(jù)報(bào)告的交互。同時(shí),系統(tǒng)還能自動(dòng)向抽水泵發(fā)送指令,打開(kāi)開(kāi)關(guān)以進(jìn)行抽水滅火操作。通過(guò)這樣的聯(lián)動(dòng)控制系統(tǒng),可以實(shí)現(xiàn)快速響應(yīng)和減少火災(zāi)對(duì)森林和生態(tài)環(huán)境的破壞。
該系統(tǒng)模型的核心是華為云IoT物聯(lián)網(wǎng)平臺(tái),它提供了豐富的功能和服務(wù),包括設(shè)備接入、數(shù)據(jù)采集、消息通信、云端數(shù)據(jù)存儲(chǔ)和分析等。我們可以利用該平臺(tái)的能力來(lái)接收來(lái)自火災(zāi)檢測(cè)設(shè)備的數(shù)據(jù),并通過(guò)云端的數(shù)據(jù)分析和處理來(lái)實(shí)現(xiàn)火災(zāi)預(yù)警和聯(lián)動(dòng)控制。
當(dāng)火災(zāi)檢測(cè)設(shè)備檢測(cè)到火災(zāi)時(shí),會(huì)通過(guò)無(wú)線通信將火災(zāi)信息發(fā)送到華為云IoT物聯(lián)網(wǎng)平臺(tái)。云平臺(tái)接收到信息后,會(huì)立即進(jìn)行處理并將火災(zāi)報(bào)告發(fā)送給指定的服務(wù)器。服務(wù)器可以根據(jù)報(bào)告中的信息采取相應(yīng)的措施,如調(diào)度抽水泵進(jìn)行滅火操作。
通過(guò)這個(gè)系統(tǒng)模型,可以實(shí)現(xiàn)對(duì)森林火災(zāi)的快速預(yù)警和聯(lián)動(dòng)控制,大大提高了火災(zāi)應(yīng)對(duì)的效率和準(zhǔn)確性。同時(shí),利用華為云IoT物聯(lián)網(wǎng)平臺(tái)的強(qiáng)大功能,可以靈活地?cái)U(kuò)展和定制系統(tǒng),以適應(yīng)不同規(guī)模和需求的森林火災(zāi)防控工作。
硬件平臺(tái)介紹:
物聯(lián)網(wǎng)云平臺(tái): 華為IOT云平臺(tái)
氣體檢測(cè)傳感器: MQ2-煙霧傳感器、MQ135-空氣質(zhì)量檢測(cè)傳感器
火焰檢測(cè): 采用火焰檢測(cè)傳感器
抽水機(jī): 采用直流電機(jī)模擬水泵,打開(kāi)開(kāi)關(guān)抽水噴水滅火
上網(wǎng)網(wǎng)卡: 采用GSM模塊SIM800C,使用的是物聯(lián)網(wǎng)專用卡,包年只能上網(wǎng)這種。
與云端服務(wù)器的通信協(xié)議: 終端設(shè)備采用MQTT3.1.1協(xié)議與華為云服務(wù)器進(jìn)行登錄連接。
溫濕度檢測(cè)傳感器: DHT11
供電方式: 電池+太陽(yáng)能供電
為了演示聯(lián)動(dòng)控制,火警(煙霧)檢測(cè)裝置和滅火(直流電機(jī))裝置分為兩個(gè)獨(dú)立的設(shè)備,分別連接上云端。
火警檢測(cè)裝置連接上物聯(lián)網(wǎng)服務(wù)器之后,可以在服務(wù)器上配置數(shù)據(jù)處理規(guī)則,如果煙霧濃度超標(biāo),可以自動(dòng)向滅火裝置發(fā)送指令,進(jìn)行滅火操作。服務(wù)器收到火警檢測(cè)裝置上傳的煙霧濃度、空氣質(zhì)量等數(shù)據(jù)后,可以向自己的私有服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù),方便自己服務(wù)器收到數(shù)據(jù)后做分析存儲(chǔ)處理,比如: 向指定郵箱發(fā)送郵件、手機(jī)APP推送通知欄、向指定用戶推送短消息提示等等。
2. 創(chuàng)建產(chǎn)品(火警預(yù)警裝置)
打開(kāi)官網(wǎng)鏈接: https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU
(1)選擇設(shè)備接入IotTDA選項(xiàng)。
(2)選擇免費(fèi)試用。
(3)在產(chǎn)品頁(yè)面選擇創(chuàng)建新的產(chǎn)品。
(4)填入產(chǎn)品信息,創(chuàng)建產(chǎn)品
(5)選擇自己剛才創(chuàng)建的產(chǎn)品,創(chuàng)建數(shù)據(jù)模型,點(diǎn)擊自定義模型
(6)選擇添加屬性
這個(gè)添加的屬性就是設(shè)備端上報(bào)的數(shù)據(jù)類型。 比如: MQ2煙霧傳感器檢測(cè)的煙霧數(shù)據(jù)值類型。
在這個(gè)頁(yè)面上還有一個(gè)添加命令的功能,這是用于云端下發(fā)指令給設(shè)備端使用的。當(dāng)前這個(gè)設(shè)備是火警檢測(cè)裝置,只需要上報(bào)數(shù)據(jù)給服務(wù)器,不需要下發(fā)指令,這里就只需要添加屬性就行了。
根據(jù)自己的設(shè)備的具體情況填寫即可,如果上報(bào)的數(shù)據(jù)有多種類型就創(chuàng)建多個(gè)屬性。
3. 創(chuàng)建產(chǎn)品(滅火裝置)
創(chuàng)建的流程和上面一樣,這是多增加了一個(gè)命令下發(fā)的功能,方便云端遠(yuǎn)程控制電機(jī)開(kāi)啟和關(guān)閉,實(shí)現(xiàn)滅火功能。
(1)創(chuàng)建產(chǎn)品
(2)產(chǎn)品創(chuàng)建完畢之后,添加服務(wù)器ID
(3)添加屬性,電機(jī)屬性是可以讀可以寫的,范圍設(shè)置為0和1,只能開(kāi)關(guān)
(4)添加命令,這個(gè)命令用于云端遠(yuǎn)程向設(shè)備下發(fā)指令,設(shè)備收到指令后可以做出相應(yīng)的邏輯處理
接著選擇新增輸入參數(shù):
最后點(diǎn)擊確定即可。
現(xiàn)在產(chǎn)品已經(jīng)創(chuàng)建完畢。
4. 創(chuàng)建設(shè)備(火警預(yù)警裝置)
(1)在設(shè)備頁(yè)面,選擇注冊(cè)設(shè)備,選擇自己的對(duì)應(yīng)的產(chǎn)品,設(shè)備標(biāo)識(shí)碼一般填自己設(shè)備的硬件標(biāo)號(hào)。
(2)設(shè)備創(chuàng)建成功之后會(huì)彈出彈窗,點(diǎn)擊保存并關(guān)閉,會(huì)自動(dòng)彈出下載窗口,是個(gè)文本文件,存放了密匙信息
{
"device_id": "61bacdc02b2aa20288c5a094_QQ1126626497",
"secret": "1126626497"
}
5. 創(chuàng)建設(shè)備(滅火裝置)
流程與上面火警預(yù)警裝置設(shè)備一樣的。
{
"device_id": "61bad0564d9b020287193be2_QQ1126626497",
"secret": "1126626497"
}
6. 生成MQTT協(xié)議登錄ID和密匙
設(shè)備創(chuàng)建完成接來(lái)下生成MQTT登錄賬號(hào)、密匙,方便設(shè)備登錄云端平臺(tái)。
官網(wǎng)工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
填入剛才創(chuàng)建設(shè)備時(shí),保存下載文件里的信息,對(duì)著彈窗填入,最后生成了ID、用戶名、密碼參數(shù),用于MQTT協(xié)議登錄使用。
(1)火警預(yù)警裝置生成登錄參數(shù)
ClientId 61bacdc02b2aa20288c5a094_QQ1126626497_0_0_2021121605
Username 61bacdc02b2aa20288c5a094_QQ1126626497
Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475
(2)滅火裝置
ClientId 61bad0564d9b020287193be2_QQ1126626497_0_0_2021121605
Username 61bad0564d9b020287193be2_QQ1126626497
Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475
7. 上報(bào)屬性格式與主題訂閱格式
產(chǎn)品設(shè)備、MQTT登錄參數(shù)都到位了,接下來(lái)需要了解設(shè)備向服務(wù)器上報(bào)數(shù)據(jù)時(shí),如何上報(bào),格式是怎么樣的。
(1)第一個(gè)問(wèn)題是:華為云IoT物聯(lián)網(wǎng)服務(wù)器的IP和端口號(hào)是多少?
在總覽選項(xiàng)頁(yè)面,點(diǎn)擊多協(xié)議接入選項(xiàng),就能看到了。
如果選擇MQTT協(xié)議接入:
域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
如果你的設(shè)備不能解析域名,也可以直接填I(lǐng)P地址 121.36.42.100
端口號(hào): 1883
(2)第二個(gè)問(wèn)題是:發(fā)布數(shù)據(jù)的主題和訂閱數(shù)據(jù)的主題怎么填?
在產(chǎn)品頁(yè)面,選擇自己的產(chǎn)品,進(jìn)去之后就能看到主題的格式介紹頁(yè)面了。
為了方便后續(xù)復(fù)制粘貼,這里總結(jié)下格式:
火警預(yù)警裝置:
格式: $oc/devices/{device_id}/sys/messages/down
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/messages/down
?
?
格式: $oc/devices/{device_id}/sys/properties/report
//設(shè)備上報(bào)數(shù)據(jù)
$oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/properties/report
滅火裝置:
格式: $oc/devices/{device_id}/sys/messages/down
//訂閱主題: 平臺(tái)下發(fā)消息給設(shè)備
$oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/messages/down
?
?
格式: $oc/devices/{device_id}/sys/properties/report
//設(shè)備上報(bào)數(shù)據(jù)
$oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/properties/report
(3)第三個(gè)問(wèn)題是:上報(bào)屬性時(shí),數(shù)據(jù)格式是什么?
官方文檔介紹: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html
總結(jié)下格式: 上報(bào)的數(shù)據(jù)就是JSON格式,一次性可以上傳多個(gè)屬性數(shù)據(jù),JSON數(shù)組里按照順序增加即可。
重要的字段含義解釋:這兩個(gè)字段后面的數(shù)據(jù)需要自己根據(jù)自己的設(shè)備產(chǎn)品去填充的。
service_id 示設(shè)備服務(wù)的ID。
?
properties 是設(shè)備服務(wù)的屬性列表,具體字段在設(shè)備關(guān)聯(lián)的產(chǎn)品模型中定義。
火警預(yù)警裝置上傳的數(shù)據(jù):
{"services": [{"service_id": "MQ2","properties":{"MQ2":100}}]}
滅火裝置上傳的數(shù)據(jù):
{"services": [{"service_id": "motor","properties":{"motor":1}}]}
8. 使用MQTT客戶端模擬設(shè)備測(cè)試
(1)登錄火警預(yù)警裝置
(2)滅火裝置登錄
可以看到,設(shè)備已經(jīng)成功登錄服務(wù)器,完成了數(shù)據(jù)上報(bào)。這也證明服務(wù)器端設(shè)備創(chuàng)建已經(jīng)全部OK,正常。
9. 配置設(shè)備聯(lián)動(dòng)
(1)創(chuàng)建規(guī)則
(2)填寫規(guī)則信息
(3)添加觸發(fā)條件,選擇需要處理數(shù)據(jù)的設(shè)備,設(shè)置條件:當(dāng)煙霧濃度大于等于100就觸發(fā)
(4)添加執(zhí)行動(dòng)作,當(dāng)煙霧濃度超過(guò)100就下發(fā)指令給滅火裝置
(3)最后點(diǎn)擊創(chuàng)建規(guī)則,生效規(guī)則
(4)測(cè)試效果
使用兩個(gè)MQTT客戶端分別模擬火警預(yù)警裝置和滅火裝置,當(dāng)煙霧濃度超過(guò)100時(shí),查看滅火裝置是否收到云端下發(fā)的指令。
10. 數(shù)據(jù)轉(zhuǎn)發(fā)
如果數(shù)據(jù)需要轉(zhuǎn)發(fā)到其他地方,可以自己創(chuàng)建規(guī)則配置。
11. 硬件設(shè)備測(cè)試
設(shè)備端采用GSM模塊SIM800C完成上網(wǎng)功能,主控MCU采用STM32F103ZET6。
任意只要能上網(wǎng)的設(shè)備都可以使用當(dāng)前代碼連接服務(wù)器,因?yàn)楫?dāng)前模擬的是戶外設(shè)備,只能采用GSM模塊上網(wǎng)。
如果是智能家居,屋里小區(qū)的設(shè)備,有WIFI的可以采用ESP8266這些無(wú)線網(wǎng)卡。
項(xiàng)目工程源碼: https://download.csdn.net/download/xiaolong1126626497/81993720
1. SIM800C.c
這是SIM800C的配置代碼
#include "sim800c.h"
?
/*
函數(shù)功能:向SIM800C模塊發(fā)送指令
函數(shù)參數(shù):
char *cmd 發(fā)送的命令
char *check_data 檢測(cè)返回的數(shù)據(jù)
返回值: 0表示成功 1表示失敗
*/
u8 SIM800C_SendCmd(char *cmd,char *check_data)
{
u16 i,j;
for(i=0;i< 5;i++) //測(cè)試的總次數(shù)
{
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
USART_X_SendString(USART2,cmd); //發(fā)送指令
for(j=0;j< 500;j++) //等待的時(shí)間(ms單位)
{
if(USART2_RX_FLAG)
{
USART2_RX_BUFF[USART2_RX_CNT]='\\0';
if(strstr((char*)USART2_RX_BUFF,check_data))
{
return 0;
}
else break;
}
delay_ms(20); //一次的時(shí)間
}
}
return 1;
}
?
?
/*
函數(shù) 功能:GSM模塊初始化檢測(cè)
函數(shù)返回值:1表示模塊檢測(cè)失敗,0表示成功
*/
u8 SIM800C_InitCheck(void)
{
if(SIM800C_SendCmd("AT\\r\\n","OK"))return 1;
else printf("SIM800模塊正常!\\r\\n");
if(SIM800C_SendCmd("ATE0\\r\\n","OK"))return 2;
else printf("設(shè)置模塊不回顯成功!\\r\\n");
if(SIM800C_SendCmd("AT+CGMI\\r\\n","OK"))return 3;
else printf("查詢制造商名稱成功!%s\\r\\n",USART2_RX_BUFF);
if(SIM800C_SendCmd("AT+CGMM\\r\\n","OK"))return 4;
else printf("查詢模塊型號(hào)成功!%s\\r\\n",USART2_RX_BUFF);
DelayMs(1000);
DelayMs(1000);
if(SIM800C_SendCmd("AT+CNUM\\r\\n","+CNUM:"))return 5;
else printf("獲取本機(jī)號(hào)碼成功!%s\\r\\n",USART2_RX_BUFF);
/* 返回格式如下:
+CNUM: "","+8613086989413",145,7,4
OK
*/
return 0;
}
?
/*
函數(shù) 功能:GSM模塊短信模式設(shè)置
函數(shù)返回值:0表示模塊設(shè)置成功
*/
u8 SIM800C_SetNoteTextMode(void)
{
if(SIM800C_SendCmd("AT+CSCS="GSM"\\r\\n","OK"))return 1;// "GSM"字符集
else printf("短信GSM字符集設(shè)置成功!\\r\\n");
if(SIM800C_SendCmd("AT+CMGF=1\\r\\n","OK"))return 2; //文本模式
else printf("短信文本模式設(shè)置成功!\\r\\n");
return 0