在支付宝小程序上websocket实现mqtt协议连接服务器控制硬件

概述

支付宝小程序作对外开放,有许许多多的好玩的地方,那么本文就在支付宝小程序上websocket实现mqtt协议连接服务器控制智能硬件!!

详细

一、前言;


 
  1. 那么本系列连载的博文,都是围绕着 支付宝小程序如何实现控制 esp8266 为主线的!

二、回忆支付宝小程序移植的过程;


  • 2019年4月26号
  • 
    
            初接触支付宝小程序,,毕竟听前辈说这个可以支持个人开发了,很顺畅地注册成功了!开始研究其结构,因为我是比较熟悉微信小程序开发的,看到支付宝的demo我一下子就觉得这个和微信小程序差不多的!
            直到晚上9点半,我看到 GitHub 有一个 MQTT.js 库支持 支付宝小程序 mqtt的协议实现,我像是打了胰岛素一样非常兴奋,意味着我们 支付宝小程序可以控制智能设备 了,而且容易实现!
            这晚上我折腾到了凌晨12点半,早上九点还要上班呢。所幸的是,我在虚拟机(支付宝开发工具 提供)上运行并连接服务器成功了!之后我调试到真机也行了!但预览连接失败?但是我内心还是兴奋的,毕竟虚拟机是成功哇!!
    早上带熊猫眼上班,总结凌晨的开发预览到 真机就失败?我在想是不是 ios 和 android 的机子问题?于是乎我换个 ios 手机,一样地还是预览失败!按照以往的开发经验,是否 未检查域名? 还是不对!于是乎我 ios 报错的截图拿给了 支付宝小程序开发官方钉钉群里面。报错是 某个类未定义,如下截图:

    三、注册账号了解支付宝开发者工具结构;


    前面说了这么多东西,下面开始讲本博文的主要内容吧!

    官网注册:支付宝开放平台 自己支付宝APP扫描登录申请!

    官网的结构开发文档:小程序文档 - 支付宝文档中心

    开发工具的调试功能 有调试、预览,可以编译到虚拟机模拟器上,也可以调试和预览到真机,但是必须打开支付宝app!上传功能是把这次开发的版本放在服务器,服务器可以提供二维码给测试人员使用!

    查看日志打印,点击最下面的“调试”按钮,就可以看到调试日志了,包括自己的 console.log 日志!

    具体的开发API文档使用demo,支付宝也有提供了,在创建工程时候,有个模版选择,大家可以试下选择他,熟悉下开发的结构!

    再次声明,请勿在模拟器上调试websocket !!


    四、移植过程中特别注意的点;


  • 我们知道, mqtt 只是一种协议,而我们 websocket 是负责通讯的底层,它是在 前端JavaScript上实现的长连接 通讯。类似我们的 tcp 长连接,当我们清楚地知道这个原理之后。我们仅仅负责如何收发数据的逻辑就可以了!

    服务器上,我还是使用 EMQ 。而支付宝小程序我使用的是仍然是 GitHub上面一个出名的库:GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser 。主要是因为他已经是实现了 数据的生成和解析。


    4.1 连接

  • url必须是 以 wss 或者 ws ,但是如果上架,那就必须是 wss 了 !
  •     my.connectSocket({
          url: url,
          success: (res) => {
            console.log('connect url: ' + url)
          }, 
          fail:(res)=>{
             console.log('connect fail:'+JSON.stringify(res))
          }
        })

    4.1 websocket的连接和监控数据接收;

  • 这里实现的是打开 socket 以及对数据的监控!
  • //打开 socket
     my.onSocketOpen(function (res) {
        stream.setReadable(proxy)
        stream.setWritable(proxy)
        stream.emit('connect')
      })
      //被动关闭 socket 的回调
      my.onSocketClose(function (res) {
        console.log('WebSocket onSocketClose !' + res);
        stream.end()
        stream.destroy()
      })
      //打开 socket错误回调!
      my.onSocketError(function (res) {
        stream.destroy(res)
      })
      //监听到socket的数据下发回调
       my.onSocketMessage((res) => {
        //这里主要是对数据的判断,因为有时候是字符串,有时候是数组!
        if (typeof res.data === 'string') {
          var array = base64.toByteArray(res.data)
          var buffer = Buffer.from(array)
          proxy.push(buffer)
        } else {
          var reader = new FileReader()
            reader.addEventListener('load', function () {
            var data = reader.result
            if (data instanceof ArrayBuffer) data = Buffer.from(data)
            else data = Buffer.from(data, 'utf8')
            proxy.push(data)
          })
          reader.readAsArrayBuffer(res.data)
        }
      });

    4.2 websocket的发送;

  • 这步最为关键,与微信小程序不一样的是:他必须要把我们发送的数据处理为 base64 编码,之后再传给 sendSocketMessage ,以及在形参 isBuffer赋值为 true 表示当前发送是 buffer 数组,之后 SDK 会自动处理反解密发送出去!
  • 我就是在这个坑踩了好久,以此说明下!!对于 websocket的官网说明链接在此
  • 具体的错误码以及使用大家可以去官网了解下!
  • //senddata 是经过base64加密的arry数组
        my.sendSocketMessage({ 
          data: senddata,
          isBuffer:true,
          success: function (res) {
            next()
          },
          fail: function (res) {
            next(new Error())
          }
        })

    五、如何使用?


  • 连接的服务器域名,注意格式!!! 前缀是 alis ,端口号不限,我这里是 443 也就是我之前用微信小程序连接的那个服务器端口!
  •     const host = 'alis://www.domain.cn:443/mqtt';

    配置:

  •       options: {
              protocolVersion: 4, //MQTT连接协议版本
              clientId: 'alis Mini',
              myAli: null,
              clean: true,
              password: 'xuhong123456',
              username: 'admin',
              reconnectPeriod: 1000, //1000毫秒,两次重新连接之间的间隔
              connectTimeout: 30 * 1000, //1000毫秒,两次重新连接之间的间隔
              resubscribe: true //如果连接断开并重新连接,则会再次自动订阅已订阅的主题(默认true)
            }
        this.data.client = mqtt.connect(host, this.data.options);
        this.data.client.on('connect', function (connack) {
          my.showToast({ content: "连接成功", type: 'success' })
        })
    //服务器下发消息的回调
        that.data.client.on("message", function (topic, payload) {
          console.log(" 收到 topic:" + topic + " , payload :" + payload)
          my.showToast({ content: " 收到topic:[" + topic + "], payload :[" + payload + "]", type: 'success' })
        })
        //服务器连接异常的回调
        that.data.client.on("error", function (error) {
          console.log(" 服务器 error 的回调" + error)
          my.showToast({ content: "连接服务器失败,错误信息:" + error, type: 'exception', })
        })
        //服务器重连连接异常的回调,一般是域名或者服务器不存在
        that.data.client.on("reconnect", function () {
          console.log(" 服务器 reconnect的回调")
          my.showToast({ content: "连接服务器失败,正在重连...", type: 'exception', })
        })
        //服务器连接异常的回调
        that.data.client.on("offline", function (err) {
          console.log(" 服务器offline的回调"+JSON.stringify(err))
        })

  • 连接效果图:

  •  

  • 工程目录:
<think>好的,用户想了解如何在小程序中使用MQTT协议,特别是集成教程、示例代码和使用方法。首先,我需要整理现有的引用资料,看看有哪些关键点需要覆盖。根据提供的引用,用户提到了小程序配置、分包加载mqtt.min.js、支付宝小程序的集成以及uniapp中的常见错误处理。 首先,我应该分步骤讲解集成流程,比如配置域名、引入MQTT库、连接配置等。引用[1]提到小程序网页配置和原生/uniapp适用,这可能涉及白名单设置。引用[2]提到了在onLaunch中加载mqtt.min.js,并封装useMqtt.js,这部分需要详细说明代码结构。引用[4]解决了uniapp中的c.onOpen错误,应该作为注意事项提醒用户。 接下来,示例代码部分需要展示关键代码片段,比如连接MQTT、订阅主题、消息处理等。同时,要确保代码正确使用分包加载,避免常见错误。引用[3]提到支付宝小程序的集成,可能需要简要说明不同平台的差异,但用户主要关注的是通用方法,所以可能放在扩展部分。 注意事项部分需要涵盖协议版本、SSL证书、异步加载和错误处理,这些都是引用中提到的重点。例如,引用[4]中的错误可能是因为库版本或加载方式不正确,需要提醒用户使用正确的库版本和加载方法。 最后,生成的相关问题需要围绕用户可能遇到的后续问题,比如不同框架的适配、错误调试、消息机制优化等,这有助于用户进一步探索解决方案。需要确保问题覆盖集成步骤、常见错误、性能优化和应用场景,参考引用中的各个部分。</think>### 小程序集成MQTT协议教程 #### 一、核心配置步骤 1. **域名白名单配置** 在小程序后台(微信/支付宝)的「开发设置」中添加MQTT服务器域名和端口到合法域名列表,例如:$mqtts://example.com:8883$[^1][^3] 2. **引入MQTT库** 推荐通过分包异步加载方式引入`mqtt.min.js`(建议使用v4.2.6+版本),避免主包体积过大: ```javascript // app.js require('./utils/mqtt.min.js') ``` 或使用动态加载(微信小程序): ```javascript require('../../libs/mqtt.min.js') ``` 3. **封装连接方法**(以uniapp为例) ```javascript // utils/useMqtt.js export function connectMqtt() { const client = mqtt.connect('wss://example.com/mqtt', { clientId: `mini_${Date.now()}`, protocolVersion: 5 // 必须指定协议版本[^4] }) client.on('connect', () => { console.log('MQTT Connected') client.subscribe('topic/#') }) return client } ``` #### 二、完整示例代码 ```javascript // 页面或组件中 import { connectMqtt } from '@/utils/useMqtt' export default { onLoad() { this.mqttClient = connectMqtt() this.mqttClient.on('message', (topic, payload) => { console.log('收到消息:', topic, payload.toString()) }) }, methods: { sendMessage() { this.mqttClient.publish('topic/control', 'Hello MQTT') } }, onUnload() { this.mqttClient.end() // 必须手动断开连接[^2] } } ``` #### 三、关键注意事项 1. **协议版本适配** 必须显式指定`protocolVersion:5`参数,避免出现`c.onOpen is not a function`错误 2. **SSL证书要求** 必须使用TLS加密连接,且域名需备案,推荐使用`wss://`协议 3. **异步加载优化** 建议在`onLaunch`阶段预加载MQTT库: ```javascript // app.vue onLaunch() { require('@/libs/mqtt.min.js') } ``` 4. **跨平台兼容方案** uniapp项目需添加条件编译: ```javascript // #ifdef H5 || MP-WEIXIN const client = mqtt.connect(...) // #endif ``` #### 四、调试技巧 1. 使用`mqtt://test.mosquitto.org:8081`公共测试服务 2. 开启WebSocket调试工具抓包 3. 使用`client.on('error')`捕获异常
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西安未央

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值