我的开发环境:MicroPython v1.23.0 on 2024-06-02; Generic ESP32S3 module with Octal-SPIRAM with ESP32S3;
使用官方DEMO: 使用 ESP32 + MicroPython 连接 | EMQX Platform 文档测试不成功,在网上搜索了很多代码也不成功。
直接连接1883端口是可以的,但用证书连接8883总是出现各种问题。可能是最新版本umqtt raw.githubusercontent.com/micropython/micropython-lib/master/micropython/umqtt.simple/umqtt/simple.py的问题。
有对 CA 进行设置么?
如果连接的是 Public Broker: 免费的公共 MQTT 服务器 | EMQ 需要下载 CA 证书。
请参考:
使用 ESP32 + MicroPython 连接 | EMQX Platform 文档
import json
import random
import ssl
import time
from cwifi import wifi_content
from umqtt.simple import MQTTClient
SERVER = "tf9f2b9f.ala.cn-hangzhou.emqxsl.cn"
PORT = 8883
CLIENT_ID = 'micropython-client-{id}'.format(id=random.getrandbits(8))
USERNAME = 'a'
PASSWORD = 'a'
TOPIC = "raspberry/mqtt"
def on_message(topic, msg):
print("Received '{payload}' from topic '{topic}'\n".format(
payload = msg.decode(), topic = topic.decode()))
def connect():
with open('emqxsl-ca.crt', 'rb') as f:
cadata = f.read()
ssl_params = dict()
ssl_params["cert_reqs"] = ssl.CERT_REQUIRED
ssl_params["cadata"] = cadata
ssl_params["server_hostname"] = SERVER
client = MQTTClient(CLIENT_ID, SERVER, PORT, USERNAME, PASSWORD, ssl = True, ssl_params = ssl_params)
client.connect()
print('Connected to MQTT Broker "{server}"'.format(server = SERVER))
return client
def subscribe(client):
client.set_callback(on_message)
client.subscribe(TOPIC)
def loop_publish(client):
msg_count = 0
while True:
msg_dict = {
'msg': msg_count
}
msg = json.dumps(msg_dict)
result = client.publish(TOPIC, msg)
print("Send '{msg}' to topic '{topic}'".format(msg = msg, topic = TOPIC))
client.wait_msg()
msg_count += 1
time.sleep(1)
def run():
wifi_content()
client = connect()
subscribe(client)
loop_publish(client)
if __name__ == "__main__":
run()
错误信息:
Traceback (most recent call last):
File “”, line 56, in
File “”, line 51, in run
File “”, line 27, in connect
TypeError: unexpected keyword argument ‘ssl_params’
你最终解决了吗?是不是去掉这一项参数
解决了吗?问题基本一模一样
解决了吗?
都设置了还是不对
用的 cloud 服务器,可以直接开工单,有专人服务的。
以上代码试用于 1.2 之前版本,1.2 之后版本可以用如下:
"""
This script code is only available for version MicroPython v1.20 and above.
install umqtt.simple library:
$ micropython -m mpip install umqtt.simple
"""
import time
import ssl
from umqtt.simple import MQTTClient
SERVER = "broker.emqx.io"
PORT = 8883 # Standard port for MQTT over SSL
CLIENT_ID = f'micropython-{time.ticks_ms()}'
USERNAME = "emqx"
PASSWORD = "public"
TOPIC = b"emqx/micropython"
# Function to handle incoming messages
def sub_cb(topic, msg):
print(f"Received message '{msg.decode()}' on topic '{topic.decode()}'")
def main():
# Create an SSL context
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
# Disable certificate verification
ssl_context.verify_mode = ssl.CERT_NONE
# Create an MQTT client instance
client = MQTTClient(CLIENT_ID, SERVER, PORT, USERNAME, PASSWORD, ssl=ssl_context, keepalive=120)
client.set_callback(sub_cb)
# Connect to the MQTT broker
try:
client.connect()
print(f"Connected to MQTT Broker '{SERVER}'")
except Exception as e:
print(f"Failed to connect to MQTT broker: {e}")
return
# Subscribe to the desired topic
client.subscribe(TOPIC)
try:
while True:
# Wait for incoming messages
client.wait_msg()
time.sleep(1)
except KeyboardInterrupt:
print("Disconnected from MQTT broker")
client.disconnect()
if __name__ == "__main__":
main()