HonestQiao 发表于 2024-4-9 23:36:47

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了




HonestQiao 发表于 2024-4-9 23:39:59

代码被吃了,重新发的试试:


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]
查看完整版本: ESP32-C6安全(SSL)MQTT服务点灯全套流程