热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信小程序使用MQTToverWebSocket连接阿里云IoT物联网平台

微信小程序使用MQTToverWebSocket连接阿里云IoT物联网平台,Go语言社区,Golang程序员人脉社

前言

最近公司要做物联网控制,觉得写app不能够兼容Android和iOS,于是选定了微信小程序来作为控制端,为了能够实时的监听到设备的状态变化,需要服务器能够主动推消息给小程序,一开始考虑了websocket,由服务器进行上报的数据监听,小程序使用websocket连接服务器接收消息,虽然能实现,但是加上业务逻辑之后就太复杂终归不好

于是想着,websocket既然能够连接实现数据的收发,那无非就是在上面做一层协议了,那mqtt岂不是应该也是可以的,然后回去翻官方文档,果然发现了MQTT over WebSocket,可以直连阿里云物理网平台,找了许久才找到官方的一个库aliyun-iot-client-sdk,但是却不是针对小程序的,代码上也有出入,于是又花了两天的时间查找各种资料测试,走了不少的弯路(毕竟我不是专门搞前端,难为了我这搞Android的了),最终还是搞定了,到头来发现还是自己不够细心,以此为记,希望能给后来者提供点帮助。

准备工作

  1. 去Github下载MQTT.js 库;一开始没注意,搞了很久,还把项目下下来自己编译,各种报错,最终也编译出来了,可后来发现其实有现成的单文件可用的,https://unpkg.com/mqtt/dist/mqtt.min.js,点击打开链接然后右键另存为即可(当前版本:2.18.8)。
  2. 去官方库aliyun-iot-client-sdk下载hmac-sha1算法库hex_hmac_sha1.js(当然也可以使用其他的库,比如crypto-js),点击打开链接然后右键另存为即可(其实官方库就是用的mqtt.js库,只是没有针对小程序,无法直接在小程序上使用)
  3. 下载微信开发者工具,并新建一个项目
  4. 拷贝刚刚下载的两个mqtt.min.js和hex_hmac_sha1.js到utils目录中去
  5. 勾选微信开发工具----【不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书】选项或者配置开发者后台socket 合法域名 为:wss://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com(替换productKey为自己的产品key)

开始编码

随便在一个页面的js文件中加入以下代码,注意替换参数为自己产品和设备的参数

var mqtt = require('../../utils/mqtt.min.js') const crypto = require('../../utils/hex_hmac_sha1.js'); Page({ data: { }, onLoad: function () { this.doConnect() }, doConnect(){ const deviceConfig = { productKey: "替换", deviceName: "替换", deviceSecret: "替换", regionId: "cn-shanghai" }; const options = this.initMqttOptions(deviceConfig); console.log(options) //替换productKey为你自己的产品的 const client = mqtt.connect('wxs://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com',options) client.on('connect', function () { console.log('连接服务器成功') //订阅主题,替换productKey和deviceName(这里的主题可能会不一样,具体请查看后台设备Topic列表或使用自定义主题) client.subscribe('/productKey/deviceName/get', function (err) { if (!err) { console.log('订阅成功!'); } }) }) //接收消息监听 client.on('message', function (topic, message) { // message is Buffer console.log('收到消息:'+message.toString()) //关闭连接 client.end() }) }, //IoT平台mqtt连接参数初始化 initMqttOptions(deviceConfig) { const params = { productKey: deviceConfig.productKey, deviceName: deviceConfig.deviceName, timestamp: Date.now(), clientId: Math.random().toString(36).substr(2), } //CONNECT参数 const options = { keepalive: 60, //60s clean: true, //cleanSession不保持持久会话 protocolVersion: 4 //MQTT v3.1.1 } //1.生成clientId,username,password options.password = this.signHmacSha1(params, deviceConfig.deviceSecret); options.clientId = `${params.clientId}|securemode=2,signmethod=hmacsha1,timestamp=${params.timestamp}|`; options.username = `${params.deviceName}&${params.productKey}`; return options; }, /* 生成基于HmacSha1的password 参考文档:https://help.aliyun.com/document_detail/73742.html?#h2-url-1 */ signHmacSha1(params, deviceSecret) { let keys = Object.keys(params).sort(); // 按字典序排序 keys = keys.sort(); const list = []; keys.map((key) => { list.push(`${key}${params[key]}`); }); const contentStr = list.join(''); return crypto.hex_hmac_sha1(deviceSecret, contentStr); } })

运行代码在控制台设备Topic列表发布消息:
在这里插入图片描述
即可看到如下
在这里插入图片描述

更多的参数设置请查看mqtt.js文档和阿里云物联网Iot官方文档,同时,mqtt.js支持其他小程序如支付宝小程序等,这里我没做测试,可自己查看mqtt.js文档

鉴于很多人加我问了挺多相同的问题,我这里就列出来常见的几个问题

  1. 问:为什么设备连上之后小程序就断开或者小程序连上之后设备就断开?
    答:这是因为小程序和设备使用了同一组参数导致的,这是mqtt协议里的规定,同一clientId只能有一个连接(具体请查看mqtt协议文档);通常这是因为不够了解mqtt协议想设备和小程序之间直接通信才会这样使用,从而导致问题的发生。

  2. 问:接上一问题,既然不能使用同一组参数,那小程序和设备如何通信?
    答:

    1. 使用RRPC方式,但需要自建后台服务器,集成服务器SDK(理论上也是可以不用搭建服务器,但是非常非常不推荐这样做,因为这样很容易暴露一些关键的信息,有着非常大的安全隐患)
    2. 使用规则引擎或者路由转发(需要搭建后台服务器),具体使用方式可以参考官方的最佳实践文档:基于规则引擎的M2M设备间通信和基于Topic消息路由的M2M设备间通信,通常来说,实际的业务需求是离不开后台服务器的,所以基本上都是要搭建后台服务器的。

最后很重要的一点:一定一定要先了解好mqtt协议,这个很重要,因为不管是阿里云物联网还是百度、华为等物联网平台,最基础的都是基于mqtt协议,其他的大同小异,万变不离其宗。

参考:
微信小程序-MQTT模拟器 连接阿里云IoT物联网平台

有任何其他疑问,可以加我QQ一起交流:343672271(备注:mqtt)


推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
author-avatar
哈行小DWW_421
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有