阿里雲物聯網套件(iot)設備間通信(M2M)在web端的實踐


之前通過nodejs連接到阿里雲物聯網mqtt,后又用瀏覽器連接,總結一下:
由於項目是SPA,使用webpack,關鍵代碼:
同樣使用mqtt.js之前先install:
 npm install --save mqtt

然后在main.js導入  

import mqtt from 'mqtt'

將mqtt掛載到Vue全局  

Object.defineProperty(Vue.prototype, 'mqtt', {value: mqtt});

這時就可以在全局使用mqtt了,於是在App.vue中使用mqtt,由於之前邏輯是nodejs進行連接,那么做簽名和HTTPS認證都是在服務端進行的,現在挪到web端流程改為由后端進行簽名和HTTPS,前端請求后端接口返回必要字段進行mqtt連接(這里的必要字段包括mqtt連接需要的clientId,username,password。username對應的返回值為iotId,password對應的返回值為iotToken),拿到后端HTTPS認證之后的返回值前端進行mqtt連接:(示例) 

var host = `ws://${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:443`; //這里需要注意,在服務端是基於TCP的連接(var host = `mqtt://${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883`;),而在web端需要是基於websocket的連接,這個地方的坑踩了兩天o(╥﹏╥)o
var options = {
    clientId: clientId, //請求后端返回的clientId
    username: iotId, //后端HTTPS認證返回的iotId
    password: iotToken //后端HTTPS認證返回的iotToken
}
var client = this.mqtt.connect(host, options); //mqtt連接
client.on('connect', function(){
    //設備連接成功
    client.subscribe(topic); //進行主題的訂閱
})
client.on('error', function(){
    //連接出錯
})
client.on('close', function(){
    //連接斷開
    //client.end(); //結束連接
    //client = null; //將client對象置空
})
client.on('message', function(topic, message){
    //topic: 主題 message: 內容
    //收到消息這里的message是buffer,使用toString()轉換為字符串
})
以上是mqtt在web的連接關鍵代碼示例,下面說一下M2M(iot設備之間通訊):
1.在阿里雲物聯網套件控制台設置轉發規則,在產品->消息通信配置一個模板 /產品key/${deviceName}/m2m 權限為發布和訂閱
2.規則引擎創建規則:select deviceName() fromDevice, toDevice, data, messageId() mesaageId from ‘/產品key/+/m2m’ 並增加一個 repub動作:轉發到 /產品key/${toDevice}/m2m , 啟動規則;
3.設備deviceA發送消息到 /產品key/deviceA/m2m ,格式如下:(這里發消息到自身deviceName的topic)
{
    toDevice: 'deviceB', //這里值為需要發送的設備deviceName
    data: data //這里data為客戶端之間約定的數據,可以為任意對象,只有大家約定好就行
}

4.設備deviceB訂閱/產品key/deviceB/m2m,(這里訂閱的主題為deviceB自身),將收到如下格式數據: 

{
        fromDevice: 'deviceA',
        toDevice: 'deviceB',
        messageId: '',
        data: data //deviceA發來的data
}
注意,規則轉發后的消息內容取決於規則引擎Select的內容 *詳見 阿里雲文檔
那么我們在前端的具體操作為:
//在連接時訂閱自身topic
client.subscribe(`/${productKey}/deviceA/m2m`);

在連接或者收到消息時,當前設備為deviceA:
var msgObj = {
    toDevice: 'deviceB',
    data: data //約定的data
}
client.publish(`/${productKey}/deviceA/m2m`);

以上為物聯網套件M2M的關鍵代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM