总体步骤和连接阿里云物联网平台差不多
步骤如下:
- 去Github下载MQTT.js 库;一开始没注意,搞了很久,还把项目下下来自己编译,各种报错,最终也编译出来了,可后来发现其实有现成的单文件可用的,https://unpkg.com/mqtt/dist/mqtt.min.js,点击打开链接然后右键另存为即可(当前版本:2.18.8),不要使用v4.2.0以上版本
- 下载微信开发者工具,并新建一个项目
- 拷贝刚刚下载的mqtt.min.js到utils目录中去
- 勾选微信开发工具—-【不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书】选项或者配置开发者后台socket 合法域名
- 安装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协议? MQTT(Message Queue Telemetry Transmission Protocol)是IBM于1999年专门针对物联网等应用场景开发的轻量级双向消息传输协议。主要是解决物联网中使用的设备之间的通信问题,以及这些设备与后端…