ESP32+Micropython+MQTT阿里云物联网
- 前言
- 一、ESP32是什么?
- 二、Micropthon开发环境搭建
-
- 1.ESP32串口驱动下载与安装
- 三、IDE工具下载及使用说明
-
- 1.IDE下载
- 2.uPyCraft使用说明
- 3.设置串口参数
- 4.下载ESP32固件
- 5.烧写ESP32固件
- 6.串口连接
- 四、HelloWorld编写与运行
-
- 1.编写helloworld脚本
- 2.下载main.py到ESP32中
- 五、阿里云物联网
-
- 1.什么是物联网平台
- 2.创建产品与设备
- 3.使用MQTT.fx工具连接阿里云
- 4.创建数据流转规则
- 六、ESP32实现MQTT通信
-
- 1.mqtt.py代码
- 2.main.py代码
- 七、ESP32实验
-
- 1.ESP32作为Device1
- 2.MQTT.fx工具作为Device2
- 3.实验效果-通过Device2远程开关Device1的LED灯
- 总结
前言
本文章将从零讲起,ESP32硬件介绍–>Micropthon开发环境搭建–>helloworld编写与运行–>创建阿里云物联网设备–>MQTT协议介绍–>ESP32接入阿里云物联网平台–>通过阿里云的数据流转规则实现两个ESP32通讯
提示:以下是本篇文章正文内容,下面案例可供参考
博主已录制视频上传,请查阅:
https://m.toutiao.com/is/NyVHV8d/
一、ESP32是什么?
是乐鑫继ESP8266后推出的又一款集成WiFi蓝牙功能的微控制器。ESP32拥有比ESP8266更加强大的性能,可以用来开发更加复杂的应用。
WiFi支持 802.11 b/g/n,802.11 n (2.4 GHz) 速度高达 150 Mbps;
支持蓝牙 v4.2 完整标准,包含传统蓝牙 (BR/EDR) 和低功耗蓝牙 (BLE);
32位双核处理器,CPU正常工作速度为80MHz,最高可达240MHz,运算能力高达 600 MIPS;
内置 448 KB ROM;
内置520 KB SRAM;
最大支持 16 MB 片外 SPI Flash;
最大支持 8 MB 片外 SPI SRAM;
包含常用微控制器的基本功能;
更多相关内容参考乐鑫官网: https://www.espressif.com/zh-hans/products/hardware/esp32/overview
二、Micropthon开发环境搭建
1.ESP32串口驱动下载与安装
买到ESP32开发板后,首先要下载对应的USB转串口驱动。
如下如示,博主使用的模块中,USB转串口模块型号为:CP2102系列,因此需要在windows安装如下驱动软件:https://download.csdn.net/download/weixin_42089940/81364076
下载附件的驱动软件,点击.exe文件安装即可
安装完串口驱动后,使用MicroUSB数据线接入电脑,在我的电脑右键–>管理–>设备管理器–>端口,查看接入的串口号,这里是COM3,后续使用串口软件登录ESP32时需要用到此串口号COM3
三、IDE工具下载及使用说明
推荐使用uPyCraft ,此IDE优点:既支持Micropython程序编写,也支持烧写ESP32固件,也支持下载py脚本到ESP32,还支持串口信息打印,且免安附带丰富的例程,使用简单。
1.IDE下载
官方下载地址:http://download3.dfrobot.com.cn/uPyCraft/
博主使用的版本:https://download.csdn.net/download/weixin_42089940/81366838
2.uPyCraft使用说明
1、设置板子型号:Tools–>board–>esp32
3.设置串口参数
设置串口参数:Tools–>Preferences–>Serial
4.下载ESP32固件
MicroPython官方针对不同的微控制器有不同的固件:http://www.micropython.org/download#esp32
博主使用的固件:https://download.csdn.net/download/weixin_42089940/81367535
5.烧写ESP32固件
Tools–>BurnFirmware
注意:burn_addr参数必须设置为0x1000
erase_flash:是否擦除flash,可选
选择在上一步下载到的ESP32固件.bin文件,点击OK烧写到ESP单板中
ESP32固件烧写中
6.串口连接
关于串口连接的特别说明
烧写完固件后,在没有下载过py脚本的时候,串口插上点击连接就可以连接上,但是一旦之前下载过py脚本,重新拔插串口线后,再点击连接就会提示open serial error, please try again.
并且软件自动弹出Burn Firmware界面,此时注意了,在已经下载过py脚本的情况下,再次连接串口需要重新烧写固定并把flash清空。
重新设置一下烧写固件参数,如下图所示,特别注意的是要把erase_flash选择yes,点击OK烧写一遍即可。
在平时连接好串口来调试代码时,请不要随意拔插串口以及不要点击关闭连接铵键。
四、HelloWorld编写与运行
1.编写helloworld脚本
注意:
1、创建的py文件必须命名为main.py,ESP上电只会自动运行main.py脚本,其它脚本不会被执行,如果要执行其它py文件,只能在main.py中import再调用相关方法执行
2、#coding:utf-8是一种编码声明,需要加上,否则在有中文时会因编码问题而报错,中文注释也会报错
main.py示例如下:
#-*-coding:utf-8-*-
print('helloworld')
2.下载main.py到ESP32中
注意:
main.py下载到ESP32完成后,需要按一下ESP32单板上的EN复位键启动程序运行
五、阿里云物联网
1.什么是物联网平台
阿里云官方指导手册:https://help.aliyun.com/document_detail/30522.html
阿里云官方有详细的操作指导,建议大家仔细阅读。
下文将简要介绍:如何在阿里云物联网平台创建产品–>创建设备–>ESP32如何通过MQTT协议接入–>数据流转–>两个ESP32通过阿里云物联网平台实现通信
阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。
物联网平台与设备、服务端、客户端的消息通信流程如下。
使用物联网平台实现设备完整的通信链接,需要您自行完成设备端的设备开发、云端服务器的开发(云端SDK的配置)、数据库的创建、手机App的开发。在设备和服务器开发中,您需完成设备消息的定义和处理逻辑。
设备通过物联网平台上下行通信说明如下。
2.创建产品与设备
1、登录阿里云
使用支付宝APP扫码
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F30528.html
2、登录物联网平台
3、创建产品
4、创建设备
3.使用MQTT.fx工具连接阿里云
下载MQTT.fx工具:https://download.csdn.net/download/weixin_42089940/81618381
设置MQTT连接参数:
设置好MQTT连接参数后,点击Connect进行连接,一旦连接成功,在阿里云平台就可以看到设备处于在线状态,但此时显示的是未激活状态。必须进行以下的操作,才会正常显示为在线
Publish topic格式为:/
P
r
o
d
u
c
t
K
e
y
/
{ProductKey}/
ProductKey/{deviceName}/user/get
随便在输入框中输入点内容,点击Publish,
点击Publish后,设备显示为在线状态:
PS:Publish接口是上传数据到阿里云物联网平台,属于设备到云平台的发送数据过程,在阿里云平台的日志中可看到发送成功的数据:
至此,我们已经掌握了设备向阿里云物联网平台发送数据,接下来,将介绍如何从阿里云物联网平台向设备发送数据。
Subscribe的接口格式为:/
P
r
o
d
u
c
t
K
e
y
/
{ProductKey}/
ProductKey/{deviceName}/user/get
至此,我们已经掌握了Publish和SubScribe两个方法,分别是从设备向云平台发送数据和从云平台向设备发送数据。掌握了双向通信的方法后,我们就大体掌握了设备与云平台的通信流程了。
4.创建数据流转规则
1、创建两个在线设备
按照上一章节再创建一个设备,命名为Device2。打开两个MQTT.fx工具,模拟两个设备,分别与Device1和Device2连接
2、创建数据流转规则
规则引擎–>云产品流转–>创建解析器–>输入解析器名称–>输入解析器描述–>确定
规则引擎–>云产品流转–>数据源–>创建数据源–>输入数据源名称–>输入数据源描述–>确定
添加Topic
注意,选择的产品为TEST即设备所属产品,选择Devic1设备,选择的Topic为update接口,因为这个数据源来自于设备1的update上报接口
创建数据目的
关联数据源
数据源
关联数据目的
解析器脚本
//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload(“json”);
//直接流转物模型上报数据。
writeIotTopic(ID, “/ProductKey/DeviceName/user/get”, data)
启动规则
使用MQTT.fx模拟Device1发送数据,在Device2上接收到数据,至此我们已经掌握了从设备1向设备2发送数据了,此时的阿里云物联网平台只起到了数据透传功能,负责将设备1的数据流转到设备2
同理,创建Device2_To_Device1规则,实现设备2发送数据到设备1
至此我们已经掌握了两个设备通过阿里云物联网平台的双向通信了。到了这一步,我们已经具备了两个设备远程通信的方式了,这是以后开发物联网设备的基础。
温馨提示:这一章节的学习中,我们使用了MQTT.fx工具模拟ESP32设备来测试与阿里云物联网通信。
下一章,我们将一起学习如何在ESP32上实现MQTT协议通信。
六、ESP32实现MQTT通信
1.mqtt.py代码
mqtt.py示例如下:
#-*-coding:utf-8-*-
from umqtt.simple import MQTTClient
from machine import Pin
import network
import time
import machine
import dht
from machine import Timer
import json
#---以下的参数值都需要根据自己的环境修改-----------------------------------------------
led=Pin(2,Pin.OUT) #ESP32的引脚2接了LED灯,可根据自己的ESP32板子的LED引脚来设置
SSID = "myhome***" #填写自己的WIFI名称
PASSWORD = "mypasswd****" #填写自己的WIFI密码
SERVER = 'iot-************.mqtt.iothub.aliyuncs.com' # mqttHostUrl
CLIENT_ID = "gt******S.Device1|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|" # clientId
username = 'light>*********S' #username
password = '***************************' #密码
publish_TOPIC = '/gt********S/Device1/user/update'
subscribe_TOPIC = '/gt********S/Device1/user/get'
#---以上的参数值都需要根据自己的环境修改-----------------------------------------------
client = None
mydht = None
wlan = None
def ConnectWifi(ssid, passwd):
global wlan
wlan = network.WLAN(network.STA_IF) # create a wlan object
wlan.active(True) # Activate the network interface
wlan.disconnect() # Disconnect the last connected WiFi
wlan.connect(ssid, passwd) # connect wifi
while (wlan.ifconfig()[0] == '0.0.0.0'):
time.sleep(1)
print(wlan.ifconfig())
def sub_cb(topic, msg):
global led
print((topic, msg))
#msg = str(msg)
print(type(msg))
print(msg)
msg = json.loads(msg)
print(msg)
if msg['lightStatus'] =='ON':
print('receive ON')
led.value(1)
print('led ON')
if msg['lightStatus'] =='OFF':
print('receive OFF')
led.value(0)
print('led OFF')
def heartbeatTimer(mytimer):
global client
global led
led.value(1)
try:
mymessage = '{"heartbeat":"Device1"}'
print('============================')
print(mymessage)
client.publish(topic=publish_TOPIC, msg=mymessage, retain=False, qos=0)
except Exception as ex_results2:
print('exception', ex_results2)
print('this is error')
mytimer.deinit()
# finally:
# machine.reset()
def run():
global client
global led
global wlan
print('start to connect mqtt ali')
try:
mydht = dht.DHT11(machine.Pin(4))
ConnectWifi(SSID, PASSWORD)
client = MQTTClient(CLIENT_ID, SERVER, 0, username, password, 60) # create a mqtt client
print('client:%s' % str(client))
led.value(1)
client.set_callback(sub_cb) # set callback
client.connect() # connect mqtt
client.subscribe(subscribe_TOPIC) # client subscribes to a topic
mytimer = Timer(0)
mytimer.init(mode=Timer.PERIODIC, period=50000, callback=heartbeatTimer)
while True:
client.wait_msg() # wait message
except Exception as ex_results:
print('exception1', ex_results)
finally:
if (client is not None):
led.value(0)
client.disconnect()
wlan.disconnect()
wlan.active(False)
return 'FAILED'
代码说明:
拷贝mqtt.py脚本到本地,修改以下的内容即可。然后将mqtt.py脚本下载到ESP32板子上。
这部分参数需要根据自己的环境参数修改。ESP32是通过WIFI接入互联网的,所以请填写正确的可用的WIFI账户密码信息。
其余信息均可在阿里云物联网平台中获取:
相关方法说明:
1)ConnectWifi(ssid, passwd)
我这个是连接WIFI的方法,输入的参数是上面设置的WIFI用户名和密码
2)sub_cb(topic, msg)
SubScribe接口,用于接收阿里云数据。此方法中实现了对接收到的数据解析,如果收到msg[‘lightStatus’] ==‘ON’,则将LED灯点亮,如果收到msg[‘lightStatus’] ==’OFF’则将LED灯关闭。这是本实验的主要业务实现。
3)heartbeatTimer(mytimer)
这个是心跳发送方法,实现向阿里云发送心跳数据,
重要:设备端在保活时间间隔内,至少需要发送一次报文,包括ping请求,连接保活时间的取值范围 为30秒~1200秒。建议取值300秒以上。从物联网平台发送CONNACK响应CONNECT消息时,开始心跳计时。收到PUBLISH、SUBSCRIBE、PING或 PUBACK消息时,会重置计时器。超过指定1.5倍心跳时间未收到消息(指定心跳时间乘以1.5),服务器将自动断开连接。
因此必须实现定期向阿里云物联网平台发送消息。否则会出现连接自动断连的情况。
4)run() 这个是mqtt.py的主要方法,实现整个业务逻辑。
此方法中,会进行WIFI连接,设置数据接收方法和开启定期器定期发送心跳包保活。
如果连接中断,会返回’FAILED’字符串,供main.py脚本重试连接。
2.main.py代码
mqtt.py示例如下:
#-*-coding:utf-8-*-
import time
from mqtt import *
while (True):
if run() == 'FAILED':
print('FAILED,retry to connect')
time.sleep(5)
之前我们提到过,ESP32只会执行main.py脚本,所以其它业务脚本只能被main.py调用。
以上的main.py脚本中,调用了mqtt.py的run方法,这个是主要的业务实现代码,当连接中断或者脚本异常后,会进行自动重试。
七、ESP32实验
1.ESP32作为Device1
将mqtt.py和main.py下载到ESP32板子上,按一下EN复位键运行脚本。此时ESP32就是Device1设备
2.MQTT.fx工具作为Device2
特别提醒:
阿里云平台的一个设备只能对应一个真实在线设备,所以请将MQTT.fx Device2客户端关闭。
使用MQTT.fx作为Device2连接到阿里云。
使用MQTT.fx工具发送{“lightStatus”:“OFF”}
3.实验效果-通过Device2远程开关Device1的LED灯
1、ESP32按EN复位启动后,程序运行,连接阿里云成功后LED点亮。
2、MQTT.fx作为Device2发送{“lightStatus”:“OFF”}
3、ESP32串口打印信息,接收到Device2的数据,将LED关闭。
4、MQTT.fx作为Device2发送{“lightStatus”:“ON”},LED灯点亮
总结
本文章,主要从硬件介绍和开发环境搭建讲起,演示了如何将两个ESP32通过阿里云物联网平台实现远程网络通信。这是我们以后开发物联网设备的基础流程。后续会为大家带来基于ESP32+阿里云物联网平台开发出有意思的小玩意儿,敬请关注。
完
相关推荐: 阿里云生活物联网平台中Android Demo运行
因为公司需求,需要对接阿里云生活物联网平台,实现与自有品牌App的关联,由于阿里的Demo 存在多处问题,对于刚开始接触者有诸多问题需要处理,记录下相关修改运行的流程 阿里云账号申请,生活物联网平台App管理搭建就在此略过。 1:下载相关的资料数据 ➢ 在Ap…