微信小程序使用MQTT.js连接腾讯云物联网开发平台

总体步骤和连接阿里云物联网平台差不多
步骤如下

  1. 去Github下载MQTT.js 库;一开始没注意,搞了很久,还把项目下下来自己编译,各种报错,最终也编译出来了,可后来发现其实有现成的单文件可用的,https://unpkg.com/mqtt/dist/mqtt.min.js,点击打开链接然后右键另存为即可(当前版本:2.18.8),不要使用v4.2.0以上版本
  2. 下载微信开发者工具,并新建一个项目
  3. 拷贝刚刚下载的mqtt.min.js到utils目录中去
  4. 勾选微信开发工具—-【不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书】选项或者配置开发者后台socket 合法域名
  5. 安装crypto-js库
    5.1 切换到标签【终端】,新建终端
    5.2 执行npm init,一路回车即可(如果已经是npm模式开发,可直接跳过)
    5.3 执行 npm install crypto-js@3.3.0 安装crypto-js的3.3.0版本
    5.4 点击开发工具-菜单栏-工具-构建npm,看到目录多出了miniprogram_npm文件夹且文件夹内有crypto-js文件夹及文件即可

编写代码,修改index.js文件成如下(基本来自官方文档):

// index.js
// 获取应用实例
const app = getApp()
var mqtt = require('../../utils/mqtt.min.js') //根据自己存放的路径修改
// 下面为node引入方式,浏览器的话,使用对应的方式引入crypto-js库
const crypto = require('crypto-js')
Page({
    data: {
        motto: 'Hello World',
        userInfo: {},
        hasUserInfo: false,
        canIUse: wx.canIUse('button.open-type.getUserInfo'),
        canIUseGetUserProfile: false,
        canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false
    },
    // 事件处理函数
    bindViewTap() {
        wx.navigateTo({
            url: '../logs/logs'
        })
    },
    onLoad() {
        if (wx.getUserProfile) {
            this.setData({
                canIUseGetUserProfile: true
            })
        }
        this.doConnect();
    },
    doConnect() {
        // 需要产品id,设备名和设备密钥,自己替换参数
        const productId = '***';
        const deviceName = '***';
        const devicePsk = '***';

        // 1. 生成 connid 为一个随机字符串,方便后台定位问题
        const connid = Math.random().toString(36).substr(2);
        // 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
        const expiry = Math.round(new Date().getTime() / 1000) + 3600 * 24;
        // 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
        const clientId = productId + deviceName;
        // 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
        const userName = `${clientId};12010126;${connid};${expiry}`;
        //5.  对 username 进行签名,生成token、根据物联网通信平台规则生成 password 字段
        const rawKey = crypto.enc.Base64.parse(devicePsk);       // 对设备密钥进行base64解码
        const token = crypto.HmacSHA256(userName, rawKey);
        const password = token.toString(crypto.enc.Hex) + ";hmacsha256";

        console.log(password);
        const options = {
            keepalive: 60, //60s
            clean: true, //cleanSession不保持持久会话
            protocolVersion: 4,//MQTT v3.1.1
            clientId: Math.random().toString(36).substr(2),
            username: userName,
            password: password
        };
        console.log(options)
        let url = `wxs:${productId}.ap-guangzhou.iothub.tencentdevices.com`;
        console.log(url);
        const client = mqtt.connect(url, options)
        client.on('connect', function () {
            console.log('连接服务器成功')
        })
        //接收消息监听
        client.on('message', function (topic, message) {
            // message is Buffer
            let msg = message.toString();
            console.log('收到消息:' + msg);
            //关闭连接 client.end()
        })
    },
    getUserProfile(e) {
        // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
        wx.getUserProfile({
            desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
            success: (res) => {
                console.log(res)
                this.setData({
                    userInfo: res.userInfo,
                    hasUserInfo: true
                })
            }
        })
    },
    getUserInfo(e) {
        // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
        console.log(e)
        this.setData({
            userInfo: e.detail.userInfo,
            hasUserInfo: true
        })
    }
})

编译运行,看到如下结果代表成功
微信小程序使用MQTT.js连接腾讯云物联网开发平台
连接服务器工作至此已完成。

本文章来源于互联网,如有侵权,请联系删除!

相关推荐: 云腾五洲:物联网漫谈之MQTT协议

什么是MQTT协议? MQTT(Message Queue Telemetry Transmission Protocol)是IBM于1999年专门针对物联网等应用场景开发的轻量级双向消息传输协议。主要是解决物联网中使用的设备之间的通信问题,以及这些设备与后端…