NodeMCU 通过MQTT 连接阿里云物联网

前言:

  这是第一个帖子,希望以后所有的东西都能记录在CSDN吧!自己在调试过程中也借鉴了很多人的帖子,这里总结出来,方便以后查阅,也方便他人!

1.NodeMCU固件的选择及生产Bin文件

首先在下列网址选择自己需要的固件,并且生成bin文件,烧录到ESP8266里面。

固件生成网址 https://nodemcu-build.com/index.php

- 在Select branch里面选择master版本。(稳定版)
- 在modules里面选择勾选下列:crypto----加密模块(hamc加密)sntp--获取时间戳模块file,gpio,net,node,timer,uart,wifi,mqtt为默认模块
最后输入你的邮箱,就会把编译好的bin文件发送到你的邮箱,会提供2个版
本(整形,浮点型)根据实际需求选择

2.刷入新的固件

刷固件的软件这里取: https://github.com/nodemcu/nodemcu-flasher

    打开软件,选择刚才生产的bin文件,选好对应的COM口,直接点击start就可以了(其他配置默认)

3.创建阿里云IOT设备

这里借鉴的(https://blog.csdn.net/yannanxiu/article/details/81334230)

3.1 开通平台

首先,需要进入[阿里云](https://l.gushuji.site/aliyun)IoT hub控制台进行操作,如果没有开通直接开通即可,免费。

控制台链接:https://www.aliyun.com/product/iot

3.2 创建产品

开通后我们首先需要创建产品,产品名称随便输入即可,其他默认。

3.3 创建设备

    然后是创建设备,随便输入一个DeviceName即可。

3.4 创建一个新的Topic

    在产品管理栏里面,他已经帮我们定义了自动3个topic,其中发送权限是:设备上传数据到broken。订阅权限是:设备接收从broken发来的数据。这里我们定义一个具有发送和订阅权限的topic:DATA.

3.5:获取认证三元组

最后就得到了设备认证三元组:ProductKey、DeviceName和DeviceSecret。并且定义了一个新的tpoic:DATA.
其中mqtt的Connect报文参数:mqttClientId:clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"mqttUsername: deviceName+"&"+productKeymqttPassword: sign_hmac(deviceSecret,content)具体替代如下:clientid 一般使用MAC地址,也可以自定义。timestamp的值可以是最新的internet时间戳,也可以随便定义。deviceName 使用 我们在3.3中创建的device的名字替代:ESP01.productkey 使用产品的ProductKey替代mqttPassword,需要使用hmacsha1加密: 秘钥deviceSecret: 使用自己的DeviceSecret。 content格式如下示例:如果clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,则 content =clientId12345deviceNamedeviceproductKeypktimestamp789

具体可以参考阿里的help文档https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11186623.6.638.56bb5f6cWj1v13

4.Lua脚本的编写

编译环境下载:https://esp8266.ru/esplorer/

wifi的配置

cfg={}
cfg.ssid="leon"
cfg.pwd="123456"
----[wifi connect]---------------
wifi.setmode(wifi.STATION)  --设置为STA模式
wifi.sta.config(cfg)        --配置
wifi.sta.connect()          --连接wifi
-----[注册wifi事件]----
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)print("Connected, IP is "..wifi.sta.getip())
end)wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)print("wifi disconnect")
end)

MQTT设备的配置

[Aili MQTT 配置]

----[阿里3元认证组]------
ProductKey ="a19bI5MaWV6"   --换成自己的
DeviceName ="ESP01"  -- 换成自己的
DeviceSecret="yourselfDeviceSecret"   --换成自己的设备秘钥RegionId="cn-shanghai"     --华东2,regionid根据你的服务器选择
topic0="/a19bI5MaWV6/ESP01/DATA"   --这就是我们之前定义的一个topic
myMQTTport=1883    --port
myMQTT=nil        --client
myMQTTtimes='6666'     --随便定义即可

[转换成MQTT的host,clientid,username,password]

myMQTThost=ProductKey..".iot-as-mqtt."..RegionId..".aliyuncs.com"   --host
myMQTTClientId=ClientId.."|securemode=3,signmethod=hmacsha1,timestamp="..myMQTTtimes.."|" --设备ID
myMQTTusername=DeviceName.."&"..ProductKey          --username

[hmacsha1 加密得到password]

hmacdata="clientId"..ClientId.."deviceName"..DeviceName.."productKey"..ProductKey.."timestamp"..myMQTTtimes  --hmac 校验的数据
myMQTTpassword=crypto.toHex(crypto.hmac("sha1",hmacdata,DeviceSecret))    --hmacdata加上设备的秘钥 ,使用hmacsha1 加密得到password

[创建MQTT客户端]

myMQTT=mqtt.Client(myMQTTClientId, 120,myMQTTusername,myMQTTpassword)

[MQTT客户端发起连接请求]

MQTTconnectFlag=0
tmr.alarm(0,1000,1,function()if myMQTT~=nil thenprint("Attempting client connect...")myMQTT:connect(myMQTThost, myMQTTport,0,MQTTSuccess,MQTTFailed)end
end)

[连接成功,连接失败事件]

function MQTTSuccess(client)print("MQTT connected")client:subscribe(topic0,0, function(conn)     --注册topic0print("subscribe success") end) myMQTT=clientMQTTconnectFlag=1tmr.stop(0)        --关闭定时连接
end---[连接失败]---
function MQTTFailed(client,reson)print("Fail reson:"..reson)MQTTconnectFlag=0tmr.start(0)     --重新启动连接
end

–[设备发送和接收数据及下线事件]-----

--[注册 设备接收到订阅的topic 事件]-----
myMQTT:on("message", function(client, topic, data) print(topic ..":") if data ~= nil thenprint(data)end
end)--[topic 定时上传数据]
tmr.alarm(1, 5000, 1, function()    --等待连接上if MQTTconnectFlag==1 and myMQTT~=nil then   myMQTT:publish(topic0,"this is data upload",0,0,function(client)print("send ok" ) end)end
end)
--[设备offline 事件]-----
myMQTT:on("offline", function(client) print ("offline") tmr.start(0)
end)

5.调试结果

  烧录好代码之后运行,控制台会显示device在线,并且由于device订阅了Data topic,并且每隔5S发布向改topic上传数据。设备会接收到自己的数据并且打印出来。

6.全部代码参考如下,三元组换成自己的就好。

-----[wifi config]-------------
---------------------------
cfg={}
cfg.ssid="leon"
cfg.pwd="hyl123456"-----[Aili MQTT 配置]---------
----------------------------
ProductKey ="a19bI5MaWV6"   --换成自己的
ClientId =wifi.sta.getmac()  -- 自定义clientId,这里使用mac地址
DeviceName ="ESP01"  -- 换成自己的
DeviceSecret="a1wLtTqCn6EzZ"
RegionId="cn-shanghai"     --华东2myMQTTport=1883    --port
myMQTT=nil        --clientmyMQTThost=ProductKey..".iot-as-mqtt."..RegionId..".aliyuncs.com"   --host
myMQTTusername=DeviceName.."&"..ProductKey          --usernametopic0="/a19bI5MaWV6/ESP01/DATA"   --device 的topic----[wifi connect]---------------
wifi.setmode(wifi.STATION)  --设置为STA模式
wifi.sta.config(cfg)        --配置
wifi.sta.connect()          --连接wifi-----[注册wifi事件]----
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)print("Connected, IP is "..wifi.sta.getip())
end)wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)print("wifi disconnect")
end)--------[获取时间戳]--------------------
function GetNetTime()sntp.sync({"0.nodemcu.pool.ntp.org","1.nodemcu.pool.ntp.org","2.nodemcu.pool.ntp.org","3.nodemcu.pool.ntp.org","www.beijing-time.org"},function(sec, usec, server, info)print('sync', sec, usec, server)       end,function()print("get time error")end)  return 0
end--------MQTT------------------
myMQTTtimes='6666'
hmacdata="clientId"..ClientId.."deviceName"..DeviceName.."productKey"..ProductKey.."timestamp"..myMQTTtimes  --hmac 校验的数据
myMQTTpassword=crypto.toHex(crypto.hmac("sha1",hmacdata,DeviceSecret))    --hmacdata加上设备的秘钥 ,使用hmacsha1 加密得到password
myMQTTClientId=ClientId.."|securemode=3,signmethod=hmacsha1,timestamp="..myMQTTtimes.."|"   --设备ID
----[创建MQTT客户端]
myMQTT=mqtt.Client(myMQTTClientId, 120,myMQTTusername,myMQTTpassword) ----[启动定时连接]
MQTTconnectFlag=0
tmr.alarm(0,1000,1,function()if myMQTT~=nil thenprint("Attempting client connect...")myMQTT:connect(myMQTThost, myMQTTport,0,MQTTSuccess,MQTTFailed)end
end)---[连接成功]---
function MQTTSuccess(client)print("MQTT connected")client:subscribe(topic0,0, function(conn)     --注册topic0print("subscribe success") end) myMQTT=clientMQTTconnectFlag=1tmr.stop(0)        --关闭定时连接
end---[连接失败]---
function MQTTFailed(client,reson)print("Fail reson:"..reson)MQTTconnectFlag=0tmr.start(0)     --重新启动连接
end--[设备offline 事件]-----
myMQTT:on("offline", function(client) print ("offline") tmr.start(0)
end)--[注册 设备接收到订阅的topic 事件]-----
myMQTT:on("message", function(client, topic, data) print(topic ..":") if data ~= nil thenprint(data)end
end)--[topic 定时上传数据]
tmr.alarm(1, 5000, 1, function()    --等待连接上if MQTTconnectFlag==1 and myMQTT~=nil then   myMQTT:publish(topic0,"this is data upload",0,0,function(client)print("send ok" ) end)end
end)

NodeMCU 通过MQTT 连接阿里云物联网相关推荐

  1. Esp8266 nodemcu 使用PubSubClient连接阿里云物联网平台

    之前写了一篇微信小程序使用MQTT.js连接阿里云IoT物联网平台,然后很多人问问题的时候顺带会问些硬件的问题,但是自己不会,没法回答.最近有些空闲的时间,自己也挺感兴趣,于是花了一个星期左右的时间看 ...

  2. MQTT连接阿里云物联网平台步骤

    1.注册阿里云设备信息 1)在阿里云中选择物联网平台 添加一个话题,用来发布和订阅主题 2.需要的文档在这里:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 3.以下这三个ESP8266需要 ...

  3. 中移M5310-A通过AT指令MQTT连接阿里云物联网平台并进行数据互传

    一.平台端操作 1.设备创建 进入阿里云物联网平台,选择物联网平台.然后开通公共实例,成功后依次创建产品.创建设备.设备创建成功后点击最右侧的查看->MQTT连接参数可以看到该设备接入该产品所需 ...

  4. MQTT系列笔记—SIM7600X 通过MQTT连接阿里云物联网平台

    序言: MQTT是基于二进制消息的发布/订阅编程模式的消息协议:由于规范很简单,非常适合需要低功耗和网络带宽有限的IoT场景,比如:智能家居.智慧城市和医疗医护:深受广大童鞋的青睐和喜爱.下面我们以S ...

  5. MQTT 连接 阿里云物联网十六进制数据分析笔记

    相关数据 {"ProductKey": "a1L1qdcqmnB","DeviceName": "test2",&quo ...

  6. Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt

    概要 Python 使用 paho.mqtt 库,利用阿里云物联网平台的设备证书:productKey.deviceName.deviceSecret,自动合成 userName.passWord.以 ...

  7. 微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  8. M6315模块连接阿里云物联网MQTT通讯

    B站链接https://www.bilibili.com/read/cv5477377 M6315这个模块比较坑,而且资料少(都是很久以前的了),建议大家不要用了,虽然比较便宜,但是启动需要2A电流这 ...

  9. 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(五)---MQTT.fx模拟设备连接阿里云

    前文提到,物联网设备在阿里云物联网平台登记了"身份证"之后,阿里云物联网平台上的设备就处于"未激活""离线"或者"在线" ...

最新文章

  1. 辩证看待 iostat
  2. 解读在校园招聘中人工智能常考的笔试题
  3. AliOS Things lorawanapp应用介绍
  4. python编程有用吗-分享8点超级有用的Python编程建议
  5. conversation:in Good common
  6. php中如何将验证码放入页面,如何在php中生成验证码图片
  7. java怎么访问私有类_如何从Java类的外部访问类的私有方法?
  8. 【方案分享】2021美图美学营销方案.pdf(附下载链接)
  9. 我写了一个“文本转手写”神器来搞定作业!
  10. python客观题阅卷_利用Python开发智能阅卷系统
  11. RF+Excel实现数据驱动接口自动化
  12. win10 重置登录账户密码
  13. Win11怎么关闭开机自启动软件
  14. ElementUI插件引用
  15. 倒计时1天,IMG、完美、腾讯技术大咖相聚直播间详解光线追踪技术
  16. 网站地图制作百度地图google地图制作方法
  17. 【图灵学院】JAVA互联网架构【全】
  18. 穿越功耗墙,从哪些方面提升性能?
  19. 用C语言求斐波那契数1,1,2,3,5,8......
  20. 4G时代 运营商的经营模式变化

热门文章

  1. HTML5期末大作业:关于家乡景点介绍网页设计-------我的家乡金堂(9页) HTML+CSS+JavaScript
  2. gta5nat严格怎么办_GTA5OL显示我的NAT类型为完全 结果都看不到别的玩家
  3. 简单逆向分析使用案例(2)--CrackMe_01.exe 找出密码
  4. android 渠道排名,10月安卓渠道数据分析:网游收入榜MMO占26%排名第1
  5. 万豪国际集团旗下福朋喜来登品牌首度亮相苏州吴中
  6. 逆市稳进的基本盘 苏宁赢了什么?
  7. mysql为什么会慢
  8. 富途网络科技测试笔试题
  9. 哪吒票房逼近30亿,从豆瓣短评简单分析人们对哪吒的态度
  10. java中的集合详解