0 有用
1 下载

【项目】ESP32上的多台物联网设备通信

文件列表(压缩包大小 1.49M)

免费

概述

在ESP32上使用MQTT进行多物联网设备通信

项目清单

硬件部分

名称 数量
Espressif esp32-devkitc 2
RGB Led 2
C&K Switches PTS 645 Series Switch 2
USB-A to Micro-USB Cable 2
Breadboard (generic) 1

软件应用程序和在线服务

名称
Snappy Ubuntu Core
MicroPython
MQTT

设计内容

目标 该项目目标是为使用MQTT协议在多个物联网设备之间通信设置一个基础示例

介绍 在过去的几年里,物联网(IoT)发生了前所未有的变化,改变了人们的生活和工作方式。物联网促使企业重新思考他们开展业务的方式,并为他们提供改进商业战略的工具。物联网有许多现实世界的应用,从消费者物联网和企业物联网到制造业和工业物联网(IIoT)。物联网应用跨越了许多垂直领域,包括汽车、电信和能源。未来一个至关重要的领域是理解物联网和工业物联网将如何发生的能力

ESP32开发工具包 ESP32是一款低成本、低功耗的芯片系统(SoC)系列,具有Wi-Fi和双模蓝牙功能。它包含一个双核或单核Tensilica Xtensa LX6微处理器,时钟频率高达240mhz,集成了Wi-Fi和双模蓝牙。

  • Wi-Fi: 802.11 b/g/n/e/i (802.11n @ 2.4 GHz至150mbit /s)
  • 蓝牙:v4.2 BR/EDR和Low Energy (BLE)
  • Flash: 4mb
  • SRAM: 520 KB

引用:MicroPython - Python for microcontrollers

MQTT (Message Queue Telemetry Transport) 对于物联网设备来说,连接到互联网是其功能的一个关键方面。允许设备之间和设备后端服务通信。MQTT构建在TCP/IP堆栈之上,是一种轻量级、开放和简单的消息传递协议,适用于小型传感器和移动设备。它易于实现,并且在许多情况下非常适合使用,特别是在需要“小代码占用”的资源约束环境中,例如物联网(IoT)中的通信。MQTT协议已经成为物联网通信的标准,可以运行在SSL/TLS上,SSL/TLS是TCP/IP之上的安全协议,以确保设备之间的所有数据通信是加密和安全的。MQTT是一种发布-订阅网络协议,它定义了两种类型的实体:消息代理和多个客户机。代理是一个服务器,它接收来自客户机的所有消息,并将消息路由到相应的目标客户机。另一方面,客户端可以是任何东西,从物联网设备到基于这些数据进行预测的机器学习模型。

MQTT broker的主要优点是::

  1. 使用发布/订阅消息模式,该模式提供一对多的消息分发和应用程序的解耦。
  2. 消除脆弱和不安全的客户端连接。
  3. 可以很容易地从一个设备扩展到数千个。
  4. 管理和跟踪所有客户端连接状态,包括安全凭据和证书。
  5. 在不影响安全性的情况下减少网络压力(蜂窝网络或卫星网络)

引用:What is MQTT? Why use MQTT? – IBM Developer

电路图 每个ESP32开发套件都连接有一个RGB公共阳极LED和一个按钮开关。该开关模拟正在执行的动作的目的,例如按下门按钮来打开它,而LED则用于显示正在执行的动作的结果。在我们的例子中,下面是led的颜色和它们对应的门的状态

配置和代码 我们按电路图连接LED和开关。在下面的设置中,我们将RGB LED分别连接到GPIO管脚13、12和14。输入开关连接到GPIO引脚2,连接到5V电源。

连接了电路之后,开始设置软件。我们将使用MicroPython。以下步骤将设置MicroPython的新副本

  • 从官方网站下载MicroPython二进制文件的最新稳定版本: MicroPython - Python for microcontrollers

  • 我们需要安装esptool.py程序,可以在这里找到编程板https://github.com/espressif/esptool/

  • pip install esptool

  • 固件整个闪存都要清除,在打开固件之前:

  • esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash

  • 使用以下命令将MicroPython固件Flash到单板上

(Note these commands are only for ESP32)
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 115200 write_flash -z 0x1000 esp32-xxxxxxxx-vx.xx.bin
(replace the x’s with the appropriate firmware version number that you downloaded)
  • 我们成功闪存了固件,我们就可以用picocom连接主板,

  • picocom /dev/ttyUSB0 -b115200

获得了python终端之后,我们就可以使用下面的代码建立Wi-Fi连接。提供你的无线通讯系统的SSID及密码,

import network

SSID = ""
PASSWORD=  ""

station = network.WLAN(network.STA_IF)

if station.isconnected() == True:
    print("Already connected")
    return

station.active(True)
station.connect(SSID, PASSWORD)

while station.isconnected() == False:
    pass

print("Connection successful")
print(station.ifconfig())

我们可以在boot.py中包含这段代码,或者将它放在一个单独的文件中,并在打开主板时从boot.py调用它来启动Wi-Fi连接。使用MQTT在多个设备之间建立通信,对于MQTT服务器,我们使用eclipse- mosquito来使用来自eclipse-moqsuitto docker HubTo的docker映像,使用以下命令运行该映像

$ docker run -it -p 1883:1883 -p 9001:9001 \ 
-v mosquitto.conf:/mosquitto/config/mosquitto.conf \ 
-v /mosquitto/data -v /mosquitto/log eclipse-mosquitto

要想在MicroPython中使用MQTT,我们需要使用upip安装与MQTT相关的库,

import upip
upip.install('micropython-umqtt.robust')

每个设备都使用MQTT中的发布和订阅方法与其他设备通信。我们为交换机定义了一个中断处理程序。当开关被按下时,处理器停止主程序的执行,以执行一个与中断请求相关的任务,然后返回到主程序。在我们的例子中,我们使用中断处理程序向代理发布一条消息,说明特定控制器上的开关已被按下。我们初始化变量开关到开关连接到的GPIO引脚2

switch = Pin(2, Pin.IN)

然后,我们为开关定义一个中断请求处理程序,按下该开关将其DEVICE_ID发布到代理上的特定主题。

def switch_irq_handler(pin):
...
switch_pressed = pin.value()
if switch_pressed:
...
client.publish(MQTT_SUB_TOPIC, DEVICE_ID, True)
...

然后我们使用irq()方法将中断处理程序回调附加到开关变量

switch.irq(trigger=Pin.IRQ_RISING, handler=switch_irq_handler)

在主循环中,设备订阅所有设备向其发布数据的主题。为了实现这一点,我们定义了一个回调方法并将其设置为MQTT客户机。

def sub_cb(topic, msg):
...
if(<cond1>):
    led_change('green')
.....
elif(<cond2>):
    led_change('blue')
else:
    led_change('red')

我们用每个设备的唯一DEVICE_ID和MQTT服务器IP地址初始化MQTT客户机。我们尝试建立与服务器的连接,并将回调设置为上面声明的方法。然后,我们订阅所有设备向其发布数据的主题

client = MQTTClient(DEVICE_ID, MQTT_SERVER_IP)
client.connect()
client.set_callback(sub_cb)
client.subscribe(MQTT_SUB_TOPIC)

作为主循环的一部分,我们使用wait_msg()方法,这是一个阻塞调用,用于检查订阅主题中的消息,

try:
    while True:
        client.wait_msg()
except Exception as e:
    client.close()

成功启动后,设备的蓝色LED将亮起,表明设备准备就绪。当按下其中一个设备上的开关时,LED指示灯变为“绿色”,表示开关打开,而其他所有设备上的LED指示灯变为红色,表示它们已锁定。

在可配置的预定义间隔10秒后,状态被重置为就绪,LED灯变成蓝色如上所示。然后我们按下另一个控制器上的按钮,看到与前面看到的相同的行为。我们可以动态地将更新的设备添加到现有的系统中,而不需要做太多的工作和配置。

正如你在上面看到的,我们在设置中添加了一个设备,当按下它上的开关时,LED变成绿色,而在之前已有的设备上LED变成红色。我们按下之前设置的开关,这三种设备都实现了功能。

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250