???智慧小區(qū)安全防護(hù)系統(tǒng)——真實(shí)設(shè)備接入報(bào)告
???????????????????楊小龍
1.項(xiàng)目背景
隨著時(shí)代的進(jìn)步與科學(xué)技術(shù)的快速發(fā)展,我們對(duì)于智慧化的生活越來(lái)越需要,而我們更需要的是安全,安全的重要性不言而喻。智能小區(qū)的建設(shè)融合了一系列現(xiàn)代化高新技術(shù),是IC卡技術(shù)、通信技術(shù)、計(jì)算機(jī)技術(shù)經(jīng)過(guò)深度融合與集成之后而形成的一種結(jié)果,同時(shí)也是社會(huì)發(fā)展、時(shí)代進(jìn)步、科學(xué)技術(shù)水平提升環(huán)境下的必然產(chǎn)物。智能小區(qū)使用多種高科技手段,達(dá)到防火、防盜、防煤氣泄漏等安全要求,小區(qū)本身的安防系統(tǒng)建立采取點(diǎn)、線和面的立體防護(hù),確保做到“防患于未然”。讓智能小區(qū)里的住戶擁有居家安全感。
2.項(xiàng)目目標(biāo)
1、基于真實(shí)設(shè)備,搭建軟硬件環(huán)境,接入 OneNET 平臺(tái)并實(shí)現(xiàn)設(shè)備屬性上報(bào);
2、通過(guò) OneNET 平臺(tái)的“設(shè)備調(diào)試”實(shí)現(xiàn)設(shè)備屬性下發(fā);
3、通過(guò) OneNET 平臺(tái)的“API 調(diào)試”實(shí)現(xiàn)設(shè)備屬性下發(fā);
4、直接基于 API 方式實(shí)現(xiàn)設(shè)備屬性下發(fā);
3.項(xiàng)目步驟
第一步:基于 OneNET 物聯(lián)網(wǎng)實(shí)驗(yàn)箱搭建實(shí)訓(xùn)項(xiàng)目終端硬件平臺(tái)
在實(shí)驗(yàn)箱背板上插入這四個(gè)模塊(“核心模塊”、“Wifi 模塊”、“蜂鳴器模塊”、 “超
聲波模塊”)搭建場(chǎng)景。

第二步:在Keil5中修改項(xiàng)目三代碼
步驟一:
工程相對(duì)路徑\device\src\net_device.c 約 677 行處,將{熱點(diǎn)名稱}、{熱點(diǎn)密碼}替換為設(shè)備所在 Wifi 網(wǎng)絡(luò)用戶名和密碼(將{}括號(hào)一起替換,下同);

步驟二:
工程相對(duì)路徑\onenet\src\onenet.c 約 56 行處,依次修改{產(chǎn)品key}、{產(chǎn)品 id}、{設(shè)備名稱}為之前步驟中在 OneNET Studio 中所創(chuàng)建的產(chǎn)品、設(shè)備相關(guān)信息,本例中設(shè)備名稱就是之前步驟中創(chuàng)建的“controller”設(shè)備,并對(duì)應(yīng)填入其設(shè)備密鑰;

步驟三:
工程相對(duì)路徑\applications\application.c 約 132 行處,增加屬性點(diǎn)標(biāo)識(shí)符以及對(duì)應(yīng)需上報(bào)的設(shè)備數(shù)據(jù)變量,如下所示;
{"beep", &beep_info.beep_status[0], TYPE_BOOL, 1},
{"distance",&Sonic_Info.sonic_distance,TYPE_FLOAT,1},

步驟四:
工程相對(duì)路徑\onenet\src\cmd_callback.c 約 51 行處,添加代碼“{“beep”,CALLBACK_Beep},”,逗號(hào)前面的字符串標(biāo)識(shí)符為"beep",逗號(hào)后的處理方法名為 CALLBACK_Beep。

步驟五:
同時(shí)在該文件頭部,增加void CALLBACK_Beep(int value);這樣的方法聲明

步驟六:
在文件適當(dāng)位置增加該方法的具體實(shí)現(xiàn)邏輯代碼:

第三步:編譯工程,連接下載器燒寫(xiě)程序到設(shè)備中
下載器的連接以及燒寫(xiě)過(guò)程略。下載成功后設(shè)備重新加電,等待一定時(shí)間,進(jìn)入下一步。
第四步: 在OneNET 平臺(tái)查看設(shè)備狀態(tài)
登錄 OneNET Studio,查看“controller”設(shè)備運(yùn)行狀態(tài)為在線。若此時(shí)設(shè)備顯示為不在線,則排查前面關(guān)于網(wǎng)絡(luò)接入、OneNET 鑒權(quán)等代碼修改處是否有誤。重復(fù)步驟 3、4、5,再次檢查并修改,直到本步驟查看狀態(tài)為上線。
第五步:在OneNET 平臺(tái)查看設(shè)備上報(bào)數(shù)據(jù)信息
進(jìn)入設(shè)備詳情頁(yè)面,查看屬性表格頁(yè)展示的各個(gè)數(shù)據(jù)點(diǎn)顯示的信息,重點(diǎn)關(guān)注距離(標(biāo)識(shí)符“distance”)、蜂鳴器狀態(tài)(標(biāo)識(shí)符“beep”)等屬性點(diǎn),是否已經(jīng)有數(shù)值上報(bào)。(下圖僅為示例參考)

第六步:通過(guò) OneNETStudio 的設(shè)備調(diào)試方式進(jìn)行屬性下發(fā)
選擇MQTT產(chǎn)品下的 “controller” 設(shè)備,切換調(diào)試方式為 “應(yīng)用模擬器”。

勾選蜂鳴器功能點(diǎn),點(diǎn)擊true下發(fā)數(shù)值,再點(diǎn)擊頁(yè)面下方的“屬性設(shè)置”按鈕,右側(cè)調(diào)試日志展示了下發(fā)的報(bào)文,設(shè)備端也同時(shí)將該數(shù)值執(zhí)行生效(蜂鳴器開(kāi)始鳴叫)。

注 1:如設(shè)備端沒(méi)有生效,需要分析上一實(shí)訓(xùn)任務(wù)中,有關(guān)屬性下發(fā)的命令執(zhí)行代碼是否正確添加。
注 2:調(diào)試日志中會(huì)有超時(shí)等響應(yīng)報(bào)文,這是因?yàn)樵O(shè)備收到屬性下發(fā)后沒(méi)有在規(guī)定時(shí)間內(nèi)返回確認(rèn),OneNET 平臺(tái)會(huì)認(rèn)為設(shè)備響應(yīng)超時(shí)從而給 API 請(qǐng)求端回復(fù)超時(shí)報(bào)文。
注 3:設(shè)備執(zhí)行屬性設(shè)置動(dòng)作后,可以修改設(shè)置值為“false”, 再次下發(fā),使設(shè)備端生效新的值。
第七步:下發(fā)屬性在終端設(shè)備上執(zhí)行生效(API 調(diào)試)
點(diǎn)擊“運(yùn)維監(jiān)控”菜單下“API 調(diào)試”子菜單,并將工作頁(yè)面左列顯示的兩大類調(diào)試類別中“應(yīng)用開(kāi)發(fā)類”下拉列表展開(kāi)。往下滾動(dòng)到“設(shè)備屬性設(shè)置”功能項(xiàng),點(diǎn)擊使之處于選中狀態(tài),在中間一列展示的必填參數(shù)中,填寫(xiě)頁(yè)面中輸入必要的參數(shù),如下圖所示,本次任務(wù)中,填入真實(shí)接入的設(shè)備“controller”所對(duì)應(yīng)的相關(guān)信息,同時(shí)其中的 params 內(nèi)容填寫(xiě)要設(shè)置的屬性標(biāo)識(shí)符以及對(duì)應(yīng)設(shè)置值,本次任務(wù)中設(shè)置蜂鳴器狀態(tài)為 false,文本示例參考:
{
"beep": false
}
設(shè)備端蜂鳴器收到命令關(guān)閉

第八步:基于 API 方式實(shí)現(xiàn)設(shè)備屬性下發(fā)
步驟一 使用API調(diào)試工具Postman,并填入必要參數(shù):
(1)確定設(shè)備屬性設(shè)置的請(qǐng)求方式為 post,請(qǐng)求 url 為:
http://openapi.heclouds.com/application?action=SetDeviceProperty&version=1
填入到 Postman 工具上面頁(yè)面的請(qǐng)求 url 輸入框中,修改左側(cè)請(qǐng)求提交方式是 POST

(2)確定請(qǐng)求 body 內(nèi)容及格式,project_id、product_id、device_name 等關(guān)鍵參數(shù)的值均可參考前述任務(wù)中相同的查看方式通過(guò) OneNET Studio 頁(yè)面獲得,以鍵值對(duì)形式將上述需要設(shè)置的具體參數(shù)組裝為 body 報(bào)文內(nèi)容,最終填入 Postman 工具的 Body 選項(xiàng)頁(yè)內(nèi)。
{
"project_id": "gZtv5W",
"product_id": "I971NKjoBg",
"device_name": "controller",
"params": {
"beep": true
}
}

(3)確定請(qǐng)求的 Header 內(nèi)容,這里需要一個(gè)向 OneNET 平臺(tái)鑒權(quán)所需的必要信息字段,就是“authorization ”信息(注意大小寫(xiě)須一致),該信息可以使用“token計(jì)算工具”生成,生成方式如下圖:

補(bǔ)充Headers其余內(nèi)容。

步驟二 發(fā)起 API 請(qǐng)求,查看結(jié)果:
發(fā)起請(qǐng)求前確認(rèn)當(dāng)前真實(shí)設(shè)備已在線,以蜂鳴器屬性值(beep)下發(fā)為例,通過(guò)postman 發(fā)起請(qǐng)求,通過(guò)平臺(tái)鑒權(quán)后,該請(qǐng)求會(huì)下發(fā)到對(duì)應(yīng)的真實(shí)設(shè)備,打開(kāi)蜂鳴器開(kāi)關(guān),蜂鳴器會(huì)按照程序里預(yù)置的邏輯進(jìn)行鳴響。

更改“beep”屬性值為false
{
"project_id": "gZtv5W",
"product_id": "I971NKjoBg",
"device_name": "controller",
"params": {
"beep": false
}
}
發(fā)送請(qǐng)求后蜂鳴器會(huì)按照程序預(yù)置的邏輯關(guān)閉鳴響

第九步:基于 OneNET 云平臺(tái)的場(chǎng)景聯(lián)動(dòng)
步驟一 進(jìn)入 OneNET Studio 場(chǎng)景聯(lián)動(dòng)管理功能:
進(jìn)入 OneNET Studio 控制臺(tái)頁(yè)面,直接在“Studio 使用概覽”中點(diǎn)擊“我的項(xiàng)目”下已建立的項(xiàng)目名進(jìn)入項(xiàng)目管理功能。

注:如用戶沒(méi)有創(chuàng)建過(guò)有關(guān)項(xiàng)目,OneNET Studio 提示需先創(chuàng)建項(xiàng)目,可參考之前實(shí)訓(xùn)任務(wù) 1 拓展任務(wù)中有關(guān)項(xiàng)目管理的操作步驟完成項(xiàng)目創(chuàng)建、設(shè)備添加等準(zhǔn)備工作后,進(jìn)入下一個(gè)實(shí)訓(xùn)環(huán)節(jié)。
然后直接點(diǎn)擊“場(chǎng)景聯(lián)動(dòng)”子菜單,進(jìn)入場(chǎng)景聯(lián)動(dòng)管理功能頁(yè)面。

步驟二 創(chuàng)建場(chǎng)景聯(lián)動(dòng)規(guī)則:
點(diǎn)擊功能頁(yè)面右側(cè)“添加規(guī)則”按鈕,在滑出的頁(yè)面規(guī)則名稱中輸入“距離探測(cè)告警”,點(diǎn)擊“添加”按鈕完成規(guī)則創(chuàng)建。

步驟三 編輯距離探測(cè)告警的聯(lián)動(dòng)規(guī)則:
點(diǎn)擊創(chuàng)建好的這條規(guī)則的操作列中“編輯規(guī)則”功能入口,進(jìn)入具體編輯頁(yè)面,因?yàn)槭浅醮芜M(jìn)入,這里展示的觸發(fā)條件以及執(zhí)行動(dòng)作內(nèi)容為空,點(diǎn)擊右側(cè)的“編輯規(guī)則”按鈕,
在滑出的頁(yè)面中具體編輯:
首先編輯觸發(fā)條件:
(1)執(zhí)行限制:滿足全部條件執(zhí)行
(2)觸發(fā)方式:“設(shè)備數(shù)據(jù)觸發(fā)”
(3)產(chǎn)品:之前實(shí)訓(xùn)任務(wù)中創(chuàng)建的產(chǎn)品
(4)設(shè)備:之前加入到項(xiàng)目里的“controller”
(5)功能:之前物模型中的“間隔距離”屬性點(diǎn)
(6)數(shù)值判斷條件:邏輯判斷選“<”,數(shù)值填入“5”

其次編輯執(zhí)行動(dòng)作:
(1)動(dòng)作類型:選擇“設(shè)備執(zhí)行”
(2)產(chǎn)品:之前實(shí)訓(xùn)任務(wù)中創(chuàng)建的產(chǎn)品
(3)設(shè)備:之前加入到項(xiàng)目里的“controller”
(4)功能:之前物模型中的“蜂鳴器”屬性點(diǎn)
(5)布爾:選擇“true - 1”
最后點(diǎn)擊“完成”按鈕,確認(rèn)本次編輯內(nèi)容。

步驟四 再新增一個(gè)聯(lián)動(dòng)規(guī)則,實(shí)現(xiàn)距離安全時(shí)取消告警:
參考步驟 2 描述,再新增一個(gè)聯(lián)動(dòng)規(guī)則,名稱可以為“距離安全取消告警”。
參考步驟 3 描述,編輯該規(guī)則的具體條件及動(dòng)作,參考如下:
編輯觸發(fā)條件:
(1)執(zhí)行限制:滿足全部條件執(zhí)行
(2)觸發(fā)方式:“設(shè)備數(shù)據(jù)觸發(fā)”
(3)產(chǎn)品:之前實(shí)訓(xùn)任務(wù)中創(chuàng)建的產(chǎn)品
(4)設(shè)備:之前加入到項(xiàng)目里的“controller”
(5)功能:之前物模型中的“間隔距離”屬性點(diǎn)
(6)數(shù)值判斷條件:邏輯判斷選“>”,數(shù)值填入“10”

編輯執(zhí)行動(dòng)作:
(1)動(dòng)作類型:選擇“設(shè)備執(zhí)行”
(2)產(chǎn)品:之前實(shí)訓(xùn)任務(wù)中創(chuàng)建的產(chǎn)品
(3)設(shè)備:之前加入到項(xiàng)目里的“controller”
(4)功能:之前物模型中的“蜂鳴器”屬性點(diǎn)
(5)布爾:選擇“false - 0”
最后點(diǎn)擊“完成”按鈕,確認(rèn)本次編輯內(nèi)容。

步驟五 設(shè)備上線,觀察場(chǎng)景實(shí)現(xiàn)效果:

近距離遮擋超聲波模塊的距離探測(cè)器探頭,稍等一定時(shí)間后,蜂鳴器模塊鳴叫,移開(kāi)超聲波模塊遮擋,約 15 秒鐘后,蜂鳴器模塊停止鳴叫。
注:如設(shè)備未按場(chǎng)景聯(lián)動(dòng)的規(guī)則邏輯執(zhí)行,可通過(guò)規(guī)則頁(yè)面的“聯(lián)動(dòng)日志查詢”tab 頁(yè)查看具體原因。響應(yīng)日志會(huì)有 Fail 的失敗日志,這是因?yàn)閳?chǎng)景聯(lián)動(dòng)觸發(fā)后,執(zhí)行的屬性下發(fā)后沒(méi)有在規(guī)定時(shí)間內(nèi)收到設(shè)備端的執(zhí)行返回確認(rèn)(該部分代碼在示例工程代碼中未實(shí)現(xiàn)),OneNET 平臺(tái)會(huì)認(rèn)為設(shè)備響應(yīng)超時(shí)從而判斷為失敗。
4.項(xiàng)目總結(jié)
在本次項(xiàng)目實(shí)驗(yàn)中,基于真實(shí)設(shè)備接入 OneNET 平臺(tái),實(shí)現(xiàn)了通過(guò)OneNET 平臺(tái)對(duì)設(shè)備屬性下發(fā)并且還實(shí)現(xiàn)了直接基于 API 方式實(shí)現(xiàn)設(shè)備屬性下發(fā)。通過(guò)拓展實(shí)訓(xùn)部分體驗(yàn)了基于 OneNET 云平臺(tái)的場(chǎng)景聯(lián)動(dòng)。經(jīng)過(guò)這次的實(shí)驗(yàn)使得我對(duì)OneNET云平臺(tái)的使用更加熟練,對(duì)實(shí)驗(yàn)實(shí)施的流程思路更清晰。也讓我明白了OneNET云平臺(tái)還有更多的功能等著我去探索。