微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台
索引
这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及。
微信小程序连接物联网(一):初始化ESP8266 NodeMCU
微信小程序连接物联网(二):NodeMCU Lua学习笔记
微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台
微信小程序远程遥控宿舍开门
- 索引
- 前言
- 整个制作的耗材成本
- 源码下载地址
- 思路
- 1. 使用MQTT.fx客户端工具测试
- 2. Nodemcu连接阿里云物联网
- 3. 微信小程序连接物联网
- 4. 阿里云物联网M2M规则转发
- 完成的样子
前言
折腾宿舍远程开门的这两周里碰壁不少,还好功能实现了。我想还有很多和我有同一想法的人。所以记录过程下来供参考少走弯路吧。我不是电子专业的学生,且这个Nodemcu也没涉及到底层知识,文中有错误的地方欢迎指正。
整个制作的耗材成本
- Esp8266 NodeMCU Lua芯片(30元)
- MG90S舵机(12元)
- 迷你充电宝(6元)
- USB数据线
源码下载地址
收到很多做毕设的小伙伴私信,这里补上完整的项目源码:
https://gitee.com/koevas/IOT-wechat
思路
1. 使用MQTT.fx客户端工具测试
官网:MQTT.fx
阿里云文档(使用MQTT.fx接入物联网平台):
https://help.aliyun.com/document_detail/140507.html
先在阿里云物联网平台创建一个产品,ProductKey为产品密钥
再创建两个设备
一个是宿舍门的被控端,用在nodemcu连接
一个是宿舍门的控制端,用在微信小程序连接
创建完设备获取到三元组,记录下来
在MQTT.fx上填写连接信息,用{}的变量请换成自己的三元组。
产品密钥:{ProductKey}
设备名字:{DeviceName}
设备密钥:{DeviceSecret}
Profile Name: Class_Door # 在MQTT.fx里的名字,随便写
Profile Type: MQTT Broker # 类型为MQTT代理
Broker Address: {ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com # 设备名 + 域名后缀
Broker Port: 1883 # MQTT协议的连接端口,默认为1883
Client ID: {DeviceName}|securemode=3,signmethod=hmacsha1|
用户名:
User Name: {DeviceName}&{ProductKey}
密码:
密码需经过HmacSHA1算法加密生成,可以用 在线加密解密工具 生成
加密所需的明文为:
clientId{DeviceName}deviceName{DeviceName}productKey{ProductKey}
加密所需的密钥为:
{DeviceSecret}
连接成功后订阅消息,然后在阿里云物联网在线调试上发送一条数据,测试有没有收到。
2. Nodemcu连接阿里云物联网
使用MG90S舵机,可以旋转角度为0-180°,产生的扭矩足够打开宿舍的门锁,电源接到esp8266的Vin、GND口。PWM信号线接到esp8266的D3口。
打开esplorer编写init.lua烧录进esp8266里
连接wifi代码
-- wifi config
station_cfg = {}
station_cfg.ssid = "gzta"
station_cfg.pwd = "12345678"-- wifi connect
print('Setting up WIFI...')
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)-- wifi eventmon
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)print("wifi connecting...")
end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)print("wifi connect:" .. wifi.sta.getip())
end)wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)print("wifi disconnect...")
end)
控制舵机旋转角度的代码,用于打开门锁,旋转3秒后恢复到原来的位置。
-- Open the door for 3 seconds
function DoorOpen()pin = 3-- 20 - 130pwm.setup(pin, 50, 40)pwm.start(pin)print("start move position")tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()print("recover position")pwm.setduty(pin, 120)pwm.stop(pin)end)
end
完整代码如下:
更改自己的wifi配置、topic、物联网三元组即可
-- wifi config
station_cfg = {}
station_cfg.ssid = "gzta"
station_cfg.pwd = "12345678"-- topic
topic0 = "/a1UlGaNjWAO/Class_Door/user/message"-- aliyun IOT config
ProductKey = "换成自己的"
DeviceName = "换成自己的"
DeviceSecret = "换成自己的"mqttAddress = ProductKey .. ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
mqttPort = 1883
ClientID = DeviceName .. "|securemode=3,signmethod=hmacsha1|"
UserName = DeviceName .. "&" .. ProductKey
hmac_data = "clientId" .. DeviceName .. "deviceName" .. DeviceName .. "productKey" .. ProductKey
Password = crypto.toHex(crypto.hmac("sha1", hmac_data, DeviceSecret))-- wifi connect
print('Setting up WIFI...')
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)-- wifi eventmon
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)print("wifi connecting...")
end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)print("wifi connect:" .. wifi.sta.getip())
end)wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)print("wifi disconnect...")
end)-- aliyun iot connect
MQTT_connect_Flag = 0
myMQTT = mqtt.Client(ClientID, 120, UserName, Password)Connect_timer = tmr.create()
Connect_timer:alarm(1000, tmr.ALARM_SEMI, function()if myMQTT ~= nil thenprint("MQTT client connect...")myMQTT:connect(mqttAddress, mqttPort, 0, mqtt_connect, mqtt_disconnect)end
end)function mqtt_connect(client)print("mqtt connect success")myMQTT = clientMQTT_connect_Flag = 1client:subscribe(topic0, 0, function(client)print("subscribe success")end)Connect_timer:stop()
endfunction mqtt_disconnect(client, reason)print("mqtt connect Fail:" .. reason)MQTT_connect_Flag = 0Connect_timer:start()
end-- mqtt client offline event
myMQTT:on("offline", function(client)print("mqtt client offline event")Connect_timer:start()
end)-- mqtt client message event
myMQTT:on("message", function(client, topic, data)print(topic .. ":" .. data)t = sjson.decode(data)if t["method"] == "thing.service.DoorOpen" thenDoorOpen()end
end)-- Open the door for 3 seconds
function DoorOpen()pin = 3-- 20 - 130pwm.setup(pin, 50, 40)pwm.start(pin)print("start move position")tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()print("recover position")pwm.setduty(pin, 120)pwm.stop(pin)end)
end
3. 微信小程序连接物联网
需要用到两个js库,分别是
- MQTT的js库:
https://unpkg.com/mqtt/dist/mqtt.min.js - 官方库aliyun-iot-client-sdk的hmac-sha1算法库:
https://raw.githubusercontent.com/xihu-fm/aliyun-iot-client-sdk/master/lib/hex_hmac_sha1.js
主要流程:
- 新建一个小程序项目。复制mqtt.min.js和hex_hmac_sha1.js放到小程序项目的utils目录中,目录结构如下:
- 配置开发者后台socket 合法域名 为:wss://productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com(替换productKey为自己的产品key)
核心的js代码参考了这篇博客,因为自己的宿舍小程序还有一些登录验证的代码,所以就不放出自己小程序完整的js代码了
var mqtt = require('../../utils/mqtt.min.js')
const crypto = require('../../utils/hex_hmac_sha1.js');
Page({data: {},// 发送开门指令,仅供参考,使用时请修改自己的topiccommand_opendoor(){var connectText = '{ "method": "thing.service.DoorOpen"}'client.publish('/a1UlGaNaaa/Door_Console/user/message', connectText, function (err){if (!err) {console.log('开门指令发送成功!');}})},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 Bufferconsole.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, //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);}
})
前端界面(有点丑Emmm):
4. 阿里云物联网M2M规则转发
由于MQTT协议里同一ClientID只能有一个连接,如果是用同一个ClientID 在不同地方登录,会先把最先登录的ClientID踢下线。所以微信小程序和NodeMCU不能共用一个设备。 既然如此,就将微信小程序和NodeMCU划分为两个不同设备。使用规则转发的方式通信。当微信小程序设备端发布消息时,NodeMCU端也同样能收到消息。
阿里云物联网平台官方文档:
基于规则引擎的M2M设备间通信
云产品流转概述
新建规则查询语句:
将微信小程序端收到的数据同时完整地转发给Nodemcu端
SELECT * FROM "/a1UlGaNaaa/Door_Console/user/message"
完成的样子
远程宿舍开门的功能需求简单,又无其他业务需求,就不需要利用到个人服务器保存什么数据了。所有操作只与阿里云的物联网平台交互
微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台相关推荐
- java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...
- 树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制
树莓派mqtt协议连接阿里云物联网平台(三) 前面树莓派的数据已经上传到云端,可是我的android手机该如何获取树莓派上传的这些数据呢,,困惑了我好几天的疑问,解开的那一刻,真的时拨开云雾见青天啊. ...
- 中移M5311模块MQTT协议连接阿里云物联网平台(干货)
一.准备三元组 在阿里云物联网平台新建产品和设备后,平台给每一个设备自动赋予三元组. 二.准备MQTT协议参数 新建产品时,阿里云物联网平台会分配一个含productkey的子域名,端口号固定是188 ...
- STM32+ESP8266+MQTT协议连接阿里云物联网平台
一.环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可.比如:GSM模块.有线网卡等. 开发软件:keil5 硬件连接功能: ...
- Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云
STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云 目录 STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云 一 ...
- 【物联网云端对接-2】通过MQTT协议与阿里云物联网套件进行云端通信
在<程序员>杂志2017.4刊上,曾写过一篇<微软百度阿里三大物联网平台探析>,上面曾介绍了阿里云物联网套件的一些内容,在写该篇文章的时候,凌霄物联网网关还无法对接到此平台( ...
- MQTT.fx连接阿里云物联网平台
新手入门级别主要阐述大致流程和自己学习的理解 超前思想:老工程师:代码不是最难的,方案才是最难的.方案搞清楚.代码只要学它就会,早晚都要会的对不对; MQTT.fx作用是用来调试阿里云,只要用这个配置 ...
- 物联网阿里云——Android Mqtt协议连接阿里云
实现步骤: 一.云平台端 1.首先在阿里云物联网平台创建产品和设备,获取设备三元组 { "ProductKey": "a1QRE182gGH", ...
最新文章
- nginx 子请求接收响应_Nginx详解其原理
- SD-WAN将成为物联网部署中的骨干网—Vecloud
- hibernate persist不能插入到表中
- 进入全真互联网——音视频通信的技术变革
- Datawhale MySQL 训练营 Task2 查询语句
- 未来教育计算机二级第一套ppt解析,计算机二级未来教育PPT部分答案
- Docker应用容器引擎_简介---Docker工作笔记003
- mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的
- xmarks恢复使用
- 【游戏安利】 益智休闲类游戏安利
- 图的表示(无权图和有权图)
- rabbitmq 从channal获得socket
- python List中删除特定元素
- 主流自媒体推广平台有哪些 如何用自媒体引流
- 使用python下载网站视频资源
- ParaView-1
- 七上八下猜数字_车上互动游戏
- Java synchronized偏向锁、轻量级锁、重量级锁
- 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办
- 基于图像的人数统计方法
热门文章
- JSON格式1----冯威视频笔记
- 如何下载矢量建筑楼块轮廓为CAD文件
- [韩国][喜剧][请别非礼我][RMVB/384M][中字][经典爆笑性喜剧]
- java常用英语单词列表
- Hadoop 2.8.5 完全分布式HA高可用安装(二)--环境搭建
- Win10《芒果TV》商店版2016-2017春节大礼,每日前100名用户免费领取7天VIP
- android应用阻止手机休眠方法
- 四、全国计算机二级Python考试——基本操作题(三)
- 用手机远程控制手机,用电脑控制iPhone,分别应该下载什么APP?
- iOS上架流程详细版本