當(dāng)前位置:中美貿(mào)易網(wǎng) > 技術(shù)中心 > 所有分類
目錄
設(shè)備接入服務(wù)(IoTDA)是華為云的物聯(lián)網(wǎng)平臺(tái),提供海量設(shè)備連接上云、設(shè)備和云端雙向消息通信、批量設(shè)備管理、遠(yuǎn)程控制和監(jiān)控、OTA升級(jí)、設(shè)備聯(lián)動(dòng)規(guī)則等能力,并可將設(shè)備數(shù)據(jù)靈活流轉(zhuǎn)到華為云其他服務(wù)。本文檔主要介紹如何將星縱物聯(lián)LoRaWAN®網(wǎng)關(guān)通過MQTT方式對(duì)接到華為云IoTDA,并且通過MQTT主題將傳感器數(shù)據(jù)發(fā)布到平臺(tái)。
華為云IoTDA:
在左側(cè)導(dǎo)航欄,選擇“產(chǎn)品 ”,單擊創(chuàng)建產(chǎn)品。產(chǎn)品名稱、協(xié)議類型、數(shù)據(jù)格式等參照下圖進(jìn)行設(shè)置。
網(wǎng)關(guān)MQTT接入物聯(lián)網(wǎng)平臺(tái)需要提前獲取MQTT接入信息(MQTT服務(wù)器地址/MQTT服務(wù)端口/客戶端ID/用戶名/密碼)。
注意:8883為MQTTS的連接端口,若是MQTT連接端口請(qǐng)配置1883。
注意:若未連接成功,請(qǐng)先確認(rèn)網(wǎng)關(guān)的網(wǎng)絡(luò)狀態(tài)及連接信息是否填寫正確。網(wǎng)關(guān)上MQTT服務(wù)器端口請(qǐng)?zhí)顚?883。
如下介紹網(wǎng)關(guān)如何通過發(fā)布Topic將傳感器數(shù)據(jù)上報(bào)到華為云IoTDA。傳感器以AM103為例。
設(shè)備消息上報(bào)(透傳上報(bào)) | |
主題 | $oc/devices/{device_id}/sys/messages/up |
用途 | 設(shè)備無法按照產(chǎn)品模型中定義的屬性格式進(jìn)行數(shù)據(jù)上報(bào)時(shí),可調(diào)用此接口將設(shè)備的自定義數(shù)據(jù)格式上報(bào)給平臺(tái),平臺(tái)對(duì)該消息不做解析。其中{device_id}需修改為設(shè)備ID。 |
設(shè)備上報(bào)屬性(物模型上報(bào)) | |
主題 | $oc/devices/{device_id}/sys/properties/report |
用途 | 設(shè)備按產(chǎn)品模型中定義的格式將屬性數(shù)據(jù)上報(bào)給平臺(tái),其中{device_id}需修改為設(shè)備ID。 |
進(jìn)入產(chǎn)品詳情頁,選擇“模型定義”開發(fā)產(chǎn)品模型。單擊“自定義模型”,配置產(chǎn)品的服務(wù)。
{
"services": [
{
"service_id": "BasicData", //服務(wù)ID
"properties": {
"battery": xx, //屬性名稱
"co2": xx,
"humidity": xx,
"temperature": xx
}
}
]
}
AM103物模型解碼函數(shù):
function Decode(fPort, bytes) {
var decoded = {
services: [
{
service_id: "BasicData",
properties: {}
}
]
};
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.services[0].properties.battery = bytes[i];
i += 1;
}
// TEMPERATURE
else if (channel_id === 0x03 && channel_type === 0x67) {
decoded.services[0].properties.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;
}
// HUMIDITY
else if (channel_id === 0x04 && channel_type === 0x68) {
decoded.services[0].properties.humidity = bytes[i] / 2;
i += 1;
}
// PIR ACTIVITY
else if (channel_id === 0x05 && channel_type === 0x6A || channel_id === 0x0A && channel_type === 0x6A) {
decoded.services[0].properties.activity = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// LIGHT
else if (channel_id === 0x06 && channel_type === 0x65) {
decoded.services[0].properties.illumination = readUInt16LE(bytes.slice(i, i + 2));
decoded.services[0].properties.infrared_and_visible = readUInt16LE(bytes.slice(i + 2, i + 4));
decoded.services[0].properties.infrared = readUInt16LE(bytes.slice(i + 4, i + 6));
i += 6;
}
// CO2
else if (channel_id === 0x07 && channel_type === 0x7D) {
decoded.services[0].properties.co2 = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// TVOC
else if (channel_id === 0x08 && channel_type === 0x7D) {
decoded.services[0].properties.tvoc = readUInt16LE(bytes.slice(i, i + 2));
i += 2;
}
// PRESSURE
else if (channel_id === 0x09 && channel_type === 0x73) {
decoded.services[0].properties.pressure = readUInt16LE(bytes.slice(i, i + 2)) / 10;
i += 2;
} else {
break;
}
}
return decoded;
}
/* ******************************************
* bytes to number
********************************************/
function readUInt16LE(bytes) {
var value = (bytes[1] << 8) + bytes[0];
return value & 0xffff;
}
function readInt16LE(bytes) {
var ref = readUInt16LE(bytes);
return ref > 0x7fff ? ref - 0x10000 : ref;
}