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

1 篇文章 6 订阅
1 篇文章 1 订阅
本文详细介绍了如何使用ESP32微控制器配合Micropython环境,通过MQTT协议连接阿里云物联网平台。从ESP32硬件介绍、Micropython开发环境搭建、HelloWorld程序编写到阿里云物联网平台的设备创建、数据流转规则设置,最后实现两个ESP32设备间的远程通信。通过实例代码解析了ESP32的MQTT通信过程,为物联网应用开发提供了基础教程。
摘要由CSDN通过智能技术生成


前言

本文章将从零讲起,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
ESP32开发板照片

下载附件的驱动软件,点击.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&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账户密码信息。
在这里插入图片描述

其余信息均可在阿里云物联网平台中获取:
在这里插入图片描述
相关方法说明:
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+阿里云物联网平台开发出有意思的小玩意儿,敬请关注。

### 回答1: ESP32连接阿里云MQTT物联网平台的Arduino支持库是一种便捷的物联网连接方式,可以实时获取设备数据并作出相应的控制。以下是步骤: 1. 下载阿里云Arduino支持库,安装到Arduino IDE开发环境; 2. 获取阿里云MQTT物联网平台(IoT Platform)的密钥信息,包括:设备证书、密钥等; 3. 编写代码,包括:WiFi连接、MQTT连接、数据监听、数据上传、控制响应等,上传到ESP32开发板上; 4. 在阿里云控制台创建对应设备,定义设备的物模型、功能、属性等; 5. 将ESP32连接WiFi并连接阿里云MQTT物联网平台后,即可实现设备控制与数据获取等功能。 需要注意的是,在使用ESP32连接阿里云MQTT物联网平台过程中,应注意设备的网络稳定性、MQTT协议的消息确认机制等方面的问题。合理使用阿里云提供的服务和开发工具,能够更好地实现IoT物联网应用场景。 ### 回答2: ESP32是一款功能强大的微控制器,可以与阿里云MQTT物联网平台进行连接。为了实现这一目标,我们需要使用适用于Arduino的ESP32连接阿里云MQTT物联网平台的库。 这个库可以在Arduino ID中下载,它允许ESP32阿里云MQTT物联网平台实现关联和同步。我们只需要在Arduino IDE中添加库并编写所需的代码,就可以建立连接。 在详细说明之前,需要先确定在阿里云MQTT物联网平台中已创建AWS IoT设备,并获取设备证书、设备密钥和CA证书。这些证书将用于连接到阿里云服务。 接下来,在Arduino IDE中添加库并开始编写代码。代码确认设备连接信息并建立MQTT连接。代码还包括订阅主题、发布消息和处理回传消息等功能。 在使用此库连接ESP32阿里云MQTT物联网平台时,需要记住以下几点: 1.确认ESP32的设备IP地址并相应地更改代码。 2.在阿里云MQTT物联网平台上添加主题和订阅者。 3.正确配置阿里云MQTT物联网平台的策略和权限,确保ESP32可以正确访问。 一旦连接成功,ESP32就可以通过阿里云MQTT物联网平台与其他设备进行数据交换,实现智能家居、传感器应用和其他物联网应用。 ### 回答3: ESP32是一款广泛应用于物联网设备的微型控制器,它具有高度集成的蓝牙和Wi-Fi模块,可用于快速构建和部署智能设备和系统。阿里云MQTT物联网平台是一个领先的云端服务平台,提供了可靠、高效的通信,帮助开发人员更好地管理和控制物联网设备。在这种情况下,合并ESP32阿里云平台的连接可以极大地提高物联网设备的运行效率和控制能力。为实现这种连接,实用的方法是使用arduino支持库。 与其他加密、配对和通信协议不同,MQTT是一个极为开放的协议,并可以广泛用于不同的设备和应用。阿里云MQTT物联网平台支持MQTT协议,为开发人员创建更加智能化的物联网设备提供了全面的解决方案。 开发人员可以使用esp32连接阿里云mqtt物联网平台的arduino支持库。该库包含了所有用于连接和操作MQTT服务的必备组件,如mqtt客户端、设备管理、云消息代理等。您可以在阿里云物联网控制台上获取所有必要的信息和证书,以便在ESP32上运行。 在运行这些组件之前,您需要为设备创建一些认证凭据和配置参数,例如设备ID、秘钥,以及所属分组信息等,这些信息可以通过阿里云物联网平台进行设置。一旦您设置好了所有的认证和配置信息,您就可以使用支持库中的命令来连接到MQTT服务,并快速部署和控制自己的物联网设备。 总之,使用arduino支持库,您可以快速连接到阿里云MQTT物联网平台,不需要复杂复制粘贴代码,专注于实现您的物联网设备的逻辑、控制和应用。它不仅方便易用,而且可以大大提高你的开发效率。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值