阿里云物联网套件(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的关键代码。

posted on 2018-01-18 17:33  薛将军  阅读(3746)  评论(0编辑  收藏  举报

导航