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

news2024/12/23 16:56:40

概述

支付宝小程序作对外开放,有许许多多的好玩的地方,那么本文就在支付宝小程序上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))
        })

  • 连接效果图:

  •  

  • 工程目录:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9月25日星期一,早安心语早安问候语早读

1、 人生的幸福,一半要争,一半要随,争,不是与他人,而是与困苦,随,不是随波逐流,而是知止而后安,争,人生少遗憾;随,知足者常乐&…

Oracle 创建用户及模式

目录 1. 简言 2. 创建表空间 3. 创建用户与上面创建的文件形成映射关系 4. 添加权限 5. 登录 1. 简言 Oracle 创建数据库与用户一般一一对应, 准确的说可以 Oracle 中的 Schema 相当于 MySQL 中的数据库. Oracle 不支持创建自定义模式的, 想要创建模式的话只能新建一个用户…

Linux基础指令(五)

目录 前言1. 打包和压缩1.1 是什么1.2 为什么1.3 怎么办? 2. zip & unzip3. tar 指令结语: 前言 欢迎各位伙伴来到学习 Linux 指令的 第五天!!! 在上一篇文章 Linux基本指令(四) 当中,我们学习了 fin…

C++标准模板(STL)- 输入/输出操纵符-(std::endl)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

计算机毕设 基于大数据的抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;…

微信小程序的无限瀑布流写法

微信小程序的无限瀑布流实现总算做完了&#xff0c;换了好几种方法&#xff0c;过程中出现了各种BUG。 首先官方有瀑布流的插件&#xff08;Skyline /grid-view&#xff09;&#xff0c;不是原生的我就不想引入&#xff0c;因为我的方块流页面已经搭好了&#xff0c;引入说不定…

时空智友企业流程化管控系统任意文件上传漏洞复现【附POC】

文章目录 时空智友企业流程化管控系统任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.访问shell地址 0x06 修复建议 时空智友企业流程化管控系统任意文件上传漏洞复现 0x01 前言 免责声明&#xff1a;请…

股票难还是期货难?国内玩期货的人多吗?

股票和期货都是相对较难的金融投资工具。它们都有各自的优点和挑战&#xff0c;而且都需要深入了解市场、制定策略和进行风险管理。 就难度而言&#xff0c;期货和股票的难度主要在于以下方面&#xff1a; 1. 市场风险&#xff1a;股票和期货市场都存在风险&#xff0c;包括价格…

【沐风老师】3DMAX翻转折叠动画插件FoldFx使用方法详解

3DMAX翻转折叠动画插件FoldFx使用方法详解 3DMAX翻转折叠动画插件FoldFx&#xff0c;是3dMax运动图形工具&#xff0c;用于创建多边形折叠动画。用户几乎有无限的可能性&#xff0c;因为动画的每个方面都是可控的。 【适用版本】 适用于3dMax版本&#xff1a;2010及更新版本&a…

QT6.5.2编译PostgreSql驱动

一、环境 1、操作系统&#xff1a;win11 2、qt版本&#xff1a;6.5.2 3、PostgreSql版本:14.9 二、下载qbase源码 1、下载地址&#xff1a;https://github.com/qt/qtbase/tree/6.5.2 将下载的源码文件解压指定的的目录&#xff0c;找到src/plugins/sqldrivers根据自己的实…

基于springboot+vue的校园资产管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

小皮面板配置Xdebug,调试单个php文件

小皮面板配置Xdebug 首先下载phpstrom&#xff0c;和小皮面板 打开小皮面板&#xff0c;选中好要使用的php版本 然后点击【管理】> 【php扩展】> 【xdebug】 然后打开选中好版本的php位置 D:\Program_Files\phpstudy_pro\Extensions\php\php7.4.3nts打开php.ini文件…

[0CTF 2016]piapiapia 代码审计 字符串逃逸 绕过长度限制

第一次直接打包代码 然后查看有没有洞 学习一下 降低速度扫描dirsearch -t 2 超低速 扫描扫到了 /www.zip /profile.php /register.php /upload/ 未加参数 我们直接去看看 我们直接下载备份文件即可 config.php 存在flag变量 class.php 然后我们分析一下class.php &…

Visual Studio 2019 C# winform CefSharp 中播放视频及全屏播放

VS C# winform CefSharp 浏览器控件&#xff0c;默认不支持视频播放&#xff0c;好在有大佬魔改了dll&#xff0c;支持流媒体视频播放。虽然找了很久&#xff0c;好歹还是找到了一个版本100.0.230的dll&#xff08;资源放在文末&#xff09; 首先创建一个项目 第二、引入CefSha…

VMware安装debian11虚拟机详细步骤

VMware安装debian11虚拟机详细步骤&#xff0c;超详细&#xff0c;一次搞定。 目录 1&#xff0c;新建虚拟机 2&#xff0c;开始安装 3&#xff0c;磁盘分区&#xff08;手动&#xff09; 分区设置 配置LVM卷 4&#xff0c;软件包管理器、网络镜像等 5&#xff0c;完成安…

UOS 序列号激活指令及方法

前言&#xff1a;本方案主要介绍了6种不同的激活方式&#xff0c;包括 1、在线激活&#xff1b; 2、离线激活&#xff1b; 3、激活文件激活&#xff1b; 4、终端命令激活&#xff1b; 5、试用期激活&#xff1b; 6、测试激活码激活。 附&#xff1a;激活码正版验证网页&#xf…

Fedora Linux 39 Beta 预估 10 月底发布正式版

Fedora 39 Beta 镜像于今天发布&#xff0c;用户可以根据自己的使用偏好&#xff0c;下载 KDE Plasma&#xff0c;Xfce 和 Cinnamon 等不同桌面环境版本&#xff0c;正式版预估将于 10 月底发布 Fedora 39 Beta 版本主要更新了 DNF 软件包管理器&#xff0c;并优化了 Anaconda …

kotlin的集合使用maxBy函数报NoSuchElementException

kotlin设定函数 fun test() {listOf<Int>().maxBy { it } } 查看java实现

Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验

在做项目时&#xff0c;需要根据需要动态添加或新增表单&#xff0c;同时还需要对表单做校验。详情如下图&#xff1a; 刚开始做表单验证的时候&#xff0c;对于这个动态的表单验证有点难搞&#xff0c;试了好几种方法都没有搞定。最后按照下面这种方法实现了&#xff0c;以此…

Express 基础操作和详解

Express 基础操作和详解 Express.js 是一个基于 Node.js 平台的 Web 应用程序框架&#xff0c;它旨在帮助开发者轻松构建和管理 Web 服务和应用程序。Express 提供了许多强大的功能&#xff0c;使得创建可扩展、灵活且高性能的 Web 应用变得相对容易。以下是 Express 的主要特点…