當(dāng)前位置:全球資源網(wǎng) > 技術(shù)中心 > 所有分類
目錄
本文檔主要介紹如何將星縱物聯(lián)網(wǎng)關(guān)通過MQTT方式對接到阿里云的物聯(lián)網(wǎng)平臺,并且通過MQTT主題將傳感器數(shù)據(jù)發(fā)布到平臺。在進(jìn)行本文檔操作之前,需要先參考用戶手冊將LoRaWAN®節(jié)點(diǎn)添加至網(wǎng)關(guān)內(nèi)置網(wǎng)絡(luò)服務(wù)器中并成功令節(jié)點(diǎn)設(shè)備上線及數(shù)據(jù)正常上報(bào)。
阿里云企業(yè)物聯(lián)網(wǎng)平臺地址:
在左側(cè)導(dǎo)航欄,選擇“設(shè)備管理 > 產(chǎn)品”,單擊創(chuàng)建產(chǎn)品。所屬品類、節(jié)點(diǎn)類型、數(shù)據(jù)格式參照下圖設(shè)置,其他根據(jù)實(shí)際需求填寫。
設(shè)備歸屬于某個產(chǎn)品下的具體設(shè)備。阿里云物聯(lián)網(wǎng)平臺為設(shè)備頒發(fā)產(chǎn)品內(nèi)的證書 DeviceName。
網(wǎng)關(guān)MQTT接入物聯(lián)網(wǎng)平臺前需要提前獲取MQTT接入信息(MQTT服務(wù)器地址、MQTT服務(wù)端口、客戶端ID、用戶名/密碼)。
選擇“設(shè)備管理 > 設(shè)備”,查看對應(yīng)設(shè)備,點(diǎn)擊MQTT連接參數(shù),即可獲取接入信息。
注意:阿里云平臺采用一機(jī)一密制度,如果網(wǎng)關(guān)上需要添加新的傳感器設(shè)備,需要先創(chuàng)建新的應(yīng)用及MQTT連接,并使新添加的設(shè)備綁定新創(chuàng)建的應(yīng)用,該應(yīng)用使用阿里云上新的設(shè)備MQTT連接信息進(jìn)行連接。
注意:若未連接成功MQTT至阿里云,請先確認(rèn)網(wǎng)關(guān)的網(wǎng)絡(luò)狀態(tài)及連接信息是否填寫正確。
網(wǎng)關(guān)作為MQTT客戶端接入物聯(lián)網(wǎng)平臺,可以發(fā)布和訂閱Topic,如下介紹網(wǎng)關(guān)如何通過發(fā)布Topic將傳感器數(shù)據(jù)上報(bào)到物聯(lián)網(wǎng)平臺。
//gp5olLRZ1dO/24E124983C521736/user/update
在網(wǎng)關(guān)的內(nèi)置NS解析
點(diǎn)擊“Network Srever>載荷編碼器”,填寫對應(yīng)的解碼函數(shù)后點(diǎn)擊保存。
在對應(yīng)的的傳感器中選擇上一步創(chuàng)建的載荷。
解析后數(shù)據(jù)上報(bào)如下
如下介紹網(wǎng)關(guān)如何通過在物聯(lián)網(wǎng)平臺上推送MQTT至設(shè)備終端。
/gp5olLRZ1dO/$deveui/user/get
其中$deveui字段代替原有的設(shè)備名稱字段
消息內(nèi)容示例
{“confirmed”: true,”fport”: 85,”data”: “CQEA/w==”}
內(nèi)容解析:下發(fā)端口為 85,內(nèi)容為 CQEA/w==,啟用確認(rèn)包
注意:下發(fā)內(nèi)容只能使用 Base 64 格式,可以通過 Hex 轉(zhuǎn) Base64 進(jìn)行數(shù)據(jù)轉(zhuǎn)換。
如下介紹如何通在物聯(lián)網(wǎng)平臺快速創(chuàng)建物模型并完成物模型測試。
示例:如圖創(chuàng)建一個距離物模型,其中標(biāo)識符為distance。確認(rèn)完成后點(diǎn)擊左下角的發(fā)布上線并確定,完成自定義功能的物模型添加。
示例topic為:/sys/gp5olLRZ1dO/24E124983C521736/thing/event/property/post
注意:上報(bào)格式中參數(shù)的標(biāo)識需要與阿里云平臺創(chuàng)建物模型時的標(biāo)識符一致。
function Decode(fPort, bytes) {
var decoded = {};
for (var i = 0; i < bytes.length; ) {
var channel_id = bytes[i++];
var channel_type = bytes[i++];
// BATTERY
if (channel_id === 0x01 && channel_type === 0x75) {
decoded.battery = bytes[i];
i += 1;
}
// DISTANCE
else if (channel_id === 0x03 && channel_type === 0x82) {
decoded.distance = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// REMAINING AMOUNT
else if (channel_id === 0x04 && channel_type === 0xd6) {
decoded.remaining = bytes[i];
i += 1;
} else {
break;
}
}
var result = {
"id": "123",
"version": "1.0",
"sys":{
"ack":0
},
"params": {
"distance": {
"value": decoded.distance,
}
},
"method": "thing.event.property.post"
};
return result;
}
/* ******************************************
* bytes to number
********************************************/
function readUInt16LE(bytes) {
var value = (bytes[1] << 8) + bytes[0];
return value & 0xffff;
}