zoukankan      html  css  js  c++  java
  • 阿里云物联网套件(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的关键代码。

  • 相关阅读:
    开发中的问题
    页面重定向Redirect时产生错误
    项目管理的几个阶段及分工
    让你的CSS像Jquery一样做筛选
    项目中的几个SQL程序
    SharePoint2010人员搜索配置心得
    TroubleShoot:该搜索请求无法连接到搜索服务
    转:软件架构师应该知道的97件事
    通用动态生成静态HTML页方法
    简单的正则表达式过滤网址
  • 原文地址:https://www.cnblogs.com/xuejiangjun/p/8311418.html
Copyright © 2011-2022 走看看