官方已经开源了一个SDK版本,也是基于mqtt.js,进行了各种封装:

https://github.com/aliyun/alibabacloud-iot-device-sdk
·

阅读以下内容需要你具备相应的基础知识,包括JavaScript,微信小程序,css,html等,不要私信我询问一些基础的比如全局变量,json数据怎么解析,微信小程序语法等等基础知识问题

·
esp8266连接可参考我的另一篇文章Esp8266 nodemcu 使用PubSubClient连接阿里云物联网平台

如果你不想使用官方sdk,或者想了解下连接服务器的流程,可以继续往下看

准备工作

  1. 去Github下载MQTT.js 库;一开始没注意,搞了很久,还把项目下下来自己编译,各种报错,最终也编译出来了,可后来发现其实有现成的单文件可用的,https://unpkg.com/mqtt/dist/mqtt.min.js,点击打开链接然后右键另存为即可(当前版本:2.18.8,)。-------ps:4.2.0版本以上(不包括4.2.0)目前似乎是存在问题,会连接不上
  2. 去官方早期仅支持web端的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,还有注意区域是不是cn-shanghai,不是也要替换)

温馨提醒:因为缓存原因,如果你配置开发者后台socket 合法域名后导致程序无法连接服务器(模拟器可正常连接),请试试手动删掉手机上的小程序后重新编译安装即可(或者调试模式下可以连接服务器,退出调试模式就连接不了,也可以试试删掉小程序重新运行安装重试)

开始编码(如果你不懂什么是后端服务云开发,新建项目请勾选【不使用云服务】)

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

特别注意:不要使用同一组参数(即三元组:ProductKey,DeviceName,DeviceSecret)在多个地方同时进行连接,即一组三元组同一时间只能存在一个连接,否则会相互挤掉线反复重连!!!(常见情形为:模拟打开运行同时又真机调试运行或者小程序和硬件设备使用同一组参数等等),不要想着用一组参数同时在小程序和硬件设备上使用,然后进行通信,这是错误的做法。

更多限制请查看官方文档

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为你自己的产品的(注意这里是wxs,不是wss,否则你可能会碰到ws不是构造函数的错误)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/user/get', function (err) {if (!err) {console.log('订阅成功!');}})})//接收消息监听client.on('message', function (topic, message) {// message is Bufferlet msg = message.toString();console.log('收到消息:'+msg);//关闭连接 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, //60sclean: true, //cleanSession不保持持久会话protocolVersion: 4 //MQTT v3.1.1}//1.生成clientId,username,passwordoptions.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官方文档,上面的示例代码仅供参考,其中的api接口随时间可能会有变动的,具体查看最新的官方文档。

PS:如果你仅仅是简单的写个demo或者小需求,不一定非得使用官方Alink JSON的物模型,这样反倒会把问题复杂化(相信大多数人第一次看文档基本上做不到完全理解透),转而完全可以使用自定义格式的json数据(即新建产品时数据格式选择=》透传/自定义)和自定义主题或者默认的xx/xx/user/get和xx/xxx/user/update主题就能实现大部分的需求(不借助服务器也可以实现简单双向通信控制–规则引擎),官方的[ICA 标准数据格式]Alink JSON的物模型本质上也是规定了相应的json格式数据和主题等,这些内容官方文档里都有说明,你认真去看了就会发现这里的内容绝大部分都是出自官方文档。

鉴于很多人加我问了挺多相同的问题,我这里就列出问的最多的问题,只要结合官方文档认认真真的看,然后看看评论区,基本能解决90%以上的问题。

  1. 问:为什么硬件设备连上之后小程序就断开或者小程序连上之后硬件设备就断开(或者反复断开和重连)?
    答:这是因为同一时间使用了同一组设备参数【ProductKey,DeviceName,DeviceSecret】 连接了两次以上,通常表现为小程序进行了两次以上连接(例如模拟器和真机调试一起运行)或者小程序和硬件设备使用了**同一组设备参数【ProductKey,DeviceName,DeviceSecret】**导致的,mqtt协议里规定同一clientId只能有一个连接(具体请查看mqtt协议文档),但是阿里云物联网稍有不同,还会根据使用的参数【ProductKey,DeviceName,DeviceSecret】做判断;通常做法是我们在阿里云物联网控制台创建一个产品对应小程序端,另一个产品对应硬件设备端,然后分别在相应的产品下创建设备,之后分别获取各自三元组参数设置到小程序和硬件设备即可(即需要两组参数【ProductKey,DeviceName,DeviceSecret】)。

  2. 问:接上一问题,既然不能使用同一组设备参数【ProductKey,DeviceName,DeviceSecret】,那小程序和硬件设备之间该如何通信?
    答:
    标准的mqtt协议里,我们一般相互通信是直接订阅双方相应的主题,然后往主题发布消息即可,但是阿里云物联网平台的主题的订阅和发布都是设有权限的,并且在订阅主题之后还需要设定相应的规则去转发数据,否则即使你订阅了相应的主题,但还是不会收到控制端或其他的硬件设备端发过来的消息的。具体的主题订阅权限和默认设置可查看对应产品详情里Topic类列表即可,那么数据转发方式有以下几种:

    1. 使用RRPC方式(此方式只能app主动发消息给设备,设备进行应答,设备无法主动向app发送消息,适用场景一般为app需要确认设备已经接收和处理好信息),但需要自建后台服务器,集成服务器端SDK(当然也是可以不用搭建服务器,直接本地调用,但是非常非常不推荐这样做,因为这样很容易暴露一些关键的配置信息,有着非常非常大的安全隐患)
    2. 使用规则引擎—云产品流转(推荐,可实现标准mqtt里的相互收发)或者路由转发(一般需要搭建后台服务器),具体使用方式可以参考官方的最佳实践文档:基于规则引擎的M2M设备间通信和基于Topic消息路由的M2M设备间通信。
  3. 问:出现closeSocket:fail WebSocket is not connected错误
    这个错误一般是调用end方法断开连接时出现,一般情况下不影响,可以忽略

  4. 问:订阅主题不成功
    排查步骤:

    1. 请在产品-topic类列表下查看该主题是否存在
    2. 该主题操作权限是否为可订阅权限(特别注意:设备只能订阅属于自己的主题,无法订阅其他设备的主题
    3. 查看代码主题书写是否正确

很重要的两点:1.认真看官方文档,绝大部分问题都能在文档里找到答案 2.了解mqtt协议的机制和工作原理。

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

如果觉得有帮到你,可以右下角顺手点个赞支持一下。

如果你使用的是支付宝小程序,可以看看这一篇https://blog.csdn.net/ngl272/article/details/108164127

微信小程序使用MQTT.js连接阿里云IoT物联网平台相关推荐

  1. 【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)

    [微信小程序控制硬件第1篇 ] 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! [微信小程序控制硬件第2篇 ] 开始微信小程序之旅,导入小程序Mqtt客户 ...

  2. 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台

    前言 之前写了一篇微信小程序使用MQTT over WebSocket连接阿里云IoT物联网平台,介绍了如何使用mqtt.js在微信小程序上连接mqtt服务器,文中顺带提了mqtt.js是支持支付宝小 ...

  3. 微信小程序使用MQTT远程控制单片机——阿里云物联网平台

    微信小程序使用MQTT远程控制单片机--阿里云物联网平台① 阿里云物联网平台的使用 第一,注册阿里云 第二,找到找到物联网平台并创建设备 MQTT协议格式的讲解 MQTT中文文档 固定报头 Fixed ...

  4. MQTT协议与阿里云IoT物联网平台

    1.MQTT协议介绍 1.1 MQTT协议 MQTT(消息队列遥测传输) 是基于 TCP/IP 协议栈而构建的支持在各方之间异步通信的消息协议.MQTT在空间和时间上将消息发送者与接收者分离,因此可以 ...

  5. STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台

    STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台   Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指 ...

  6. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台...

    支付宝小程序-MQTT模拟器通过WSS接入阿里云IoT物联网平台 准备工作 1.1 注册阿里云账号 开通阿里云账号,并通过支付宝实名认证 https://www.aliyun.com 1.2 免费开通 ...

  7. 解密阿里云IoT物联网平台MQTT Access Server核心架构

    MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布.订阅信息传输协议.MQTT已逐渐成为IoT领域最热门的协议,也是国内外各大物联网平台最主流的传输协议,阿里云IoT物联网平台 ...

  8. 基于TCP协议的GPS定位器设备迁移到阿里云IoT物联网平台实践——实践类

    背景 GPS定位器是内置了GPS模块和移动通信模块的终端,用来将GPS模块获得的定位数据通过移动通信模块传至Internet上的一台服务器上,从而可以实现在电脑或手机上查询终端位置. GPS定位器可用 ...

  9. 阿里云IoT物联网平台

    IoT物联网平台 一.工作原理 1.MQTT(Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,专门设计用于物联网(IoT)应用中的通信.它是一种发 ...

最新文章

  1. ZOJ1002 Fire Net(非递归版)
  2. Zookeeper概念学习系列之分布式事务
  3. ladp3 获取属性_Ldap获取ad属性的方法.
  4. Python 统计列表中元素出现的次数
  5. UVALive - 7511 Multiplication Table(暴力+模拟)
  6. vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性
  7. php访问数据库例子,PHP访问MSSQL数据库(实例代码)
  8. Qt总结:QMessageBox(原生态弹出框及究极超nice封装自定义弹出框)
  9. 关于公司RIA的选型问题
  10. 深度学习|三维重建:R-MVSNet
  11. tomcat实现多端口、多域名访问(只针对一个tomcat)
  12. 【Chia开发文档】Offer 类的属性、使用方法、作用及返回值
  13. jmeter请求grpc接口
  14. NSAT-1000 智能天线S参数自动化测试系统
  15. kali系统添加开机启动项
  16. 记录某次利用word邮件功能 由excel数据中批量生成奖状 遇到的问题及解决措施
  17. 2011年11月-2012年10月份 历时一年的 博客回顾
  18. DeepMind AI 科学家:2020年NLP和ML领域十大研究进展
  19. [题集]Lecture 4. Leftist Heaps and Skew Heaps
  20. oracle缺少有右括号,oracle ORA-00907错误:缺少右括号

热门文章

  1. 【黎乙丙】平面设计软件学习之ps入门篇
  2. mikumikudance 撤销 重做 快捷键
  3. 请发挥你的思维,只移动一根火柴将以下算式(1-701=2)摆成等式!
  4. 博智林产品经理二面面试
  5. 千兆网测试:通过ping命令实现
  6. 生物医学SCI期刊推荐
  7. Linux系统之部署Gitblit服务器
  8. 通过云库存管理遏制随需应变的自助服务风险
  9. 程序员转行产品经理可行吗,前景如何?
  10. Flutter学习笔记-使用decoration对Container装饰边框(圆角边框)