微信小程序连接MQTT服务器全过程_物联网微信小程序_白白的昕的博客-程序员秘密

技术标签: 微信小程序  云服务器  js  MQTT服务器  小程序  

准备工作

最近作比赛,需要用到物联网平台,对于实时的系统来说,mqtt透传是最好的选择,而微信小程序的开发成本又很低廉,所以最终决定使用微信小程序+MQTT服务器的方式来实现,其中也踩了不少坑,所以就此分享一下搭建项目的全过程。

首先是需要准备的东西

  1. 一台服务器(我用的是腾讯云)
  2. SSL证书(必须品,腾讯云可以免费申请)
  3. 域名(也是必须品,因为微信小程序会检测合法域名,不能直接挂IP)
  4. mqtt.js第三方库(后面会介绍怎么用)

MQTT服务器搭建

MQTT服务器搭建的过程请参考 :mqtt+ssl服务搭建以及ws+wss支持 这篇文章,我就是一路按照这篇博文搭建的服务器。

证书选择

下载的证书中可能含有阿帕奇、nginx等多个文件夹,部署MQTT服务器时使用的是阿帕奇(apache)文件中的

证书不完整

我从腾讯云申请的证书,后来在小程序测试时会发生开发者工具中可以正常使用,但是真机调试就不行(选不选检验合法域名都不行),其实是因为所颁发的证书不完整的原因,可以通过以下方法解决:

  1. 进入SSL证书状态监测网站:https://myssl.com/ssl.html,输入自己的域名以及websocket+ssl的端口(按照上述文章是8081),点击监测。
  2. 如果在降级原因中有证书链不完整的字样,那么请进入证书链修补工具:https://myssl.com/chain_download.html
  3. 将生成的证书链复制替换原来三个文件中的第二个(2_www.qilv.group.crt)即可。

重启服务器

重启mqtt服务器可以使用如下方法:

  1. 查看mosquitto 进程
    ps -aux | grep mosquitto
  2. 杀死进程
    kill -9 15869
  3. 重启
    mosquitto -c /etc/mosquitto/mosquitto.conf -d
    至此,服务器的搭建已经完成!

微信小程序使用mqtt

微信小程序使用mqtt是通过websocket来实现,需要用到mqtt.js这一个第三方库。

mqtt.js下载

由于微信小程序不支持CDN(可能支持,反正我是不能用),所以只能下载到你的项目里,地址:

  1. 正常版:https://unpkg.com/[email protected]/dist/mqtt.js
  2. mini版:https://unpkg.com/[email protected]/dist/mqtt.min.js

创建mqtt连接

首先在app.js中,最上方(App({})的上方)添加代码:

var mqtt = require("/utils/mqtt.js") //引入mqtt文件

//随机生成字符串,因为clientId你设成一个固定字符串的话,当你编译
代码的时候就会以这个ID连接服务器,当预览或者真机调试的时候还是这个
ID,就会发生ID冲突的问题,当时差点被这个不起眼的BUG整疯
function randomString(len) { 
  len = len || 32;
  var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  var maxPos = $chars.length;
  var pwd = '';
  for (let i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}
//连接配置
const options = {
  connectTimeout: 4000,  //超时时间
  clientId: randomString(30),  //随机生成ID
  username: '',  //用户名
  password: '',  //密码
}

接下来在App中添加小程序加载监听函数:

onLaunch: function () {
    let that = this
    var client = mqtt.connect('wxs://www.xxx.email:8081', options) //你自己的域名
    client.on('connect', (e) => {
      console.log('成功连接服务器!')
    })
    client.subscribe('esp8266', {
      qos: 0
    }, function (err) {
      if (!err) {
        console.log("订阅成功:esp8266")
      }
    })
    client.on('message', function (topic, message, packet) {
      that.globalData.mqttData = packet.payload.toString()
    })
}

这样,在全局变量中就储存了服务器发来的消息,其他页面均可读取消息:

const app = getApp();   //引入全局变量
Page({
	console.log(app.globalData.mqttData)
})

其他

mqtt.js需要注意的地方

 var client = mqtt.connect('wxs://www.xxxx.email:8081', options)

使用时要注意 是wxs 而不是 wss,因为这个第三方库的作者进行了一次封装

mqtt.js的其他地方

请参考这片文章:在微信小程序中使用mqtt服务

合法域名问题

这个问题我也不太清楚,因为我一直没有勾选不检测合法域名的选项,现在补充一下如何添加合法域名:

  1. 打开微信小程序控制台页面
  2. 依次点击:开发-开发设置-服务器域名
  3. 添加服务器地址 :www.xxx.email:8081;即可
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43554847/article/details/108587422

智能推荐

IDEA必备插件系列-Translation最优秀的翻译插件_clion翻译插件_极客收藏夹的博客-程序员秘密

IDEA最优秀的翻译插件效果特性多翻译引擎Google翻译有道翻译百度翻译多语言互译文档翻译语音朗读自动选词自动单词拆分单词本使用申请有道智云翻译服务(可选):注册有道智云帐号并获取其应用ID和应用密钥绑定应用ID和应用密钥:Preferences(Settings) &gt; [Other Settings] &gt; Translation &gt; 有道翻译申请百度翻译服务(可选):注册百度翻译开放平台帐号并获取其应用ID和应用密.

微信小程序上传 分享发测试_小程序发布前怎么让他人测试_欧阳Totoro的博客-程序员秘密

一、微信小程序上传(注:appId一定要正确)步骤1、找到小程序开发工具的右上角 有一个上传的按钮2、点击按钮,修改补丁,主要备注好(方便同伴理解了解)3、在微信公众平台扫码登录自己的账号4、找到版本号,找自己上传的5、自己上传的右边有一个按钮换成体验本6、在左边会看到有一个蓝色的文字 点击会有一个二维码 可以分享给同伴查看测试总结:小白在线笔记...

使用C# 未解决的问题(VS2012)_weixin_30920597的博客-程序员秘密

1、在子窗体中用contextMenuStrip,第一次右键时主窗体会跑到子窗体前面,contextMenuStrip不显示;之后在子窗体右击正常显示contextMenuStrip。转载于:https://www.cnblogs.com/dengwx/p/5647983.html...

MacOSX 安装 TensorFlow_叉叉敌的博客-程序员秘密

TensorFlow是一个端到端开源机器学习平台。它拥有一个包含各种工具、库和社区资源的全面灵活生态系统,可以让研究人员推动机器学习领域的先进技术的。准备安装 AnacondaTensorFlow 安装的前提是系统安装了 Python 2.5 或更高版本,教程中的例子是以 Python 3.6(Anaconda 3 版)为基础设计的。为了安装 TensorFlow,首先确保你已...

Java学习第二天_weixin_30888027的博客-程序员秘密

一、两个常用工具1、随机生产一个[0,1)之间的数Math.random()举例:double box =Math.random();//产生随机小数 [0,1)System.out.println("box="+box);//[min,max+1)int min =5;int max =9;box =Math.random()*(max-min+1)...

如何写出高质量的 SQL 代码?_SQL数据库开发的博客-程序员秘密

点击关注上方“SQL数据库开发”,设为“置顶或星标”,第一时间送达干货SQL专栏SQL基础知识第二版SQL高级知识第二版前言写这个话题心里有点没底,主要是我们微信群里懂SQL的大佬越来...

随便推点

使用Aspose.Words组件给word加水印_山鹰的天空的博客-程序员秘密

/// &lt;summary&gt; /// Inserts a watermark into a document. /// &lt;/summary&gt; /// &lt;param name="doc"&gt;The input document.&lt;/param&gt; /// &lt;param name="waterma...

qstudio c语言中文网,restrict type qualifier(restrict类型限定符)_维斯特的萨克斯的博客-程序员秘密

C类型系统中的每个单独类型都具有该类型的多个限定版本,对应于const,volatile中的一个,两个或全部三个,并且对于指向对象类型的指针,限制限定符。本页介绍的影响限制预选赛。仅指向对象类型可以是限制合格(特别地,int restrict *p和float (* restrict f9)(void)是错误)。限制语义仅适用于左值表达式; 例如,转换为限制限定指针或返回限制限定指针的函数调用不是...

JavaScript 编程精解 中文第三版 十五、处理事件_布客飞龙的博客-程序员秘密

十五、处理事件 原文:Handling Events 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 你对你的大脑拥有控制权,而不是外部事件。认识到这一点,你就找到了力量。 马可·奥勒留,《沉思录》有些程序处理用户的直接输入,比如鼠标和键盘...

Terraform 入门教程之快速编排OpenStack-002_流雨声的博客-程序员秘密

Terraform架构OpenStack环境准备部署一个单节点的OpenStack环境,参考这篇文档https://docs.openstack.org/devstack/latest/guides/single-machine.htmlAdd your userWe need to add a user to install DevStack. (if you created a user during install you can skip this step and just give

Exynos4412——触摸屏驱动_hceng_blog的博客-程序员秘密

CSDN仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。本博文对应地址: https://hceng.cn/2017/12/26/Exynos4412——触摸屏驱动/#more移植Exynos4412的I2C接口触摸屏驱动。这应该是Exynos4412 LCD部分的最后一部分了。为了去探索LCD驱动,前面做了一系列的准备工作,最后终于完成了L...

git操作之commit操作_weixin_34208283的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

推荐文章

热门文章

相关标签