从零讲起:ESP32+Micropython+MQTT阿里云物联网

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+Micropython+MQTT阿里云物联网

一、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+Micropython+MQTT阿里云物联网

二、Micropthon开发环境搭建

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

买到ESP32开发板后,首先要下载对应的USB转串口驱动。
如下如示,博主使用的模块中,USB转串口模块型号为:CP2102系列,因此需要在windows安装如下驱动软件:https://download.csdn.net/download/weixin_42089940/81364076
从零讲起:ESP32+Micropython+MQTT阿里云物联网

下载附件的驱动软件,点击.exe文件安装即可
从零讲起:ESP32+Micropython+MQTT阿里云物联网
安装完串口驱动后,使用MicroUSB数据线接入电脑,在我的电脑右键–>管理–>设备管理器–>端口,查看接入的串口号,这里是COM3,后续使用串口软件登录ESP32时需要用到此串口号COM3
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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

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

1.IDE下载

官方下载地址:http://download3.dfrobot.com.cn/uPyCraft/
博主使用的版本:https://download.csdn.net/download/weixin_42089940/81366838

从零讲起:ESP32+Micropython+MQTT阿里云物联网

2.uPyCraft使用说明

1、设置板子型号:Tools–>board–>esp32
从零讲起:ESP32+Micropython+MQTT阿里云物联网

3.设置串口参数

设置串口参数:Tools–>Preferences–>Serial
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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+Micropython+MQTT阿里云物联网
ESP32固件烧写中
从零讲起:ESP32+Micropython+MQTT阿里云物联网

6.串口连接

从零讲起:ESP32+Micropython+MQTT阿里云物联网
关于串口连接的特别说明
烧写完固件后,在没有下载过py脚本的时候,串口插上点击连接就可以连接上,但是一旦之前下载过py脚本,重新拔插串口线后,再点击连接就会提示open serial error, please try again.
并且软件自动弹出Burn Firmware界面,此时注意了,在已经下载过py脚本的情况下,再次连接串口需要重新烧写固定并把flash清空。
重新设置一下烧写固件参数,如下图所示,特别注意的是要把erase_flash选择yes,点击OK烧写一遍即可。
在平时连接好串口来调试代码时,请不要随意拔插串口以及不要点击关闭连接铵键。
从零讲起:ESP32+Micropython+MQTT阿里云物联网

四、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+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

五、阿里云物联网

1.什么是物联网平台

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

阿里云物联网平台是一个集成了设备管理、数据安全通信和消息订阅等能力的一体化平台。向下支持连接海量设备,采集设备数据上云;向上提供云端API,服务端可通过调用云端API将指令下发至设备端,实现远程控制。
物联网平台与设备、服务端、客户端的消息通信流程如下。
从零讲起:ESP32+Micropython+MQTT阿里云物联网
使用物联网平台实现设备完整的通信链接,需要您自行完成设备端的设备开发、云端服务器的开发(云端SDK的配置)、数据库的创建、手机App的开发。在设备和服务器开发中,您需完成设备消息的定义和处理逻辑。

设备通过物联网平台上下行通信说明如下。
从零讲起:ESP32+Micropython+MQTT阿里云物联网

2.创建产品与设备

1、登录阿里云
使用支付宝APP扫码
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F30528.html
2、登录物联网平台
从零讲起:ESP32+Micropython+MQTT阿里云物联网
3、创建产品
从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

4、创建设备
从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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

下载MQTT.fx工具:https://download.csdn.net/download/weixin_42089940/81618381
设置MQTT连接参数:从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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

P

r

o

d

u

c

t

K

e

y

/

{ProductKey}/

ProductKey/{deviceName}/user/get
随便在输入框中输入点内容,点击Publish,
从零讲起:ESP32+Micropython+MQTT阿里云物联网
点击Publish后,设备显示为在线状态:
从零讲起:ESP32+Micropython+MQTT阿里云物联网
PS:Publish接口是上传数据到阿里云物联网平台,属于设备到云平台的发送数据过程,在阿里云平台的日志中可看到发送成功的数据:
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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

P

r

o

d

u

c

t

K

e

y

/

{ProductKey}/

ProductKey/{deviceName}/user/get
从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网
至此,我们已经掌握了Publish和SubScribe两个方法,分别是从设备向云平台发送数据和从云平台向设备发送数据。掌握了双向通信的方法后,我们就大体掌握了设备与云平台的通信流程了。

4.创建数据流转规则

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

从零讲起:ESP32+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

2、创建数据流转规则
规则引擎–>云产品流转–>创建解析器–>输入解析器名称–>输入解析器描述–>确定
从零讲起:ESP32+Micropython+MQTT阿里云物联网

规则引擎–>云产品流转–>数据源–>创建数据源–>输入数据源名称–>输入数据源描述–>确定
从零讲起:ESP32+Micropython+MQTT阿里云物联网

添加Topic
注意,选择的产品为TEST即设备所属产品,选择Devic1设备,选择的Topic为update接口,因为这个数据源来自于设备1的update上报接口
从零讲起:ESP32+Micropython+MQTT阿里云物联网

创建数据目的
从零讲起:ESP32+Micropython+MQTT阿里云物联网
关联数据源

从零讲起:ESP32+Micropython+MQTT阿里云物联网
数据源
从零讲起:ESP32+Micropython+MQTT阿里云物联网
关联数据目的
从零讲起:ESP32+Micropython+MQTT阿里云物联网

解析器脚本

//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload(“json”);
//直接流转物模型上报数据。
writeIotTopic(ID, “/ProductKey/DeviceName/user/get”, data)
从零讲起:ESP32+Micropython+MQTT阿里云物联网

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

同理,创建Device2_To_Device1规则,实现设备2发送数据到设备1
从零讲起:ESP32+Micropython+MQTT阿里云物联网

从零讲起:ESP32+Micropython+MQTT阿里云物联网
至此我们已经掌握了两个设备通过阿里云物联网平台的双向通信了。到了这一步,我们已经具备了两个设备远程通信的方式了,这是以后开发物联网设备的基础。
温馨提示:这一章节的学习中,我们使用了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&gt*********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+Micropython+MQTT阿里云物联网

其余信息均可在阿里云物联网平台中获取:
从零讲起:ESP32+Micropython+MQTT阿里云物联网
相关方法说明:
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+Micropython+MQTT阿里云物联网
从零讲起:ESP32+Micropython+MQTT阿里云物联网

总结

本文章,主要从硬件介绍和开发环境搭建讲起,演示了如何将两个ESP32通过阿里云物联网平台实现远程网络通信。这是我们以后开发物联网设备的基础流程。后续会为大家带来基于ESP32+阿里云物联网平台开发出有意思的小玩意儿,敬请关注。

本文章来源于互联网,如有侵权,请联系删除!原文地址:从零讲起:ESP32+Micropython+MQTT阿里云物联网

相关推荐: 阿里云生活物联网平台中Android Demo运行

因为公司需求,需要对接阿里云生活物联网平台,实现与自有品牌App的关联,由于阿里的Demo 存在多处问题,对于刚开始接触者有诸多问题需要处理,记录下相关修改运行的流程 阿里云账号申请,生活物联网平台App管理搭建就在此略过。 1:下载相关的资料数据 ➢ 在Ap…