ESP32-C6安全(SSL)MQTT服务点灯全套流程
本帖最后由 HonestQiao 于 2024-4-9 23:38 编辑在IoT物联网开发中,MQTT是不可或缺的一个好东西。通常情况下,我们会直接使用MQTT的1883端口进行连接,在一些对安全要求较高的场合,会需要使用基于TLS/SSL的安全连接。
下面就说一下在micropython中使用具体的步骤。
一、申请一个14天免费的只能用SSL连接的MQTT服务
申请网址:https://www.emqx.com/zh/cloud
注册后,直接新建一个部署,选择ServerLess即可:
最终得到一个开箱即用的安全MQTT服务:
然后到访问控制中,添加一个账号密码:
现在,可以使用你熟悉的MQTT客户端工具,如MQTTX来进行连接测试:
二、micropython编码
<blockquote>import mqtt
在上面的代码中,核心是ssl的设置:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.verify_mode = ssl.CERT_NONE简单起见,这里先分享不使用CA证书校验的方式,后续再分享使用证书校验。
另外,使用BLOCK_MODE设置是否阻塞模式,实际作用如下:
[*]阻塞模式:及时收到消息,但是程序会停在这里
[*]非租塞模式:检测的时候才会收到消息,但是程序不会停下
三、测试
用MQTTX或者其他客户端工具,如手机端的mqttdashboard,发送ON或者OFF到定义的主题即可:
运行mpy后,会收到消息,并根据消息ON、OFF来亮灭LED了
代码被吃了,重新发的试试:
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)
页:
[1]