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格式为:/ProductKey/{ProductKey}/ProductKey/{deviceName}/user/get
随便在输入框中输入点内容,点击Publish,

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

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

至此,我们已经掌握了设备向阿里云物联网平台发送数据,接下来,将介绍如何从阿里云物联网平台向设备发送数据。
Subscribe的接口格式为:/ProductKey/{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 = Nonedef ConnectWifi(ssid, passwd):global wlanwlan = network.WLAN(network.STA_IF)  # create a wlan objectwlan.active(True)  # Activate the network interfacewlan.disconnect()  # Disconnect the last connected WiFiwlan.connect(ssid, passwd)  # connect wifiwhile (wlan.ifconfig()[0] == '0.0.0.0'):time.sleep(1)print(wlan.ifconfig())def sub_cb(topic, msg):global ledprint((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 clientglobal ledled.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 clientglobal ledglobal wlanprint('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 clientprint('client:%s' % str(client))led.value(1)client.set_callback(sub_cb)  # set callbackclient.connect()  # connect mqttclient.subscribe(subscribe_TOPIC)  # client subscribes to a topicmytimer = Timer(0)mytimer.init(mode=Timer.PERIODIC, period=50000, callback=heartbeatTimer)while True:client.wait_msg()  # wait messageexcept 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+阿里云物联网平台开发出有意思的小玩意儿,敬请关注。

从零讲起:ESP32+Micropython+MQTT阿里云物联网相关推荐

  1. 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网

    摘自:移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网STM32代码-电脑看 地址:https://www.bilibili.com/video/BV1EJ411P7CR?from= ...

  2. ESP8266/ESP32 NodeMCU接入阿里云物联网平台

    阿里云物联网平台公共实例是免费的,且不像然也等服务器一样无法区分不同用户发布的话题.本文采用常规的pubsubclient库连接阿里云.ESP8266/ESP32用pubsubclient接入阿里云平 ...

  3. 安信可Ai-WB1系列AT指令连接MQTT阿里云物联网平台

    文章目录 前言 1 准备材料 2 创建云端设备 3 硬件连接 4 配置终端设备 5 MQTT实现发布&订阅消息 联系我们 前言 本文将介绍安信可AI-WB1系列通过AT指令接入阿里云物联网平台 ...

  4. 基于MQTT阿里云物联网手机远程控制ESP8266

    1.视频教程 https://www.bilibili.com/video/BV1mJ411r7M9/?spm_id_from=333.788.videocard.9 资料下载: https://do ...

  5. 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网STM32代码

    usb转tdl ath 挂断 22点评,要接转送帽 AT+QGPSLOC? gps定位 AT+QGPS=1通过命令启动 启动好之后 505还没有启动 516 还没有定位好, 新版本数据模块,带电瓶转换 ...

  6. ESP32基础应用之ESP32与阿里云物联网平台实现数据互传(MQTT协议)

    文章目录 1 实验目的 2 在阿里云物联网平台添加实验设备 3 ESP32连接阿里云物联网平台 3.1 准备ESP32工程 3.2 准备ESP32所需的MQTT相关参数 3.4 ESP32工程主要代码 ...

  7. 【阿里云生活物联网架构师专题 ②】esp8266 sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.esp32接入阿里云物联网平台,实现天猫精灵语音控制: 2.es ...

  8. 学习日记——阿里云物联网平台

    文章目录 前言 一.阿里云物联网平台 产品架构 产品规格 计费标准 MQTT 二.阿里云创建产品和设备 1.开通物联网平台 2.创建产品 3.添加设备 4.接入阿里云物联网平台 5. 规则引擎 6.M ...

  9. esp32连接阿里云物联网平台进行MQTT通信

    前提:IDE是采用arduino IDE,arduino使用的库是pubsubclient 开发板可以使用esp32(esp8266也是一样的) 已经学会pubsubclient库的基本使用 使用pu ...

最新文章

  1. Jmeter性能测试入门(一)
  2. netty tcp服务端主动断开客户端_【Netty】服务端和客户端
  3. 【C 语言】文件操作 ( 按照文本行的方式读写文件 | fgets 函数 | fputs 函数 )
  4. Oracle一个中文汉字占用几个字节
  5. docker export_docker使用简介
  6. 阿里合伙人程立:阿里15年,我撕掉了身上两个标签
  7. 音视频开发进阶指南--音视频概念基础
  8. Bsdiff:Bsd断电差分升级
  9. linux shell 后台执行脚本的方法 脚本后台运行 后台运行程
  10. Laravel 使用firstOrCreate 报错MassAssignmentException
  11. 安装程序无法创建新的系统分区也无法定位现有系统分区_不要再给硬盘胡乱分区了,这里有最方便安全的分区方法。...
  12. 11083 旅游背包
  13. python 机器视觉测量_用Opencv python实现精密测量
  14. 微信公众号数据2019_2019年4月房地产微信公众号排行榜:郑州楼市第一
  15. 「PAT乙级真题解析」Basic Level 1033 旧键盘打字 (问题分析+完整步骤+伪代码描述+提交通过代码)
  16. 职称有哪些意义?如何提升职称?
  17. java后台 apiV3 对接微信app支付
  18. webpack配置详解一:mode模式
  19. 图书馆管理系统心得体会
  20. 神器:公众号如何从第一篇文章开始看

热门文章

  1. java程序纠错题_面试题错题本之java
  2. IE8开发者工具调试(三)javascript篇
  3. 图片翻译软件哪个好用?这些软件值得收藏
  4. UE4的JSON读写方式二
  5. spring--xml--constrructor-arg属性
  6. 执行sh脚本提示“[[: not found”解决方案,bash和sh的区别
  7. 计算机软件服务费摊销期限,​软件服务费需要长期待摊吗
  8. miniui 消息框(MessageBox)总结
  9. python物业管理系统_jsp物业管理系统,源码下载
  10. unity 文件API