阿里云物聯(lián)網(wǎng)平臺定義的標(biāo)準(zhǔn)數(shù)據(jù)格式為Alink JSON。對于低配置且資源受限或者對網(wǎng)絡(luò)流量有要求的設(shè)備,不適合直接構(gòu)造JSON數(shù)據(jù)與物聯(lián)網(wǎng)平臺通信,可將原數(shù)據(jù)透傳到物聯(lián)網(wǎng)平臺。物聯(lián)網(wǎng)平臺提供數(shù)據(jù)解析功能,可以根據(jù)您提交的腳本,將數(shù)據(jù)在設(shè)備自定義格式和JSON格式之間轉(zhuǎn)換。
自定義透傳適合的場景為采用廉價單片機、功能比較弱的DTU方案,這些DTU對json這種格式解析可能比較費勁。
一、新建產(chǎn)品
1.新建產(chǎn)品
我們選擇“自定義品類”,節(jié)點類型為“直連設(shè)備”,最重要的是數(shù)據(jù)格式一定要選擇“透傳/自定義”。
?2.添加功能
?3.編寫解析腳本
?
var COMMAND_REPORT = 0x00;
var COMMAND_SET = 0x01;
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //標(biāo)準(zhǔn)ALink JSON格式topic, 設(shè)備 上傳屬性數(shù)據(jù)到 云端
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //標(biāo)準(zhǔn)ALink JSON格式topic, 云端 下發(fā)屬性控制指令 到設(shè)備端
/**
* 將設(shè)備自定義topic數(shù)據(jù)轉(zhuǎn)換為json格式數(shù)據(jù), 設(shè)備上報數(shù)據(jù)到物聯(lián)網(wǎng)平臺時調(diào)用
* 入?yún)ⅲ簍opic string 設(shè)備上報消息的topic
* 入?yún)ⅲ簉awData byte[]數(shù)組 不能為空
* 出參:jsonObj JSON對象 不能為空
*/
function transformPayload(topic, rawData) {
var jsonObj = {};
return jsonObj;
}
/**
* 將設(shè)備的自定義格式數(shù)據(jù)轉(zhuǎn)換為Alink協(xié)議的數(shù)據(jù),設(shè)備上報數(shù)據(jù)到物聯(lián)網(wǎng)平臺時調(diào)用
* 入?yún)ⅲ篵ytes byte[]數(shù)組 不能為空
* 出參:jsonMap Alink JSON對象 不能為空
*/
function rawDataToProtocol(bytes) {
var uint8Array = new Uint8Array(bytes.length);
for (var i = 0; i < bytes.length; i++) {
uint8Array[i] = bytes[i] & 0xff;
}
var dataView = new DataView(uint8Array.buffer, 0);
var jsonMap = new Object();
var fHead = uint8Array[0];
if (fHead == COMMAND_REPORT) {
jsonMap['method'] = ALINK_PROP_REPORT_METHOD;
jsonMap['version'] = '1.0';
jsonMap['id'] = '' + dataView.getInt32(1);
var params = {};
params['LightVolt'] = dataView.getInt32(5);
params['PowerSwitch'] = uint8Array[9];
jsonMap['params'] = params;
}
return jsonMap;
}
/**
* 將Alink協(xié)議的數(shù)據(jù)轉(zhuǎn)換為設(shè)備能識別的格式數(shù)據(jù),物聯(lián)網(wǎng)平臺給設(shè)備下發(fā)數(shù)據(jù)時調(diào)用
* 入?yún)ⅲ簀son Alink JSON對象 不能為空
* 出參:payloadArray byte[]數(shù)組 不能為空
*
*/
function protocolToRawData(json) {
var method = json['method'];
var id = json['id'];
var version = json['version'];
var payloadArray = [];
if (method == ALINK_PROP_SET_METHOD)
{
var params = json['params'];
var prop_int32 = params['LightVolt'];
var prop_bool = params['PowerSwitch'];
//按照自定義協(xié)議格式拼接 rawdata
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET));
payloadArray = payloadArray.concat(buffer_int32(parseInt(id)));
payloadArray = payloadArray.concat(buffer_int32(parseInt(prop_int32)));
payloadArray = payloadArray.concat(buffer_uint8(prop_bool));
}
return payloadArray;
}
//以下是部分輔助函數(shù)
function buffer_uint8(value) {
var uint8Array = new Uint8Array(1);
var dv = new DataView(uint8Array.buffer, 0);
dv.setUint8(0, value);
return [].slice.call(uint8Array);
}
function buffer_int16(value) {
var uint8Array = new Uint8Array(2);
var dv = new DataView(uint8Array.buffer, 0);
dv.setInt16(0, value);
return [].slice.call(uint8Array);
}
function buffer_int32(value) {
var uint8Array = new Uint8Array(4);
var dv = new DataView(uint8Array.buffer, 0);
dv.setInt32(0, value);
return [].slice.call(uint8Array);
}
function buffer_float32(value) {
var uint8Array = new Uint8Array(4);
var dv = new DataView(uint8Array.buffer, 0);
dv.setFloat32(0, value);
return [].slice.call(uint8Array);
}
// 以下為腳本模版,您可以基于以下模版進行腳本編寫
/**
* 將設(shè)備自定義topic數(shù)據(jù)轉(zhuǎn)換為json格式數(shù)據(jù), 設(shè)備上報數(shù)據(jù)到物聯(lián)網(wǎng)平臺時調(diào)用
* 入?yún)ⅲ簍opic string 設(shè)備上報消息的topic
* 入?yún)ⅲ簉awData byte[]數(shù)組 不能為空
* 出參:jsonObj JSON對象 不能為空
*/
/* function transformPayload(topic, rawData) {
var jsonObj = {};
return jsonObj;
} */
/**
* 將設(shè)備的自定義格式數(shù)據(jù)轉(zhuǎn)換為Alink協(xié)議的數(shù)據(jù),設(shè)備上報數(shù)據(jù)到物聯(lián)網(wǎng)平臺時調(diào)用
* 入?yún)ⅲ簉awData byte[]數(shù)組 不能為空
* 出參:jsonObj Alink JSON對象 不能為空
*/
/* function rawDataToProtocol(rawData) {
var jsonObj = {};
return jsonObj;
} */
/**
* 將Alink協(xié)議的數(shù)據(jù)轉(zhuǎn)換為設(shè)備能識別的格式數(shù)據(jù),物聯(lián)網(wǎng)平臺給設(shè)備下發(fā)數(shù)據(jù)時調(diào)用
* 入?yún)ⅲ簀sonObj Alink JSON對象 不能為空
* 出參:rawData byte[]數(shù)組 不能為空
*
*/
/* function protocolToRawData(jsonObj) {
var rawdata = [];
return rawdata;
}
*/
二、配置dtu
如下圖所示記錄好平臺的如下幾個連接參數(shù)
ProductKey
DeviceName
DeviceSecret
mqttHostUrl
port
訂閱Topic
發(fā)布Topic
??
我們要用到的topic為物模型通信Topic,打開產(chǎn)品詳情,并選擇Topic類列表-物模型通信Topic,我們需要的是下面紅框內(nèi)的這兩個topic
?
配置DUT三要素及通信參數(shù)
按如下次序操作設(shè)置DTU,并將上面記錄的通信參數(shù)對應(yīng)填入。
?
三、測試上傳
先發(fā)一個初始數(shù)據(jù)000320f2e30000000001(注意使用十六進制發(fā)送)
?阿里云狀態(tài)變更
?上報一條新的000320f2e30000000500
?狀態(tài)立即更新
?
四、測試下發(fā)
找到監(jiān)控運維,在線調(diào)試,我們在屬性調(diào)試內(nèi)設(shè)置好屬性數(shù)據(jù)然后點擊“設(shè)置”下發(fā)一條指令
?
設(shè)備端收到的數(shù)據(jù)如下(注意:記得選擇十六進制顯示不然是亂碼)
文章來源:http://www.zghlxwxcb.cn/news/detail-779848.html
?本文參考自:dtu阿里云自定義透傳 (openluat.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-779848.html
到了這里,關(guān)于MQTT自定義透傳_DTU連接阿里云的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!