使用微信小程序连接到 MQTT 云服务

2023-10-31

微信小程序是腾讯于 2017 年 1 月 9 日推出的一种不需要下载安装即可在微信平台上使用的应用程序,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。对于开发者而言,小程序开发门槛相对较低,难度不及 APP,能够满足简单的基础应用,对于用户来说,能够节约使用时间成本和手机内存空间,对于开发者来说也能节约开发和推广成本。

本文主要介绍如何在微信小程序项目中使用 MQTT,实现小程序客户端与 MQTT 云服务的连接、订阅、收发消息、取消订阅等功能。

MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

项目初始化

前期准备

注册微信小程序帐号,并下载微信开发者工具。由于微信小程序安全要求比较高,在与后台服务器之间的通讯必须使用 https 或 wss 协议,因此要在微信小程序后台设置域名服务器。

微信小程序仅支持通过 WebSocket 进行即时通信,EMQ X 的 MQTT Over WebSocket 能够完全兼容使用在微信小程序上。但由于微信小程序的规范限制,EMQ X 使用微信小程序接入时需要注意以下几点:

  • 使用已经通过域名备案域名接入

  • 域名需要微信公众平台登录后在主页面的服务器域名下添加配置服务器域名地址

  • 仅支持 WebSocket/TLS 协议,需要为域名分配受信任 CA 颁发的证书

  • 由于微信小程序 BUG,安卓真机必须使用 TLS/443 端口,否则会连接失败(即连接地址不能带端口)

添加服务器域名,这里我们将 broker.emqx.io 为例添加到服务器域名中,我们进入到页面中选择开始配置按钮,在 socket 合法域名列下输入 wss://broker.emqx.io注意:必须以 wss 协议开头,如下图:

微信小程序添加 MQTT 服务器域名

添加完成后,在微信小程序开发时才允许我们于该域名地址下的服务器进行通信与交互。

新建项目

准备完成前期网络通讯相关工作后,我们打开已经下载好了的微信开发者工具,打开后在页面点击新建一个小程序项目,如下图所示:

新建小程序项目

点击确认后,微信开发者工具就自动初始化好了项目,我们就可以开始开发了。

安装 MQTT 客户端库

因为小程序是通过 JavaScript 开发的,因此可以使用 MQTT.js 作为 MQTT 客户端库

从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装第三方包。如感兴趣的读者可自行查看小程序 npm 支持的官方文档来操作使用,本文为简化操作过程,将不使用 npm 的方式安装。我们将在 utils 文件夹下新建一个 mqtt.js 文件,我们直接获取在 MQTT.js CDN 上的打包构建后的源码复制 mqtt.js 文件中。

MQTT.js CDN 地址:https://unpkg.com/mqtt@4.0.1/dist/mqtt.min.js 可通过浏览器打开查看。

注意:截止目前最新的 mqtt.js v4.2.8 版本,在小程序中使用会报 net.createConnection 未定义的错误,需要回退和使用 4.0.1 版本。

完成后我们,在 index.js 主页面中直接 import 即可:

import mqtt from '../../utils/mqtt'

MQTT 使用

本文将使用 EMQ X Cloud 提供的 免费公共 MQTT 服务器 作为本次测试的 MQTT 服务器地址,服务器接入信息如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • SSL/TLS Port: 8883

更多详情请访问 EMQ X Cloud 官网,或查看 EMQ X Cloud 文档

连接代码

微信小程序使用 WebSocket 的方式连接到 MQTT 服务器,但连接的 URL 地址中请使用 wxs 协议名称,连接及初始化数据的关键代码:

Page({
  data: {
    client: null,
    host: 'broker.emqx.io:8084',
    topic: 'testtopic/miniprogram',
    msg: 'Hello! I am from WeChat miniprogram',
    mqttOptions: {
      protocolVersion: 4, //MQTT连接协议版本
      clientId: 'emqx_cloud_miniprogram',
      clean: true,
      password: '',
      username: '',
      reconnectPeriod: 1000, // 1000毫秒,两次重新连接之间的间隔
      connectTimeout: 30 * 1000, // 1000毫秒,两次重新连接之间的间隔
      resubscribe: true // 如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
    },
  },
  connect() {
    this.data.client = mqtt.connect(`wxs://${this.data.host}/mqtt`, this.data.mqttOptions)
    this.data.client.on('connect', () => {
      wx.showToast({
        title: '连接成功'
      })
    })
  },
})

订阅主题

subscribe() {
  this.data.client.subscribe(this.data.topic)
  wx.showToast({
    title: '主题订阅成功'
  })
},

取消订阅

unsubscribe() {
  this.data.client.unsubscribe(this.data.topic)
  wx.showToast({
    title: '取消订阅成功'
  })
},

消息发布

publish() {
  this.data.client.publish(this.data.topic, this.data.msg)
},

断开连接

disconnect() {
  this.data.client.end()
  wx.showToast({
    title: '断开连接成功'
  })
},

测试

我们在小程序中简单编写了如下应用界面,该应用具备:创建连接、订阅主题、收发消息、取消订阅、断开连接等功能。

完整的项目示例代码:https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-wechat-miniprogram

小程序示例应用

使用 MQTT 5.0 客户端工具 - MQTT X 作为另一个客户端进行消息收发测试。

MQTT 5.0 客户端工具 - MQTT X

可以看到 MQTT X 可以正常接收来到来自小程序发送过来的消息,同样,使用 MQTT X 向该主题发送一条消息时,也可以看到小程序能正常接收到该消息。

微信小程序接收 MQTT 消息

总结

综上所述,我们实现了在小程序项目中创建 MQTT 连接,模拟了小程序客户端与 MQTT 服务器进行订阅、收发消息、取消订阅以及断开连接的场景。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-wechat-miniprogram

技术支持:如对本文或 EMQ 相关产品有疑问,可访问 EMQ 问答社区 https://askemq.com 提问,我们将会及时回复支持。

更多技术干货,欢迎关注我们公众号【EMQ 中文社区】。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用微信小程序连接到 MQTT 云服务 的相关文章

  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 运行 GO111MODULE=on go install 。 ./cmd/... 在云初始化中

    我有一个使用 cloud init 部署的 bash 脚本 我的 bash 脚本包含以下部分代码 GO111MODULE on go install cmd 当直接在已部署服务器的终端中运行我的 bash 脚本时 它按预期工作 但是当我在云
  • 在 mqtt.js 中发布无法访问的主题时如何捕获“访问错误”?

    我正在使用带有 mqtt js 的 node js 和 mosquitto 代理创建一个项目 在 mosquitto 配置文件中 我设置了 pwfile aclfile 来控制哪个用户可以访问哪个主题 如果用户名 密码 发布主题和订阅主题正
  • 由于 NanoMatch 问题,Firestore 的 Firebase 功能失败

    我是云函数新手 正在测试此示例代码https github com firebase functions samples tree master quickstarts uppercase firestore https github co
  • OpenCPU 上的自定义 R 包/找到包,但没有可见的函数

    CI 为 OpenCPU 编写了一个 R 包 并希望在我自己的云服务器上使用它 即使包本身被识别并且可以更新 我也无法访问任何功能 并且我可以通常通过 POST 和 GET 访问其他 非自定义 例如基本或统计 包 我已经安装了自定义包以及所
  • 如何从剪贴板粘贴?

    Google Cloud shell 不允许我 粘贴 剪贴板中的内容 我尝试过使用 发送命令 ctrl v 选项 并尝试使用root 我发现它可以与 IE 一起使用 给出一条消息以允许剪贴板访问该页面 但只是一次性的事情 我缺少什么 原来这
  • 如何阻止nginx解析upstream到ip?

    我想将 nginx 配置为反向代理 以将 HTTP 请求转发到外部 Cloud API 这个nginx 但我收到连接拒绝错误 29 09 19 02 error 7 7 2 connect failed 111 Connection ref
  • 更新 AWS S3 对象密钥(密钥名称)

    我需要重命名 AWS S3 存储桶中存储的大量文件 每个文件 对象将单独重命名 基于特定标准 没有通用的 前缀 后缀 我想出了 current filename 和 new filename 的列表 它们可以作为 bat 文件 队列在 CL
  • Terraform - 我应该使用 user_data 还是 Provisioner 来引导资源?

    看来我可以使用user data使用模板文件或 远程执行 provisioner使用内联命令进行引导 那么哪一个被认为更惯用呢 你应该使用user data The 用户数据 http docs aws amazon com AWSEC2
  • 如何M2MQTT自动重连

    我正在尝试使用此协议 并且已经有 2 个客户端 一个用于发布 另一个用于订阅 和一个正在工作的经纪人 我的问题是我想在订阅客户端中实现重新连接功能 因为 wifi 信号不稳定并且不想每次都手动重新启动客户端 我该如何实现这一点 您可以使用
  • 如何在 Windows Azure 上部署 Java 应用程序

    您好 我是一名计算机科学专业三年级学生 我已经在 netbeans 上用 java 创建了一个三年级项目 现在我想将其部署到带有 windows azure 的虚拟机上 重点是 我希望能够在任何连接到互联网的计算机上使用这个应用程序 只需访
  • 何时应使用以下各项:Amazon EC2、Google App Engine、Microsoft Azure 和 Salesforce.com? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是在非常普遍的意义上问这个问题 无论是从云提供商还是云消费者的角度来看 此外 问题不针对任何特定类型的应用程序 实际上 目的是了解哪种类型的应
  • 无法在 Istio 代理后面的 k8s 中建立与 VerneMQ 集群的 mqtt 连接

    我正在设置 k8s 本地 k8s 集群 对于测试 我在使用 kubeadm 设置的虚拟机上使用单节点集群 我的要求包括在 k8s 中运行 MQTT 集群 vernemq 并通过 Ingress istio 进行外部访问 无需部署 ingre
  • Spring集成MQTT发布订阅多个主题

    我正在尝试构建一个订阅多个 mqtt 主题的应用程序 获取信息 处理它并形成 xml 并在处理时触发一个事件 以便这些可以发送到某个云服务器 并将成功的响应从那里发送回MQTT 通道
  • React Native 上的 MQTT?

    将 MQTT 添加到我的反应原生项目时 我很难找到正确的方法 该项目需要在 iOS 和 Android 上运行 因此理想情况下 MQTT 可以在 javascript 端处理 我意识到移动节点和经典节点的网络巢穴是不同的 所以我开始沿着分叉
  • WPF 应用程序的最佳本地数据库解决方案是什么?

    目前适用于 WPF 应用程序的最佳解决方案是什么一台电脑 where 各种用户登录它们并使用它们在本地获取 保存信息 以下是我看到选项的方式 MDF似乎是最好的选择 因为我假设您可以很好地锁定它 这样即使用户可以访问 mdf 文件 他们仍然
  • Docker 容器中的 LDAP 身份验证

    默认情况下 当Docker容器启动时 里面的用户是sudo I want 默认情况下将 sudo 用户锁定在容器中 在容器中使用 LDAP 身份验证而不是默认身份验证 当用户与映像一起提供时 或者在容器运行时由 sudo 用户创建 为此 我
  • 在文件之间共享 mqtt 客户端对象

    我这样连接到 MQTT mqtt js const mqtt require mqtt var options needed options var client mqtt connect mqtt someURL options clie
  • 将网站部署到云服务的最佳实践

    在云服务上部署多个网站的最佳实践是什么 我有三个网站 是否可以将这三个网站部署到一个云服务中 一个云服务三个实例 或者我是否必须创建三个云服务并单独部署每个网站 谢谢 我的服务定义文件
  • Google BigQuery 底层架构

    所以我大约 10 分钟前才开始摆弄 Google BigQuery 我想知道是否有人知道他们用来存储数据的底层架构 例如 这只是他们自己的下一代 BigTable 基础设施吗 另外 他们在索引 索引重建等方面使用什么样的策略是否清楚 我只是

随机推荐

  • 我的串口打印之坑——8266os_printf()适用于NONOS_SDK,故在自动生成APP代码中不能打印,要用uart0_sendStr( )函数(4)

    说到用安信可串口调试助手打印信息 首先明确esp8266nodeMCU有uart0 GPIO13 GPIO15 uart1 GPIO3 GPIO0 接下来 编程时候 1 首在user init 中先初始化uart init void ICA
  • JAVA面向对象的思想

    java面向对象 什么是面向对象思想 什么是面向对象 类和对象 类 对现实世界中某类事物的描述 是抽象的 概念上的定义 对象 事物具体存在的个体 抽象类 接口 成员变量和局部变量的区别 作用域 存储位置 初始值 构造方法 面向对象三大特性
  • Java的类加载器

    类加载是java语言提供的最强大的机制之一 尽管类加载并不是讨论的热点话题 但所有的编程人员都应该了解其工作机制 明白如何做才能让其满足我们的需 要 这能有效节省我们的编码时间 从不断调试ClassNotFoundException Cla
  • 代理IP与Socks5代理

    一代理IP 多地区数据采集的智能引擎 多地区市场了解 代理IP允许爬虫模拟多个地区的IP地址 实现对不同市场的数据采集 这为跨界电商深入了解不同地区需求 趋势提供了数据基础 规避反爬虫策略 许多网站采用反爬虫技术 限制频繁访问 代理IP通过
  • JavaWeb的Servlet的两种配置

    Servlet接口 要成为一个Servlet 需要实现Servlet接口 为了方便 可以继承HttpServlet HttpServlet实现了Servlet接口 Servlet生命周期 在Tomcat中Servlet是单例的 Servle
  • 如何使用Docker创建自定义网络

    目录 网络模式 1 bridge模式 默认模式 桥接模式 初识网络模式 查看桥接模式的特点 2 host模式 仅主机模式 使用守护进程的方式创建并启动且进入容器 查看仅主机模式下的网络配置 端口映射 3 如何创建自定义网络 网络模式 Doc
  • Unity3D 选中高亮效果shader的实现

    实现思路 平时我们可能觉得shader就是单纯用来进行渲染的 不会和逻辑代码产生什么交互 但是如果要做这种高亮的效果就需要使用代码来控制shader的显示了 所以物体选中高亮效果的实现其实就很简单 先写一个shader表现高亮效果 然后用另
  • Mybatis 学习笔记02 - CRUD

    目录 1 添加操作 1 1 在 UserDao 接口中新增 saveUser 方法 1 2 在映射配置文件 UserMapper xml 中配置添加操作 1 3 测试添加用户 1 4 测试结果 2 更新操作 2 1 在 UserDao 接口
  • FAST-LIO(二):程序运行&代码注释

    文章目录 前言 数据准备 程序运行 代码注释 1 laserMapping cpp 2 IMU Processing hpp 3 use ikfom hpp 前言 论文题目 FAST LIO A Fast Robust LiDAR iner
  • vue页面缓存解决方案

    关于vue页面通过解决方案 方案一 使用keep alive和v if 备注 这种方案有问题 关闭面板后 在通过菜单打开页面还是有缓存 1 添加keep alive
  • pycharm 怎么使用快捷键按出代码提示框

    更新win10 发现可以改取消ctrl space快捷键的占用了 我们在平时写代码的时候难免会出现敲错字母的时候 这时候你的代码提示框就会消失 很不爽 但你退格删掉错的字母的时候 代码提示框还是没有自动出现 就很烦 不想写代码了 其实都是w
  • 谈谈自己对IOC容器的理解(一)

    初学Java时 了解到Java是一门面向对象的语言 我感觉Java这面向对象好废 啥都要我自己弄 这跟C语言有啥区别 感觉Java也就这样了 完全体会不到面向对象的感觉 处处都是 面向过程 网上总说面向对象修房子是去找专门修房子的人来修 面
  • 安卓依赖冲突处理

    目录 一 模块依赖 二 打包时如何处理依赖 三 为什么依赖重复后会有报错 最后 一 模块依赖 这里引用一下谷歌链接 https developer android com studio build dependencies google m
  • 大话数据结构 2 算法

    算法 算法是解决特定问题求解步骤的描述 在计算机中表现为指令的有限序列 并且每条指令表示一个或多个操作 算法的五个基本特性 输入 输出 有穷性 确定性 可行性 1 输入输出 算法具有0个或多个输入 算法至少有1个或多个输出 2 有穷性 指算
  • 基于QT绘制可交互性的Bezier曲线

    前言 因为项目需要 要做一款类似AI里面的曲率工具出来 其实也类似Photoshop里面的钢笔工具 所以写了个demo来演练一番 之前是不懂Bezier的 但是网上找到的源码都是固定点的 但无论是钢笔工具还是曲率工具都是要能与鼠标键盘交互的
  • Node.js之高性能探秘

    Node js之高性能探秘 NodeJS是什么 简介 NodeJS的优点 一 对前端工程师友好 二 高性能 高性能的实现 单线程 非阻塞异步I O 事件驱动 事件循环机制 NodeJS是什么 简介 Node js是一个开源和跨平台的基于 C
  • matlab算法_决策树算法MATLAB实践

    在MATLAB中 为方便用户对决策树算法的使用 MATLAB中针对分类决策树和回归决策树分别封装了两个函数 fitctree和fitrtree 由于分类决策树和回归决策树两者具有极大的相似性 因此fitctree和fitrtree两者的使用
  • 我的世界java版tp_神奇的tp指令 我的世界tp指令的用法

    神奇的tp指令 我的世界tp指令的用法 tp指令是每个玩服务器的玩家都要了解和掌握的一个指令 那下面游戏园小编就给大家详细的介绍一下在我的世界中tp指令要怎么使用吧 希望大家喜欢 其实是运用到了指令之中的tp指令 tp 自己的名字 坐标 O
  • 走梅花桩步数

    题目描述 题目描述 Redraiment是走梅花桩的高手 Redraiment总是起点不限 从前到后 往高的桩子走 但走的步数最多 不知道为什么 你能替Redraiment研究他最多走的步数吗 样例输入 6 2 5 1 5 4 5 样例输出
  • 使用微信小程序连接到 MQTT 云服务

    微信小程序是腾讯于 2017 年 1 月 9 日推出的一种不需要下载安装即可在微信平台上使用的应用程序 用户扫一扫或者搜一下即可打开应用 也体现了 用完即走 的理念 用户不用关心是否安装太多应用的问题 应用将无处不在 随时可用 但又无需安装