自己写微信小程序MQTT模拟器

陈拓 2019.10.6/2019.10.11

1. MQTT模拟器体验

在自己写MQTT模拟器之前先从网上安装一个现成的体验一下,这可以先看看我之前写的文章《微信小程序MQTT模拟器阿里云物联网平台测试》,在下面的网址可以找到这篇文章:

CSDN

微信小程序MQTT模拟器阿里云物联网平台测试 - 知乎

下面我们自己写一个MQTT模拟器实现这些功能。

2. 创建新项目

2.1 打开微信开发者工具,新建项目

填写你的AppID,新建。

在默认情况下,项目路径为C:\Users\Administrator\WeChatProjects。

2.2 准备图片

放在pages下的images目录中。

2.3 改写系统生成的代码

2.3.1 改写app.json

{"pages": ["pages/index/index","pages/logs/logs"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "我的MQTT模拟器","navigationBarTextStyle": "black"},"sitemapLocation": "sitemap.json"
}

只改“我的MQTT模拟器”这里。

2.3.2 下载支持MQTT协议的js库和支持sha1加密的库

  • 下载mqtt.js

https://github.com/mqttjs/MQTT.js

或者下载mqtt.min.js

https://unpkg.com/mqtt@3.0.0/dist/mqtt.min.js

mqtt.min.js小一些。

  • 下载hex_hmac_sha1.js

https://github.com/xihu-fm/aliyun-iot-client-sdk/tree/master/lib

两个js文件都放在utils目录下:

2.3.3 改写index.wxml

<!--index.wxml-->
<view><view class="main-center"><image src="{{imageUrl}}" class="ledinfo-avatar"></image><view class="ledinfo-values"><text>湿度:</text><text>{{humidity}}</text><text>%</text><text>温度:</text><text>{{temperature}}</text><text>℃</text></view></view><text class='subheading'>设备身份三元组</text><view style='margin-top: 20rpx;'><view class='connect-info background-white'><text class='text'>productKey:</text> <input class='input' name='productKey' placeholder='替换'bindinput='productKeyInput'/></view><view class='connect-info background-white'><text class='text'>deviceName:</text> <input class='input' name='deviceName' placeholder='替换'bindinput='deviceNameInput'/></view><view class='connect-info background-white'><text class='text'>deviceSecret:</text> <input class='input' name='deviceSecret' placeholder='替换'bindinput='deviceSecretInput'/></view></view><view class="buttons"><view  class="button-container" bindtap='online'><text class="button">设备上线</text></view><view  class="button-container" bindtap='publish'><text class="button">上报数据</text></view><view  class="button-container" bindtap='event'><text class="button">告 警</text></view><view  class="button-container" bindtap='service'><text class="button">订阅主题</text></view><view  class="button-container" bindtap='offline'><text class="button">设备下线</text></view></view><text class='subheading'>设备日志</text><view style='margin-top: 20rpx;'><view class='deviceState background-white'><text class='text'>{{deviceState}}</text></view></view> <view class='devicelog'><text>{{deviceLog}}</text></view>
</view>

2.3.4 改写index.wxss

/**index.wxss**/
page {background-color: rgb(240, 240, 240);font-size: 26rpx;
}.main-center {display: flex;flex-direction: column;align-items: center;
}.connect-info {display: flex;flex-direction: row;margin-top: 1rpx;height: 60rpx;
}.background-white {background-color: #FFF;
}.buttons {display: flex;flex-direction: row;justify-content: space-between;align-items:center;margin-left: 10rpx;margin-right: 10rpx;margin-top: 30rpx;margin-bottom: 30rpx;
}.button {line-height: 60rpx;
}.button-container {margin-top: 0px;border: 1px solid #aaa;width: 140rpx;height: 60rpx;border-radius: 5px;text-align: center;
}.ledinfo-values {color: #92ADF0;margin: 20rpx;
}.ledinfo-avatar {width: 128rpx;height: 128rpx;margin: 20rpx;
}.subheading {color: rgb(128, 128, 128);margin: 20rpx;
}.text {width: 220rpx;height: 30rpx;margin-left: 20rpx;margin-top: 10rpx;
}.input {width: 100%;height: 30rpx;margin-left: 20rpx;margin-top: 10rpx;color: rgb(128, 128, 128);
}.deviceState {color: #1d953f;
}.devicelog {margin-top: 20rpx;word-break:break-all;color: #426ab3;
}

2.3.5 改写index.js

//index.js// 设备身份三元组+区域
const deviceConfig = {productKey: "替换",deviceName: "替换",deviceSecret: "替换",regionId: "cn-shanghai"
};function getPostData() {const payloadJson = {id: Date.now(),params: {temperature: Math.floor((Math.random() * 20) + 10),humidity: Math.floor((Math.random() * 20) + 60)},method: "thing.event.property.post"}return JSON.stringify(payloadJson);
}function getAlarmPostData() {const payloadJson = {id: Date.now(),params: {temperature: Math.floor((Math.random() * 20) + 10)},method: "thing.event.hotAlarm.post"}return JSON.stringify(payloadJson);
}const util = require('../../utils/util.js')
var mqtt = require('../../utils/mqtt.min.js')
const crypto = require('../../utils/hex_hmac_sha1.js')
var client
Page({data: {temperature: '0',humidity: '0',imageUrl: '../images/iLED1.png',deviceLog: '',deviceState: ''},// 设备身份三元组输入框事件处理函数productKeyInput: function (e) {deviceConfig.productKey = e.detail.value},deviceNameInput: function (e) {deviceConfig.deviceName = e.detail.value},deviceSecretInput: function (e) {deviceConfig.deviceSecret = e.detail.value},// 设备上线 按钮点击事件online: function (e) {this.doConnect()},doConnect() {var that = this;const options = this.initMqttOptions(deviceConfig);console.log(options)client = mqtt.connect('wxs://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com', options)client.on('connect', function () {console.log('连接服务器成功')let dateTime = util.formatTime(new Date());that.setData({deviceState: dateTime + ' Connect Success!'})})},//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);},// 上报数据 按钮点击事件publish: function (e) {var that = this;let topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post`;// 注意用`符号,不是' !!!!!let JSONdata = getPostData()console.log("===postData\n topic=" + topic)console.log("payload=" + JSONdata)client.publish(topic, JSONdata)that.setData({deviceLog: 'topic=' + topic + '\n' + 'payload=' + JSONdata})},// 告警 按钮点击事件event: function (e) {var that = this;let topic_alarm = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/hotAlarm/post`;let JSONdata = getAlarmPostData()console.log("===postData\n topic=" + topic_alarm)console.log("payload=" + JSONdata)client.publish(topic_alarm, JSONdata)that.setData({deviceLog: 'topic=' + topic_alarm + '\n' + 'payload=' + JSONdata})},// 订阅主题 按钮点击事件service: function (e) {var that = this;that.setData({deviceLog: '接收消息监听'})//接收消息监听let topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post`;client.on('message', function (topic, message) {// message is Bufferlet messageStr = message.toString()console.log('收到消息:' + messageStr)that.setData({deviceLog: '收到消息:\n' + messageStr})if (messageStr.indexOf('on') > 0) {that.setData({imageUrl: '../images/iLED2.png',})}if (messageStr.indexOf('off') > 0) {that.setData({imageUrl: '../images/iLED1.png',})}if (messageStr.indexOf('blue') > 0) {that.setData({imageUrl: '../images/iLED3.png',})}if (messageStr.indexOf('green') > 0) {that.setData({imageUrl: '../images/iLED4.png',})}})},// 设备下线 按钮点击事件offline: function () {var that = this;client.end()  // 关闭连接console.log('服务器连接断开')let dateTime = util.formatTime(new Date());that.setData({deviceState: dateTime + ' Disconnect!'})},onLoad: function () {var that = thissetInterval(function () {that.setData({temperature: Math.floor((Math.random() * 20) + 10),humidity: Math.floor((Math.random() * 20) + 60)})}, 3000)},
})

3. 注册阿里云账号

注册阿里云账号,获得三元组:PublicKey、DeviceName、DeviceSecret。

见《微信小程序MQTT模拟器阿里云物联网平台测试》一文。

CSDN

微信小程序MQTT模拟器阿里云物联网平台测试 - 知乎

4. 微信小程序测试

4.1 打开MQTT测试平台

  • 进入阿里云产品官网企业物联网平台_设备接入_设备管理_监控运维_数据分析-阿里云

  • 登录,点击“控制台”,选择物联网平台

4.2 用微信小程序模拟器测试

在微信开发者工具中打开模拟器。

4.2.1 设备上线

  • 输入设备身份三元组,点击“设备上线”

  • 回到物联网平台

点击F5刷新设备列表,可以看到设备状态已经是在线,查看小程序设备日志和设备列表页面中的最后上线时间,用模拟器测试慢一秒,用真机测试时间一致。

如果连接参数不正确,或遇到其他连接问题,可以在开发工具的Console中查看,例如productKey输入错误:

4.2.2 上报数据

  • 回到微信开发者开发工具

在设备上线时,点击“上报数据”,我们看到MQTT模拟器上报了当前湿度温度值。

上报的湿度73%,温度29℃。

  • 回到物联网平台,在设备详情的运行状态看设备上报的数据

和MQTT模拟器上报的数据一致。

4.2.3 告警

  • 在小程序界面

在设备上线时,点击“告警”,就会生成一条事件告警,并上报当前的温度。

  • 在物联网平台控制台“设备详情”-“事件管理”中查看

可以看到“温度过高报警”。

在实际情况下,报警温度的阈值在客户端设定,当温度超过阈值时发送报警,这里只是演示报警功能,不用在意温度值的大小。

4.2.4 订阅主题

  • 在小程序界面,在设备上线时,点击“订阅主题”:

等待接收消息。

  • 在物联网平台控制台“设备管理 > 设备详情”点击“在线调试”。

  • 转到“在线调试”页面

1) 选择设备

2) 选择“调试真实设备”选项卡

3) 选择“服务调用”

4) 选中功能“开灯(switch)”

5) 输入参数{"status":"on"}

6) 点击“发送指令”

查看实时日志:

  • 回到小程序界面

看,灯亮了!

还可以在物联网平台上:

1) 发送{"status":"off"},关灯

2) 发送{"status":"blue"},灯发蓝光

3) 发送{"status":" green"},灯发绿光

4.2.5 设备下线

  • 在小程序界面,点击“设备下线”

  • 在控制台“设备列表”中可以看到设备已经离线

4.3 用真机测试

见《微信小程序MQTT模拟器阿里云物联网平台测试》一文。

CSDN

微信小程序MQTT模拟器阿里云物联网平台测试 - 知乎

5. 源代码

https://github.com/chentuo2000/MyMQTTsimulator

参考资料

  1. 实例:使用MQTT进行交互
    实例:使用MQTT进行交互 - 简书
  2. 微信小程序布局display flex布局介绍微信小程序布局display flex布局介绍_大灰狼的小绵羊哥哥的博客-CSDN博客_小程序display:flex
  3. 微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!
    【微信小程序控制硬件⑧ 】微信小程序以 websocket 连接阿里云IOT物联网平台mqtt服务器,封装起来使用就是这么简单!(附带Demo)_徐宏的博客 | 修身齐家治国平天下-CSDN博客_微信小程序连接阿里云物联网平台
  4. 阿里云物联网平台数据格式
    数据格式 - 阿里云物联网平台 - 阿里云

自己写微信小程序MQTT模拟器相关推荐

  1. 微信小程序MQTT模拟器 阿里云物联网平台测试

    陈拓 chentuo@ms.xab.ac.cn 2019.09.27/2020.01.20 原文参考:微信小程序-MQTT模拟器 https://www.yuque.com/cloud-dev/iot ...

  2. 【微信小程序控制硬件⑦ 进阶篇】动起来做一个微信小程序Mqtt协议控制智能硬件的框架,为心里全栈工程师梦想浇水。

    文章目录 一.前言: 二.涉及的技术点: 三.框架的运行原理: 四.框架代码流程: 4.1 主线程: 4.2 获取设备列表显示设备,以及订阅在线的设备: 4.3 点击某设备如何实现携带此设备信息到控制 ...

  3. 【微信小程序控制硬件 第13篇】安信可B站直播学习总结,微信小程序MQTT远程控制ESP8266 NodeMCU,谈谈微信生态那些事;

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

  4. python微信小程序实例_python+Mysql写微信小程序后台

    python比较简单,学了用处比较多,所以推荐写微信小程序的后台. (php.java等做后台太复杂了,学起来费劲) [0--假设] 1.Python开发环境已经搭好了,我这边喜欢用VScode. 2 ...

  5. 微信小程序编辑器 模拟器独立窗口 要怎么还原

    微信小程序编辑器 模拟器独立窗口 要怎么还原 还原

  6. (开源)微信小程序+mqtt,esp8266温湿度读取

    第一.原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息. 个人可免费注册五个微信小程序账号,在微信小程序官网注 ...

  7. 解决微信小程序MQTT通讯真机调试失败的问题附加可用代码

    原因:模拟器上测试可以,选中了不校验合法域名,真机调试没能连接服务器,解决思路换了个mqtt.js 可参考 https://unpkg.com/mqtt@2.18.8/dist/mqtt.min.js ...

  8. java写微信小程序答辩问题_微信小程序毕业设计选题和毕业论文怎么写,答辩流程是怎样的?...

    1. 开始准备选题 大四上学期开学时开始准备论文的,首先是确定论文主题,看自己想做什么毕业设计,可以选取之前接触过的,做过的东西,这样快一些,如果选的是没接触过的方向,一定要早点开始.打算做一个小程序 ...

  9. uniapp手写_【转】uni-app框架纯手写微信小程序开发左侧滑动菜单

    本帖最后由 fengrui99 于 2020-7-22 14:38 编辑 原文来自:在学习的uni-app的微信小程序开发路上慢慢开始不一直依赖插件(但是使用插件是真的香,一直用一直香) 在大佬的指引 ...

  10. uniapp写微信小程序怎么运行到微信开发工具上

    1.选择运行>运行到小程序模拟器>运行到微信开发者工具 2.这样unpackage中就多一个文件mp-weixin 3.把这个文件导入到微信小程序中就行啦

最新文章

  1. java如何对图片去除图片的白色的背景
  2. html,h4,h5的区别,(转)H5和H4的对比听感
  3. 百度2016笔试题第一题:页面请求失败值
  4. 1.19 实例:Java求数组元素的最大和最小值
  5. 台湾大学林轩田机器学习基石课程学习笔记12 -- Nonlinear Transformation
  6. 贝叶斯定理、显著性检验、p值关系、分类
  7. CSS清除默认样式,面试篇
  8. SQL varchar数据类型深入探讨
  9. 矩池云安装利用pip、apt、conda安装需要的包
  10. matlab imresize
  11. unity 草 可以一棵棵种吗?_5种多肉叶插成活率超高,养一棵成活一大片,种都没地方种...
  12. tomcat Note: further occurrences of HTTP header parsing errors will be logged at DEBUG
  13. win10文件夹当作服务器,win10文件夹加密不了怎么办_网站服务器运行维护,win10
  14. OC中类别(Catagory)基本使用
  15. 互联网专业委员会 (Internet 缩写 CCF TCI)
  16. python字母对应序号_python获取字母在字母表对应位置的几种方法及性能对比较
  17. 酷盟集团旗下酷客SCRM亮相2020 CBME孕婴童展
  18. 在线执行代码,线上代码执行,支持 php go woo lua luajit python perl ruby
  19. win10商店打不开_win10应用商店闪退是咋回事呢
  20. opencv学习笔记(三)—— 利用图像金字塔进行图像无缝拼接,cv2.pyrDown() ,cv2.pyrUp()

热门文章

  1. java验证码kaptcha_spring整合kaptcha验证码的实现
  2. python timepicker_Android DatePicker和TimePicker:时间日期选择器
  3. cmd的常用命令分类详解
  4. MATLAB 读取图片像素处理
  5. MySQL的两种登录方式
  6. 为报复老东家,程序员编码给自己转账553笔,金额超21万元
  7. 配置嵌入式Servlet容器
  8. 通俗理解动态库与静态库区别
  9. python怎么下载安装教程_python怎么下载?《python软件下载安装教程》
  10. PCB走线电感、导线电感、过孔电感 计算公式