摘要:阿裡雲HaaS510開發闆以4G網絡形式聯網,可以擺脫wifi依賴,進而可以廣泛應用于各類物聯網裝置開發。作為一款專門用來與阿裡雲物聯網平台通信的子產品,它有一個基本而強大的功能就是将序列槽擷取的資料或指令通過4G網絡發送到物聯網平台,通過JavaScript以極短的代碼來實作。
實驗目的:通過haas510接收上位機發來的序列槽指令,将它作為物聯網裝置的屬性值發送。
硬體:haas510 (2.0版本),USB序列槽
軟體:win7 x64,vscode
目錄
1.常用的物聯網平台JavaScript方法
2.上報裝置屬性的json字元串處理方法
3.編寫上報屬性源代碼
4.觀察實驗效果
1.常用的物聯網平台JavaScript方法
常用方法有“上報屬性”“上報事件”,另外還有“關閉執行個體”“注冊回調函數”等。
本實驗用到的是postProps方法。該方法作用就是上報裝置屬性。參數隻有1個,就是屬性的json格式字元串。這個是有固定格式的,格式有誤也不能正常上報。一般是屬性名--冒号---屬性值,但是要經過處理才行,具體的處理方法請繼續閱讀本文。
2.上報裝置屬性的json字元串處理方法
假如我們的裝置屬性是text類型,辨別符是beizhu。
那麼一個标準的屬性字元串就是 {"beizhu":"xxxxxxxx"}
使用JavaScript編寫程式上報這個屬性時,您不能提前預料到序列槽收到的資料是什麼,是以不能直接使用一條完整的字元串發送給物聯網平台。
正确的做法是擷取序列槽資料後,和半條字元串連接配接成一條。具體代碼是
JSON.stringify({beizhu:ArrayToString(data)})
data就是序列槽接收到的資料,通過stringify反複就把花括号在内的字元串統一轉換為一條完整的json字元串了。
json是什麼?
JSON = JavaScript Object Notation,有的翻譯為JS 對象簡譜
從字面意思就可以看出來它是JavaScript的親兒子,JavaScript支援它是預設的。
這意味着在 JavaScript 中處理 JSON資料不須要任何特殊的 API 或工具包。
本實驗就用的是stringify方法,因為是原生,是以代碼量很少。
3.編寫上報屬性源代碼
本文直接将經過調試的源代碼貢獻出來,大家複制粘貼即可。
var iot = require('iot');
var network = require('network');
var uart = require('uart');
var net = network.openNetWorkClient();
/* 裝置三元組資訊擷取請參考common目錄下的iot元件說明 */
var productKey = 'gcXXXXXvu2';
var deviceName = 'cewSSSSS001';
var deviceSecret = 'ee213aSSSSSSSSSadcdedb3a9';
// 建構物聯網連接配接執行個體
var device;
var lightSwitch = 0;
// 打開使用者序列槽,在HaaS中,使用者序列槽号是UART2
var serial = uart.open({
id: 'UART2'
});
var msgbuf = [97, 98, 99, 100];
function ArrayToString(fileData) {
var dataString = "";
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
}
return dataString;
}
//net.on用來使用三元組資料連接配接物聯網平台,核心是實作了一個MQTT用戶端
net.on('connect', function () {
device = iot.device({
productKey: productKey,
deviceName: deviceName,
deviceSecret: deviceSecret,
region: 'cn-shanghai',
success: function () {
console.log('iot: [success] connect');
},
fail: function () {
console.log('iot: [failed] connect');
}
});
})
//定時程式,這個程式實作的是5秒鐘定時,每次都翻轉主燈開關的狀态,向使用者序列槽發送一個數組資料
//再将主燈開關狀态發送到物聯網平台
setInterval(function () {
lightSwitch = 1 - lightSwitch;
// user uart send data
serial.write(msgbuf);
/* 錯誤示範 iot.postProps({
payload: {LightSwitch:'0'}
})*/
/*正确示範,要想發送屬性,就得使用stringify才行*/
device.postProps(
JSON.stringify({
LightSwitch: lightSwitch
})
);
}, 5000);
// serial.on用于響應序列槽資料接收事件,使用者序列槽接收啥,就通過調試序列槽發送啥到物聯網平台的備注屬性。
//注意,兩個序列槽不是同一個。
serial.on('data', function(data) {
console.log('uart receive data is ' + ArrayToString(data));
device.postProps(
JSON.stringify({
beizhu: ArrayToString(data)
})
);
});
4.觀察實驗效果
硬體連接配接如下圖所示
實驗效果有以下幾個方面呈現。
首先裝置會線上,這個是net.on實作的
其次使用者序列槽會定時5秒發送4個字元(其實是數組)到上位機,這個是setInterval實作的。
然後是當上位機通過序列槽發送一個字元串的時候,HaaS510會将這個字元串發送到物聯網平台,作為beizhu屬性的值。
至此,實驗成功。
存在的一點不足是:當設計的物聯網裝置隻有1個屬性的時候,可以這樣直接将序列槽資料發送到物聯網平台。但是實際研發工作中,每一台裝置的屬性不可能僅僅有一個屬性,它往往有很多個屬性。如果簡單粗暴的将序列槽資料一股腦上報為一個字元串,那麼顯然并不是一個成熟的裝置應該具備的。
是以,我們還需要對序列槽發來的資料進行解析,将每個屬性的值提取出來,再對應發送到雲平台。
這是下一步我們需要做的。