索引

这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及。

微信小程序连接物联网(一):初始化ESP8266 NodeMCU
微信小程序连接物联网(二):NodeMCU Lua学习笔记
微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台

微信小程序远程遥控宿舍开门

  • 索引
  • 前言
    • 整个制作的耗材成本
    • 源码下载地址
    • 思路
  • 1. 使用MQTT.fx客户端工具测试
  • 2. Nodemcu连接阿里云物联网
  • 3. 微信小程序连接物联网
  • 4. 阿里云物联网M2M规则转发
  • 完成的样子

前言

折腾宿舍远程开门的这两周里碰壁不少,还好功能实现了。我想还有很多和我有同一想法的人。所以记录过程下来供参考少走弯路吧。我不是电子专业的学生,且这个Nodemcu也没涉及到底层知识,文中有错误的地方欢迎指正。

整个制作的耗材成本

  1. Esp8266 NodeMCU Lua芯片(30元)
  2. MG90S舵机(12元)
  3. 迷你充电宝(6元)
  4. 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

主要流程:

  1. 新建一个小程序项目。复制mqtt.min.js和hex_hmac_sha1.js放到小程序项目的utils目录中,目录结构如下:
  2. 配置开发者后台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协议连接阿里云物联网平台相关推荐

  1. java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

    阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅? 阿里云没有提供 PHP ...

  2. 树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制

    树莓派mqtt协议连接阿里云物联网平台(三) 前面树莓派的数据已经上传到云端,可是我的android手机该如何获取树莓派上传的这些数据呢,,困惑了我好几天的疑问,解开的那一刻,真的时拨开云雾见青天啊. ...

  3. 中移M5311模块MQTT协议连接阿里云物联网平台(干货)

    一.准备三元组 在阿里云物联网平台新建产品和设备后,平台给每一个设备自动赋予三元组. 二.准备MQTT协议参数 新建产品时,阿里云物联网平台会分配一个含productkey的子域名,端口号固定是188 ...

  4. STM32+ESP8266+MQTT协议连接阿里云物联网平台

    一.环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可.比如:GSM模块.有线网卡等. 开发软件:keil5 硬件连接功能: ...

  5. Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  6. STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云

    STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云 目录 STM32+ESP8266(ESP-12F)物联网温度计-移植paho MQTT协议连接阿里云 一 ...

  7. 【物联网云端对接-2】通过MQTT协议与阿里云物联网套件进行云端通信

     在<程序员>杂志2017.4刊上,曾写过一篇<微软百度阿里三大物联网平台探析>,上面曾介绍了阿里云物联网套件的一些内容,在写该篇文章的时候,凌霄物联网网关还无法对接到此平台( ...

  8. MQTT.fx连接阿里云物联网平台

    新手入门级别主要阐述大致流程和自己学习的理解 超前思想:老工程师:代码不是最难的,方案才是最难的.方案搞清楚.代码只要学它就会,早晚都要会的对不对; MQTT.fx作用是用来调试阿里云,只要用这个配置 ...

  9. 物联网阿里云——Android Mqtt协议连接阿里云

    实现步骤: 一.云平台端 1.首先在阿里云物联网平台创建产品和设备,获取设备三元组 {       "ProductKey": "a1QRE182gGH",   ...

最新文章

  1. nginx 子请求接收响应_Nginx详解其原理
  2. SD-WAN将成为物联网部署中的骨干网—Vecloud
  3. hibernate persist不能插入到表中
  4. 进入全真互联网——音视频通信的技术变革
  5. Datawhale MySQL 训练营 Task2 查询语句
  6. 未来教育计算机二级第一套ppt解析,计算机二级未来教育PPT部分答案
  7. Docker应用容器引擎_简介---Docker工作笔记003
  8. mui ajax的值php怎样获取,MUI.ajax是怎么获取数据的
  9. xmarks恢复使用
  10. 【游戏安利】 益智休闲类游戏安利
  11. 图的表示(无权图和有权图)
  12. rabbitmq 从channal获得socket
  13. python List中删除特定元素
  14. 主流自媒体推广平台有哪些 如何用自媒体引流
  15. 使用python下载网站视频资源
  16. ParaView-1
  17. 七上八下猜数字_车上互动游戏
  18. Java synchronized偏向锁、轻量级锁、重量级锁
  19. 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办
  20. 基于图像的人数统计方法

热门文章

  1. JSON格式1----冯威视频笔记
  2. 如何下载矢量建筑楼块轮廓为CAD文件
  3. [韩国][喜剧][请别非礼我][RMVB/384M][中字][经典爆笑性喜剧]
  4. java常用英语单词列表
  5. Hadoop 2.8.5 完全分布式HA高可用安装(二)--环境搭建
  6. Win10《芒果TV》商店版2016-2017春节大礼,每日前100名用户免费领取7天VIP
  7. android应用阻止手机休眠方法
  8. 四、全国计算机二级Python考试——基本操作题(三)
  9. 用手机远程控制手机,用电脑控制iPhone,分别应该下载什么APP?
  10. iOS上架流程详细版本