微信小程序连接emqx服务器实现数据交互

微信小程序连接emqx服务器实现数据交互

还没有搭建emq服务器的宝贝们可以参考这篇文章
云服务器部署emq服务器一条龙

  • emqx

申请链接

EMQX 是一款全球下载量超千万的开源物联网MQTT 服务器,高效可靠连接海量物联网设备,高性能实时处理消息与事件流数据,可运行在公有云、私有云和混合云上。
简单来说就是用于进行软硬件的信息交互
这里说一下企业级emqx,用QQ邮箱就可以申请了,可以有免费15天的license,如果只是开发学习的话建议不配置license,不配置它有个限制就是最多连接5台设备或软件,用于开发学习足够了

  • mqtt

MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。

  • emqx通信规则示例

emqx是基于mqtt协议的,所以采用订阅、发布主题的形式来进行信息交互的。

示例:现在假设有Topic/1和Topic/2两个主题,A,B两人。目前A订阅了主题Topic/2,发布主题是Topic/1,而B刚好与之相反。即订阅是Topic/1,发布是~2
那么在这种前提下,A就会收到发布主题为Topic/2的人发布的消息,并且他发的消息会被订阅了Topic/1的人收到。

  • 微信小程序连接emqx服务器

开发过微信小程序都知道,它只支持加密的协议,譬如https和wss协议,所以我们还要买个域名并配置SSL证书 教程链接

  • 导入mqtt.js源码

由于源码过长所以我放在另外一个博客了 mqtt.js源码 复制粘贴就好了

  • 使用mqtt.js并配置域名全局变量
var connect = require('../../utils/mqtt.js')
const mqttUrl = "wxs://www.***.xyz:8084/mqtt"; //填写自己的服务器域名

/*data里面弄个client列表后面用来接收*/
data:{
client:{},
}

注意: 这里我的mqtt源码是放在utils文件夹下的。所以具体路径要根据自己实际的位置喔~ 另 . . /表示当前文件的上一级目录

  • 连接emqx服务器并订阅主题
onClient(){
	var that = this;
	 that.client = connect(mqttUrl);
      that.client.on("connect", function () {
        console.log("成功连接emqx服务器!");
        that.client.subscribe("Topic/stm32", function (err) {
          //订阅主题topic/#
          if (!err) {
            console.log("成功订阅设备上行数据topick");
          }
        });
      });
}

这里我们可以看到订阅主题是subscribe,他有1个参数,就是我们要订阅的主题,譬如上方代码我订阅的是"Topic/stm32",那么我就会收到所有发布在这个主题的消息

  • 处理接收到的数据
that.client.on("message", function (topic, message) {
      let dataFromDev = {};
      dataFromDev = JSON.parse(message); //message是16进制的buffer字节流,要转换
      that.setData({
        Temp1:dataFromDev.Temp1,
        Temp2:dataFromDev.Temp2,
        LED1:dataFromDev.LED1,
        LED2:dataFromDev.LED2,
      })
    });

由于接收到的信息是16进制的buffer字节流,所以我们还需要手动将它转化为JSON格式,在这里我们就已经接收到了我们的消息了

  • 发布消息
 changeLED1:function(event){
    var that = this
    if(event.detail.value){
      that.setData({
        LED1:true
      })
      that.client.publish("Topic/wx",'{"LED1":true}',function(err){
        if(!err){
          console.log("成功下发开1灯命令")
        }
      })
    }else{
      that.setData({
        LED1:false
      })
      that.client.publish("Topic/wx",'{"LED1":false}',function(err){
        if(!err){
          console.log("成功下发关1灯命令")
        }
      })
    }
  },

发布是publish,它有两个参数,第一个是你发布的主题,第二个是你要发的数据(这里的数据格式必须是JSON格式),譬如上方代码发布的主题是Topic/wx,数据是LED1:true。(这里前端用的是switch组件,通过点击按钮来判断是开还是关,上面代码的event就是用来接收是开还是关的)

这是我写的第一个教程,之前的都是些以前记录的笔记,所以没有太过的解释,本人还是个菜鸟,有错误的地方还望海涵。

你可能感兴趣的:(emqx,微信小程序,mqtt,微信小程序,stm32)