Paho MQTT客户端连接序列失效问题排查求助
AWS IoT MQTT连接问题排查(on_connect回调未触发)
我需要从伪传感器获取数据,使用Paho MQTT库向AWS发送MQTT消息。已实现相关代码,但on_connect回调未触发,connflag始终为False,控制台持续输出"waiting for connection...",无法正常发送数据,请求帮助排查原因。
代码如下:
import paho.mqtt.client as paho import os import socket import ssl from time import sleep from random import uniform from psuedoSensor import PseudoSensor connflag = False def on_connect(client, userdata, flags, rc): global connflag connflag = True print("Connection returned result: " + str(rc) ) def on_message(client, userdata, msg): print("Connected with status: {0}".format(response_code)) mqttc = paho.Client() mqttc.on_connect = on_connect mqttc.on_message = on_message awshost = "XXXXXXXXXXX.iot.ap-south-1.amazonaws.com" awsport = 8883 clientId = "Project_1" thingName = "Project_1" caPath = "C:/Project 1/aws-iot-rootCA.crt" certPath = "C:Project 1/cert.pem.crt" keyPath = "C:Project 1/privkey.pem" mqttc.tls_set(caPath, certPath, keyPath, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) mqttc.connect(awshost, awsport, keepalive=60) mqttc.loop_start() while 1==1: sleep(0.5) if connflag == True: for i in range(30): ps = PseudoSensor() h,t = ps.generate_values() mqttc.publish("temperature", t, qos=1) print("msg sent: temperature " + "%.2f" % t ) mqttc.publish("humidity", h, qos=1) print("msg sent: humidity " + "%.2f" % h ) else: print("waiting for connection...")
排查要点
- 证书路径错误:代码中
certPath和keyPath的路径写法错误,缺少盘符后的斜杠(正确格式应为C:/Project 1/cert.pem.crt和C:/Project 1/privkey.pem)。路径错误会直接导致TLS握手失败,无法建立连接。 - on_message函数存在未定义变量:该函数中使用了未定义的
response_code,虽然不直接影响连接,但触发回调时会抛出异常,可能干扰客户端正常运行。如果不需要接收消息,可直接删除该回调;若需要,修正为:def on_message(client, userdata, msg): print(f"收到消息: {msg.topic} -> {msg.payload.decode()}") - TLS版本兼容性:代码指定了
ssl.PROTOCOL_TLSv1_2,AWS IoT当前推荐使用TLS 1.3,可尝试改为ssl.PROTOCOL_TLS让客户端自动协商最高兼容版本。 - 设备与证书关联验证:确认AWS IoT控制台中Thing名称与代码中的
clientId/thingName一致,且所用证书已关联到该Thing,同时证书状态为激活。 - 网络连通性检查:验证设备能否访问AWS IoT端点,可通过
telnet XXXXXXXXXXX.iot.ap-south-1.amazonaws.com 8883测试8883端口是否畅通,避免防火墙或代理拦截。 - 添加日志回调排查细节:增加日志回调获取连接过程中的详细错误信息,帮助定位问题:
def on_log(client, userdata, level, buf): print("日志: ", buf) mqttc.on_log = on_log - 优化循环逻辑:当前代码在connflag为True后会进入30次发送循环,结束后回到主循环,但未处理连接断开的情况。同时建议将
PseudoSensor实例化移到循环外,避免重复创建对象:ps = PseudoSensor() while 1==1: sleep(0.5) if connflag == True: h,t = ps.generate_values() mqttc.publish("temperature", t, qos=1) print(f"msg sent: temperature {t:.2f}") mqttc.publish("humidity", h, qos=1) print(f"msg sent: humidity {h:.2f}") else: print("waiting for connection...")
内容的提问来源于stack exchange,提问作者curious_direwolf
相关产品推荐
相关产品推荐

