当前位置:   article > 正文

微信小程序使用MQTT的小例子_微信小程序mqtt

微信小程序mqtt

本文章大部分内容来自MQTT官方教程,有需要的可以去MQTT官网查看,这里只分享一下自己的使用过程。谢谢大家观看!

首先我们使用微信开发者工具创建一个空项目。

不使用云开发,不使用模板。

然后我们去MQTT网址,或者下方链接下载mqtt.mini.js

这个可以下载mqtt.mini.jsicon-default.png?t=N7T8https://unpkg.com/mqtt@4.2.1/dist/mqtt.min.js

在项目根目录下新建 utils 文件夹,有的话就不用新建了,将下载好的对应版本的 mqtt.min.js 文件放入该文件夹中,在 index.js 中通过如下方式引入 mqtt:

import mqtt from "../../utils/mqtt.min.js";

然后再pages目录中找到index文件夹,里面有四个文件:

在index.js中输入如下代码:

index.js

  1. import mqtt from "../../utils/mqtt.min.js";
  2. Page({
  3. data: {
  4. client: null,
  5. conenctBtnText: "连接",
  6. host: "mqtt-server.lierxun.com.cn",
  7. subTopic: "testtopic",
  8. pubTopic: "testtopic",
  9. pubMsg: "Hello! I am from WeChat miniprogram",
  10. receivedMsg: "",
  11. mqttOptions: {
  12. username: "",
  13. password: "",
  14. reconnectPeriod: 1000, // 1000毫秒,设置为 0 禁用自动重连,两次重新连接之间的间隔时间
  15. connectTimeout: 30 * 1000, // 30秒,连接超时时间
  16. // 更多参数请参阅 MQTT.js 官网文档:https://github.com/mqttjs/MQTT.js#mqttclientstreambuilder-options
  17. // 更多 EMQ 相关 MQTT 使用教程可在 EMQ 官方博客中进行搜索:https://www.emqx.com/zh/blog
  18. },
  19. },
  20. setValue(key, value) {
  21. this.setData({
  22. [key]: value,
  23. });
  24. },
  25. setHost(e) {
  26. this.setValue("host", e.detail.value);
  27. },
  28. setSubTopic(e) {
  29. this.setValue("subTopic", e.detail.value);
  30. },
  31. setPubTopic(e) {
  32. this.setValue("pubTopic", e.detail.value);
  33. },
  34. setPubMsg(e) {
  35. this.setValue("pubMsg", e.detail.value);
  36. },
  37. setRecMsg(msg) {
  38. this.setValue("receivedMsg", msg);
  39. },
  40. connect() {
  41. // MQTT-WebSocket 统一使用 /path 作为连接路径,连接时需指明,但在 EMQX Cloud 部署上使用的路径为 /mqtt
  42. // 因此不要忘了带上这个 /mqtt !!!
  43. // 微信小程序中需要将 wss 协议写为 wxs,且由于微信小程序出于安全限制,不支持 ws 协议
  44. try {
  45. this.setValue("conenctBtnText", "连接中...");
  46. const clientId = new Date().getTime();
  47. this.data.client = mqtt.connect(`wxs://${this.data.host}:8084/mqtt`, {
  48. ...this.data.mqttOptions,
  49. clientId,
  50. });
  51. this.data.client.on("connect", () => {
  52. wx.showToast({
  53. title: "连接成功",
  54. });
  55. this.setValue("conenctBtnText", "连接成功");
  56. this.data.client.on("message", (topic, payload) => {
  57. wx.showModal({
  58. content: `收到消息 - Topic: ${topic},Payload: ${payload}`,
  59. showCancel: false,
  60. });
  61. const currMsg = this.data.receivedMsg ? `<br/>${payload}` : payload;
  62. this.setValue("receivedMsg", this.data.receivedMsg.concat(currMsg));
  63. });
  64. this.data.client.on("error", (error) => {
  65. this.setValue("conenctBtnText", "连接");
  66. console.log("onError", error);
  67. });
  68. this.data.client.on("reconnect", () => {
  69. this.setValue("conenctBtnText", "连接");
  70. console.log("reconnecting...");
  71. });
  72. this.data.client.on("offline", () => {
  73. this.setValue("conenctBtnText", "连接");
  74. console.log("onOffline");
  75. });
  76. // 更多 MQTT.js 相关 API 请参阅 https://github.com/mqttjs/MQTT.js#api
  77. });
  78. } catch (error) {
  79. this.setValue("conenctBtnText", "连接");
  80. console.log("mqtt.connect error", error);
  81. }
  82. },
  83. subscribe() {
  84. if (this.data.client) {
  85. this.data.client.subscribe(this.data.subTopic);
  86. wx.showModal({
  87. content: `成功订阅主题:${this.data.subTopic}`,
  88. showCancel: false,
  89. });
  90. return;
  91. }
  92. wx.showToast({
  93. title: "请先点击连接",
  94. icon: "error",
  95. });
  96. },
  97. unsubscribe() {
  98. if (this.data.client) {
  99. this.data.client.unsubscribe(this.data.subTopic);
  100. wx.showModal({
  101. content: `成功取消订阅主题:${this.data.subTopic}`,
  102. showCancel: false,
  103. });
  104. return;
  105. }
  106. wx.showToast({
  107. title: "请先点击连接",
  108. icon: "error",
  109. });
  110. },
  111. publish() {
  112. if (this.data.client) {
  113. this.data.client.publish(this.data.pubTopic, this.data.pubMsg);
  114. return;
  115. }
  116. wx.showToast({
  117. title: "请先点击连接",
  118. icon: "error",
  119. });
  120. },
  121. disconnect() {
  122. this.data.client.end();
  123. this.data.client = null;
  124. this.setValue("conenctBtnText", "连接");
  125. wx.showToast({
  126. title: "成功断开连接",
  127. });
  128. },
  129. });

在index.wxml中输入如下代码:

  1. <view class="container">
  2. <view class="label">连接地址(域名):</view>
  3. <input bindinput="setHost" value="{{ host }}" />
  4. <view class="is-flex">
  5. <button type="primary" bindtap="connect">{{ conenctBtnText }}</button>
  6. <button type="warn" disabled="{{ conenctBtnText === '连接' }}" bindtap="disconnect">断开连接</button>
  7. </view>
  8. <view class="label">订阅主题:</view>
  9. <input bindinput="setSubTopic" value="{{ subTopic }}" />
  10. <view class="is-flex">
  11. <button type="primary" bindtap="subscribe">订阅</button>
  12. <button type="warn" bindtap="unsubscribe">取消订阅</button>
  13. </view>
  14. <view class="label">发布主题:</view>
  15. <input bindinput="setPubTopic" value="{{ pubTopic }}" />
  16. <view class="label">发布消息:</view>
  17. <input bindinput="setPubMsg" value="{{ pubMsg }}"></input>
  18. <view class="is-flex">
  19. <button type="primary" bindtap="publish">发布</button>
  20. </view>
  21. <view class="label">收到的消息:</view>
  22. <view class="received-msg-box">
  23. <rich-text nodes="{{receivedMsg }}"></rich-text>
  24. </view>
  25. </view>

在index.css中输入如下代码:

  1. /* pages/user/index.wxss */
  2. .container {
  3. padding-top: 26px;
  4. overflow-x: hidden;
  5. z-index: 1;
  6. }
  7. .user-avatar {
  8. margin: 10px 0 10px 30px;
  9. }
  10. .user-avatar-shadow {
  11. box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.23), 0 6px 15px 0 rgba(0, 0, 0, 0.22);
  12. }
  13. .user-nickname {
  14. padding: 27px 0 0 10px;
  15. font-size: 18px;
  16. width: 300px;
  17. }
  18. .user-menu {
  19. padding-top: 25px;
  20. }
  21. .user-load {
  22. width: calc(100% - 32px);
  23. padding: 20px 16px;
  24. border-radius: 20px;
  25. overflow: hidden;
  26. }
  27. .user-load-notic {
  28. padding: 0 0 20px 15px;
  29. }
  30. .user-load-title {
  31. font-size: 13px;
  32. padding-bottom: 10px;
  33. }
  34. .user-load-list {
  35. font-size: 12px;
  36. color: gray;
  37. padding: 0 0 5px 2px;
  38. }
  39. .user-load-button {
  40. width: calc(100% - 48px);
  41. padding-left: 24px;
  42. }

编译运行之后显示如下界面:

然后我们再打开MQTTX官方提供的工具,点我可以下载

添加一个主题,我这里随便写一个主题名字:

然后我们在小程序里面输入同一个服务器,同一个主题名,然后点击连接,订阅。

就可以发布消息试试了,MQTT客户端也可以收到,也可以发送

以上就是本文章内容,更详细的内容,可以去官方链接(点击就可以),祝大家早日财富自由!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号