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通讯


ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯

一、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

ESP32 python 485通讯 esp32-s2 micropython_iot_02

二、Micropthon开发环境搭建

1.ESP32串口驱动下载与安装

买到ESP32开发板后,首先要下载对应的USB转串口驱动。

如下如示,博主使用的模块中,USB转串口模块型号为:CP2102系列,因此需要在windows安装如下驱动软件:

ESP32 python 485通讯 esp32-s2 micropython_mqtt_03

下载附件的驱动软件,点击.exe文件安装即可

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_04


安装完串口驱动后,使用MicroUSB数据线接入电脑,在我的电脑右键–>管理–>设备管理器–>端口,查看接入的串口号,这里是COM3,后续使用串口软件登录ESP32时需要用到此串口号COM3

ESP32 python 485通讯 esp32-s2 micropython_iot_05

三、IDE工具下载及使用说明

推荐使用uPyCraft ,此IDE优点:既支持Micropython程序编写,也支持烧写ESP32固件,也支持下载py脚本到ESP32,还支持串口信息打印,且免安附带丰富的例程,使用简单。

1.IDE下载

官方下载地址:http://download3.dfrobot.com.cn/uPyCraft/
博主使用的版本:

ESP32 python 485通讯 esp32-s2 micropython_物联网_06

2.uPyCraft使用说明

1、设置板子型号:Tools–>board–>esp32

ESP32 python 485通讯 esp32-s2 micropython_阿里云_07

3.设置串口参数

设置串口参数:Tools–>Preferences–>Serial

ESP32 python 485通讯 esp32-s2 micropython_阿里云_08

4.下载ESP32固件

MicroPython官方针对不同的微控制器有不同的固件:http://www.micropython.org/download#esp32
博主使用的固件:

5.烧写ESP32固件

Tools–>BurnFirmware

注意:burn_addr参数必须设置为0x1000

erase_flash:是否擦除flash,可选

选择在上一步下载到的ESP32固件.bin文件,点击OK烧写到ESP单板中

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_09


ESP32固件烧写中

ESP32 python 485通讯 esp32-s2 micropython_mqtt_10

6.串口连接

ESP32 python 485通讯 esp32-s2 micropython_物联网_11


关于串口连接的特别说明

烧写完固件后,在没有下载过py脚本的时候,串口插上点击连接就可以连接上,但是一旦之前下载过py脚本,重新拔插串口线后,再点击连接就会提示open serial error, please try again.

并且软件自动弹出Burn Firmware界面,此时注意了,在已经下载过py脚本的情况下,再次连接串口需要重新烧写固定并把flash清空。

重新设置一下烧写固件参数,如下图所示,特别注意的是要把erase_flash选择yes,点击OK烧写一遍即可。

在平时连接好串口来调试代码时,请不要随意拔插串口以及不要点击关闭连接铵键。

ESP32 python 485通讯 esp32-s2 micropython_iot_12

四、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复位键启动程序运行

ESP32 python 485通讯 esp32-s2 micropython_物联网_13


ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_14

五、阿里云物联网

1.什么是物联网平台

阿里云官方指导手册:https://help.aliyun.com/document_detail/30522.html
阿里云官方有详细的操作指导,建议大家仔细阅读。
下文将简要介绍:如何在阿里云物联网平台创建产品–>创建设备–>ESP32如何通过MQTT协议接入–>数据流转–>两个ESP32通过阿里云物联网平台实现通信

阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。

物联网平台与设备、服务端、客户端的消息通信流程如下。

ESP32 python 485通讯 esp32-s2 micropython_iot_15


使用物联网平台实现设备完整的通信链接,需要您自行完成设备端的设备开发、云端服务器的开发(云端SDK的配置)、数据库的创建、手机App的开发。在设备和服务器开发中,您需完成设备消息的定义和处理逻辑。设备通过物联网平台上下行通信说明如下。

ESP32 python 485通讯 esp32-s2 micropython_物联网_16

2.创建产品与设备

1、登录阿里云

使用支付宝APP扫码

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F30528.html 2、登录物联网平台

ESP32 python 485通讯 esp32-s2 micropython_阿里云_17


3、创建产品

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_18


ESP32 python 485通讯 esp32-s2 micropython_mqtt_19


ESP32 python 485通讯 esp32-s2 micropython_物联网_20

4、创建设备

ESP32 python 485通讯 esp32-s2 micropython_物联网_21


ESP32 python 485通讯 esp32-s2 micropython_阿里云_22


ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_23

3.使用MQTT.fx工具连接阿里云

下载MQTT.fx工具:

设置MQTT连接参数:

ESP32 python 485通讯 esp32-s2 micropython_iot_24


ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_25

设置好MQTT连接参数后,点击Connect进行连接,一旦连接成功,在阿里云平台就可以看到设备处于在线状态,但此时显示的是未激活状态。必须进行以下的操作,才会正常显示为在线

Publish topic格式为:/ESP32 python 485通讯 esp32-s2 micropython_mqtt_26{deviceName}/user/get

随便在输入框中输入点内容,点击Publish,

ESP32 python 485通讯 esp32-s2 micropython_mqtt_27


点击Publish后,设备显示为在线状态:

ESP32 python 485通讯 esp32-s2 micropython_阿里云_28


PS:Publish接口是上传数据到阿里云物联网平台,属于设备到云平台的发送数据过程,在阿里云平台的日志中可看到发送成功的数据:

ESP32 python 485通讯 esp32-s2 micropython_阿里云_29

至此,我们已经掌握了设备向阿里云物联网平台发送数据,接下来,将介绍如何从阿里云物联网平台向设备发送数据。

Subscribe的接口格式为:/ESP32 python 485通讯 esp32-s2 micropython_mqtt_26{deviceName}/user/get

ESP32 python 485通讯 esp32-s2 micropython_阿里云_31


ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_32


至此,我们已经掌握了Publish和SubScribe两个方法,分别是从设备向云平台发送数据和从云平台向设备发送数据。掌握了双向通信的方法后,我们就大体掌握了设备与云平台的通信流程了。

4.创建数据流转规则

1、创建两个在线设备
按照上一章节再创建一个设备,命名为Device2。打开两个MQTT.fx工具,模拟两个设备,分别与Device1和Device2连接

ESP32 python 485通讯 esp32-s2 micropython_iot_33


ESP32 python 485通讯 esp32-s2 micropython_iot_34

2、创建数据流转规则

规则引擎–>云产品流转–>创建解析器–>输入解析器名称–>输入解析器描述–>确定

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_35

规则引擎–>云产品流转–>数据源–>创建数据源–>输入数据源名称–>输入数据源描述–>确定

ESP32 python 485通讯 esp32-s2 micropython_物联网_36

添加Topic

注意,选择的产品为TEST即设备所属产品,选择Devic1设备,选择的Topic为update接口,因为这个数据源来自于设备1的update上报接口

ESP32 python 485通讯 esp32-s2 micropython_物联网_37

创建数据目的

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_38


关联数据源

ESP32 python 485通讯 esp32-s2 micropython_mqtt_39


数据源

ESP32 python 485通讯 esp32-s2 micropython_mqtt_40


关联数据目的

ESP32 python 485通讯 esp32-s2 micropython_mqtt_41

解析器脚本

//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。

var data = payload(“json”);

//直接流转物模型上报数据。

writeIotTopic(ID, “/ProductKey/DeviceName/user/get”, data)

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_42

启动规则

ESP32 python 485通讯 esp32-s2 micropython_iot_43


使用MQTT.fx模拟Device1发送数据,在Device2上接收到数据,至此我们已经掌握了从设备1向设备2发送数据了,此时的阿里云物联网平台只起到了数据透传功能,负责将设备1的数据流转到设备2

ESP32 python 485通讯 esp32-s2 micropython_mqtt_44

同理,创建Device2_To_Device1规则,实现设备2发送数据到设备1

ESP32 python 485通讯 esp32-s2 micropython_mqtt_45

ESP32 python 485通讯 esp32-s2 micropython_mqtt_46


至此我们已经掌握了两个设备通过阿里云物联网平台的双向通信了。到了这一步,我们已经具备了两个设备远程通信的方式了,这是以后开发物联网设备的基础。

温馨提示:这一章节的学习中,我们使用了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账户密码信息。

ESP32 python 485通讯 esp32-s2 micropython_物联网_47

其余信息均可在阿里云物联网平台中获取:

ESP32 python 485通讯 esp32-s2 micropython_ESP32 python 485通讯_48


相关方法说明:

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 python 485通讯 esp32-s2 micropython_阿里云_49


ESP32 python 485通讯 esp32-s2 micropython_mqtt_50