ESP32-C6安全(SSL)MQTT服务点灯全套流程

2024-04-093543
AI 快速预览详细 收起
本文介绍了如何在micropython中实现ESP32-C6的安全MQTT连接。首先,你需要申请一个14天免费的只能用SSL连接的MQTT服务,如EMQX云服务。然后,在micropython中配置SSL上下文,设置验证模式为ssl.CERT_NONE。接下来,通过选择阻塞模式或非阻塞模式来控制消息接收的方式。最后,使用MQTTX或其他客户端工具发送ON或OFF消息到定义的主题,即可控制LED的亮灭。


在IoT物联网开发中,MQTT是不可或缺的一个好东西。通常情况下,我们会直接使用MQTT的1883端口进行连接,在一些对安全要求较高的场合,会需要使用基于TLS/SSL的安全连接。
下面就说一下在micropython中使用具体的步骤。

一、申请一个14天免费的只能用SSL连接的MQTT服务
申请网址:https://www.emqx.com/zh/cloud
ESP32-C6安全(SSL)MQTT服务点灯全套流程图1

注册后,直接新建一个部署,选择ServerLess即可:
ESP32-C6安全(SSL)MQTT服务点灯全套流程图2

最终得到一个开箱即用的安全MQTT服务:
ESP32-C6安全(SSL)MQTT服务点灯全套流程图3

然后到访问控制中,添加一个账号密码:
ESP32-C6安全(SSL)MQTT服务点灯全套流程图4

现在,可以使用你熟悉的MQTT客户端工具,如MQTTX来进行连接测试:
ESP32-C6安全(SSL)MQTT服务点灯全套流程图5

ESP32-C6安全(SSL)MQTT服务点灯全套流程图6

二、micropython编码
  1. <blockquote>import mqtt
复制代码


在上面的代码中,核心是ssl的设置:
  1. context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
  2. context.verify_mode = ssl.CERT_NONE
复制代码
简单起见,这里先分享不使用CA证书校验的方式,后续再分享使用证书校验。

另外,使用BLOCK_MODE设置是否阻塞模式,实际作用如下:
  • 阻塞模式:及时收到消息,但是程序会停在这里
  • 非租塞模式:检测的时候才会收到消息,但是程序不会停下


三、测试
用MQTTX或者其他客户端工具,如手机端的mqttdashboard,发送ON或者OFF到定义的主题即可:
ESP32-C6安全(SSL)MQTT服务点灯全套流程图7


运行mpy后,会收到消息,并根据消息ON、OFF来亮灭LED了
ESP32-C6安全(SSL)MQTT服务点灯全套流程图8



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
HonestQiao
HonestQiao
作者
代码被吃了,重新发的试试:
[code]
import mqtt
import network
import ssl
import time
import os
from machine import Pin
from umqtt.simple import MQTTClient
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('WiFi名称', '密码')
while not wlan.isconnected():
print("try connect...")
time.sleep(1)
print("connect ok")
CLIENT_ID = b'test_from_esp32c6'
MQTT_SERVER = 'p52a5af8.ala.cn-hangzhou.emqxsl.cn'
PORT = 8883
USERNAME = b'esp32c6'
PASSWORD = b'密码'
TOPIC = b'esp32c6/test'
BLOCK_MODE = True # 是否使用阻塞模式
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.verify_mode = ssl.CERT_NONE
try:
client = MQTTClient(client_id=CLIENT_ID, # something unique to identify device, ie machine.unique_id()
server= MQTT_SERVER,
port=PORT, # if port ==0 AND ssl=True -> port=8883 the secure mqtt port
user=USERNAME,
password=PASSWORD,
keepalive=7200,
ssl=context
)
client.connect()
print('Connected to %s MQTT Broker'%(MQTT_SERVER))
except OSError as e:
print('Failed to connect to the MQTT Broker.')
time.sleep(5)
machine.reset()
def get_msg(topic, msg):
print(msg)
if msg == b'ON':
led.value(True)
elif msg == b'OFF':
led.value(False)
led=Pin(15, Pin.OUT)
client.set_callback(get_msg)
client.subscribe(TOPIC)
counter = 0
while True:
try:
counter = counter + 1
print(counter)
if BLOCK_MODE:
client.wait_msg() # 阻塞
else:
client.check_msg() # 非租塞
time.sleep(1)
except Exception as e:
print(str(e))
time.sleep(2)
print('reconnect!')
client.connect()
# 断线之后要重新订阅
client.subscribe(TOPIC)
[/code]
- 没有更多了 -