一、項(xiàng)目背景
隨著全球經(jīng)濟(jì)的快速發(fā)展和城市化進(jìn)程加快,園區(qū)建設(shè)數(shù)量不斷增加,園區(qū)運(yùn)營(yíng)管理面臨的節(jié)能減排壓力也在不斷增加。傳統(tǒng)的園區(qū)節(jié)能減排管理方式存在著效率低下、監(jiān)控?cái)?shù)據(jù)不準(zhǔn)確等問(wèn)題,無(wú)法滿足節(jié)能減排管理的需求。
為解決這一問(wèn)題,智能園區(qū)節(jié)能減排監(jiān)控系統(tǒng)應(yīng)運(yùn)而生。該系統(tǒng)利用物聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等技術(shù)手段,實(shí)現(xiàn)對(duì)園區(qū)的能耗、排放等數(shù)據(jù)進(jìn)行實(shí)時(shí)監(jiān)測(cè)、分析和預(yù)測(cè),幫助園區(qū)管理者及時(shí)發(fā)現(xiàn)并解決節(jié)能減排問(wèn)題,提高園區(qū)運(yùn)營(yíng)效率和節(jié)能減排水平。
通過(guò)智能園區(qū)節(jié)能減排監(jiān)控系統(tǒng)項(xiàng)目,可以有效提升園區(qū)節(jié)能減排管理的科學(xué)化、精細(xì)化水平,助力園區(qū)實(shí)現(xiàn)可持續(xù)發(fā)展目標(biāo)。
二、項(xiàng)目目標(biāo)
1.采集溫度、濕度、光照值,并上傳OneNET平臺(tái)
2.實(shí)現(xiàn)公共區(qū)域照明系統(tǒng)的燈光自動(dòng)控制,當(dāng)光照充足時(shí),照明燈熄滅,光照較暗時(shí),照 明燈開(kāi)啟。(LED模擬照明燈,通過(guò)HTTP數(shù)據(jù)推送將光照值推送給應(yīng)用程序,由應(yīng)用程序 調(diào)用API控制LED開(kāi)關(guān))
三、實(shí)驗(yàn)步驟
1.添加代碼
(1)增加光照模塊和LED模塊的頭文件
#include "BH1750.h" /* 光照傳感器 */
#include "Lcd_Driver.h"/*lcd屏*/
(2)聲明變量
nbiot_value_t illumi; /*光照*/
nbiot_value_t led; /*LED燈*/
extern float result_lx;/*光照*/
(3)編寫(xiě)“讀”回調(diào)函數(shù),平臺(tái)發(fā)送讀取資源命令時(shí)進(jìn)行響應(yīng)
uint16_t objid,
uint16_t instid,
uint16_t resid,
nbiot_value_t *data)
{
if (objid == 3303 && instid == 0 && resid == 5700) { /* 溫度 */
SHT20_INFO sht20 = { 0 };
sht20 = SHT20_GetValue();
temp.value.as_float = sht20.tempreture;
} else if (objid == 3304 && instid == 0 && resid == 5700) { /* 濕度 */
SHT20_INFO sht20 = { 0 };
sht20 = SHT20_GetValue();
humi.value.as_float = sht20.humidity;
}else if (objid == 3301 && instid == 0 && resid == 5700) { /* 光 照 */
BH1750_test();
illumi.value.as_float = result_lx;
} else if (objid == 3311 && instid == 0 && resid == 5850) { /* LED */
led.value.as_bool = ledStatus.Led1Sta;
}
}
(4)編寫(xiě)“寫(xiě)”回調(diào)函數(shù),實(shí)現(xiàn)對(duì)平臺(tái)發(fā)送的LED燈控制命令的響應(yīng)
void write_callback(
uint16_t objid,
uint16_t instid,
uint16_t resid,
nbiot_value_t *data)
{
printf("write /%d/%d/%d:%d\r\n",
objid,
instid,
resid, data->value.as_bool);
if(objid == 3311 && instid ==0 && resid ==5850)/*LED燈*/
{
if(data->value.as_bool)
{
//打開(kāi)白色背景光以模擬LED燈開(kāi)
Lcd_Clear(WHITE);
ledStatus.Led1Sta=1;
}
else
{
//打開(kāi)黑色背景光以模擬LED燈關(guān)
Lcd_Clear(BLACK);
ledStatus.Led1Sta=0;
}
}
}
(5)修改網(wǎng)絡(luò)配置,修改引導(dǎo)機(jī)服務(wù)地址,”,這里,必須在代碼中將 IMEI 和 IMSI 改
成跟OneNET 平臺(tái)上的一樣。這樣,就可以實(shí)現(xiàn)真實(shí)設(shè)備與OneNET 平臺(tái)上的虛擬設(shè)備一對(duì)一映射
char uri[] = "coap://183.230.40.40:5683"; // 引導(dǎo)機(jī)服務(wù)
char *serv_addr = "183.230.102.118"; // 接入機(jī) IP 地址
const char endpoint_name[] = "282221995033272;888"; // IMEI;IMSI
(6)增加光照值、LED 數(shù)值的讀取更新
/* 更新光照數(shù)值 */
illumi.flag |= NBIOT_UPDATED;
BH1750_test();
illumi.value.as_float = result_lx;
/* 更新 LED 數(shù)值*/
led.flag |= NBIOT_UPDATED;
led.value.as_bool = ledStatus.Led1Sta;
} else if (cur_time == 0 && last_time == 0) {
cur_time = nbiot_time();
last_time = cur_time;
} else {
cur_time = nbiot_time();
}
}
(7)增加光照、LED 資源
// 添加光照資源
illumi.type = NBIOT_FLOAT;
illumi.flag = NBIOT_READABLE;
ret = nbiot_resource_add(dev,
3301,
0,
5700,
&illumi);
if (ret)
{
nbiot_device_destroy(dev);
printf("device add resource(illumi) failed, code = %d.\r\n", ret);
}
// 添加 LED 燈資源
led.type = NBIOT_BOOLEAN;
led.flag = NBIOT_READABLE | NBIOT_WRITABLE;
ret = nbiot_resource_add(dev,
3311,
0,
5850,
&led);
if (ret)
{
nbiot_device_destroy(dev);
printf("device add resource(led) failed, code = %d.\r\n", ret);
}
2.云平臺(tái)添加設(shè)備與資源

3.設(shè)備接入平臺(tái)

4.平臺(tái)對(duì)LED燈控制
LED燈的資源類(lèi)型為boolean型,該類(lèi)型的變量只能是True或是False,因此,開(kāi)燈使用“true”,關(guān) 燈使用“false”

5.使用“Token計(jì)算器”,生成設(shè)備接入的鑒權(quán)信息
注意輸入時(shí)不要有空格,不然會(huì)出現(xiàn)錯(cuò)誤

6.通過(guò)Postman 進(jìn)行API測(cè)試
(1)新建Collection,建立Collection可以方便管理同一個(gè)項(xiàng)目中的HTTP請(qǐng)求

(2)新建Request請(qǐng)求,命名為:“即時(shí)命令-設(shè)備資源列表獲取”,并保存在上一步中 的Collection中。
(3)Request請(qǐng)求行配置 請(qǐng)求方法設(shè)置為“GET”。 URL主體為“https://iot-api.heclouds.com/nb-iot/resources”;該接口用于獲取設(shè)備資源列表
(4)Request頭部行Headers配置 配置頭部Headers,添加頭部字段authorization,其值為計(jì)算得到的 Token值

(5)讀設(shè)備資源
Request的請(qǐng)求方式、URL以及首部字段authorization的配置跟之前一樣。 URL參數(shù)有所變化:action為read,表示讀取設(shè)備資源;配置設(shè)備的IMEI和設(shè)備的 obi_id ,其中 obi_id 根據(jù)要讀取的資源類(lèi)型來(lái)確定。例如根據(jù)IPSO 規(guī)范,溫度傳感器 的Object ID為 3303,濕度傳感器為 3304,LED燈為3301。這里獲取的是LED燈的資源信息,所以URL參數(shù)中 obi_id 的值為3301。

(6)寫(xiě)設(shè)備資源
Request請(qǐng)求方法設(shè)置為“POST”,URL主體跟之前一樣; URL參數(shù)配置:參數(shù)action為write,表示寫(xiě)設(shè)備資源,配置IMEI、obj_id、obj_inst_id 及mode等參數(shù); 請(qǐng)求頭部行Headers配置:authorization 配置跟之前一樣,而Content-Type設(shè)置為 application/json,表示請(qǐng)求消息實(shí)體主體Body內(nèi)容是JSON格式; 請(qǐng)求實(shí)體主體Body填寫(xiě)。點(diǎn)擊 Body 選項(xiàng),選擇raw形式編輯,以JSON格式書(shū)寫(xiě),設(shè) 置資源ID即res_id為5850,IPSO模型中5850代表燈的開(kāi)關(guān)狀態(tài)屬性,其值val為1時(shí)代 表開(kāi)燈,為0 時(shí)代表關(guān)燈。

(7)發(fā)送請(qǐng)求并查看響應(yīng)消息 配置完畢后,點(diǎn)擊“Send”按鈕發(fā)送請(qǐng)求。當(dāng)請(qǐng)求成功時(shí),Status顯示響應(yīng)碼“200 0K’ 服務(wù)器會(huì)以JSON格式返回響應(yīng)消息,但是只有當(dāng)error值為“succ”時(shí)才真正代表平臺(tái)資源列表獲取成功。

7.云平臺(tái)查看命令下發(fā)日志

8.使用 HTTP 數(shù)據(jù)推送自動(dòng)開(kāi)關(guān) LED 燈
(1)打開(kāi)燈光推送應(yīng)用用戶門(mén)戶,以O(shè)neNET注冊(cè)用戶的 用戶id 和用戶AcessKey 登陸門(mén)戶地址:http://1.14.71.134:8080/

注意:
1、首次登陸,會(huì)提示該用戶id未使用記錄,需要再次輸入相同的用戶id和用戶AcessKey,登陸即可成功。


(2)需要使用本人在OneNET注冊(cè)用戶的 用戶id 和用戶AcessKey,如填錯(cuò),則使用燈光控制功能會(huì)因?yàn)殍b權(quán)錯(cuò)誤而功能失敗。具體的信息在OneNET官網(wǎng)(用戶中心-訪問(wèn)權(quán)限頁(yè)面),用戶id為6位數(shù)字,AcessKey需點(diǎn)擊查看:

(3)綁定NB-IoT設(shè)備的IMEI號(hào)
進(jìn)入“我的物聯(lián)網(wǎng)”-“設(shè)備”菜單頁(yè)面,填寫(xiě)IMEI號(hào)(用于數(shù)據(jù)推送時(shí)匹配),點(diǎn)擊確定完成綁定。

(4)實(shí)例創(chuàng)建
進(jìn)入OneNET物聯(lián)網(wǎng)開(kāi)放平臺(tái)“開(kāi)發(fā)者中心”,選擇菜單欄中的【數(shù)據(jù)流轉(zhuǎn)】下的【資源管理】,點(diǎn)擊【HTTP推送實(shí)例】,每個(gè)實(shí)例對(duì)應(yīng)一個(gè)HTTP的推送配置。點(diǎn)擊【添加實(shí)例】,填寫(xiě)實(shí)例名稱(chēng)、推送地址、Token等信息,完成實(shí)例新增

(5)實(shí)例驗(yàn)證
實(shí)例創(chuàng)建成功后,下一步進(jìn)行實(shí)例驗(yàn)證。實(shí)例列表頁(yè)面,點(diǎn)擊【驗(yàn)證】,平臺(tái)服務(wù)器會(huì)向配置的服務(wù)器地址發(fā)送HTTP GET請(qǐng)求,進(jìn)行地址有效性驗(yàn)證,只有驗(yàn)證成功了,平臺(tái)才會(huì)向其推送數(shù)據(jù)

(6)觀察光照數(shù)值變化與LCD模塊顏色狀態(tài)的變化
接下來(lái)觀察LCD的變化,確保設(shè)備在線的情況下,當(dāng) NB-IoT 設(shè)備上下線、上報(bào)新數(shù)據(jù)時(shí),應(yīng)用服務(wù)器就能夠獲得這些數(shù)據(jù),當(dāng)數(shù)據(jù)上報(bào)時(shí),程序會(huì)解析其中的光照度數(shù)據(jù),并且根據(jù)預(yù)設(shè)的閾值,對(duì) LCD 燈進(jìn)行控制。
-1.室內(nèi)照明情況下,LCD模塊應(yīng)處于“關(guān)閉”狀態(tài)(顏色程序編寫(xiě)的“關(guān)”狀態(tài)顏色)
-2.用物體遮擋光照傳感器模塊(約30秒),LCD模塊應(yīng)處于“開(kāi)啟”狀態(tài)(顏色程序編寫(xiě)的“開(kāi)”狀態(tài)顏色)
-3.拿開(kāi)遮蓋物,約30秒后,LCD模塊應(yīng)處于“關(guān)閉”狀態(tài)(顏色程序編寫(xiě)的“關(guān)”狀態(tài)顏色)
(7)同時(shí)可在平臺(tái)上通過(guò)查看實(shí)例獲得推送數(shù)據(jù)統(tǒng)計(jì),進(jìn)入【資源管理】下的【HTTP推送實(shí)例】,點(diǎn)擊【管理】,可查看實(shí)例的基本信息、推送數(shù)據(jù)統(tǒng)計(jì)、近一月數(shù)據(jù)趨勢(shì)。至此,數(shù)據(jù)推送完成。
