gpt4 book ai didi

python paho mqtt无法使用用户名和密码连接到mqtts

转载 作者:行者123 更新时间:2023-12-05 00:45:54 27 4
gpt4 key购买 nike

我的 raspberrypi 上的以下 python 代码没有连接到我的 mqtt 代理,它只是在打印 Connecting... 后挂起:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("test")


def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))


client = mqtt.Client(client_id="",clean_session=True,userdata=None,protocol=mqtt.MQTTv311,transport="tcp")
client.on_connect = on_connect
client.on_message = on_message

client.username_pw_set(username="stackoverflow",password="stackoverflow")
print("Connecting...")
client.connect("learn.evermight.net", 9101, 10)
client.loop_forever()

我的 Python 代码做错了什么?


命令行成功

我确认我的 mqtt 确实有效,因为我可以使用以下命令从终端订阅:

mosquitto_sub -h learn.evermight.net -p 9101 -t "test" -u "stackoverflow" -P "stackoverflow" --capath /etc/ssl/certs/

一旦我从另一个终端运行此命令,我就会在我的终端中看到消息

mosquitto_pub -h learn.evermight.net -p 9101 -t "test" -u "stackoverflow" -P "stackoverflow" -m "hello world" --capath /etc/ssl/certs/

我的 python 代码有什么问题?


NodeJS 成功

此外,以下 NodeJS 代码也可用于连接和发布到我的 MQTT 服务器。

const mqtt = require('async-mqtt');

try{
const client = await mqtt.connectAsync("mqtts://learn.evermight.net",{
port:9101,
host:"mqtts://learn.evermight.net",
username:"stackoverflow",
password:"stackoverflow",
connectTimeout:5000,
protocolId:"MQIsdp",
protocolVersion:3,
encoding:"utf8",
keepalive: 60
});
await client.publish("test","hello world");
await client.end();
} catch(e) {
console.log(e);
}

网站 JavaScript 成功

而且下面的代码也可以通过网页浏览器javascript网站连接到websocket端口,订阅test主题并接收发布的消息(注意我的websockets使用端口9102)

import Paho from "paho-mqtt";

const client = new Paho.Client("learn.evermight.net",9102,"WebBrowser");
client.onConnectionLost = response=>console.log("lostMQTTConnection: " +(response.errorCode !== 0 ? response.errorMessage : "Unknown MQTT Error" ));
client.onMessageArrived = message=>console.log(message.payloadString);
client.connect({
onSuccess:_=>client.subscribe("test"),
useSSL:true,
userName:"stackoverflow",
password:"stackoverflow",
});

最佳答案

我发现如果我添加这个不带参数的命令,我可以连接

client.tls_set()

paho documentationtls_set() 的描述末尾,您可以看到

Must be called before connect*().

但即使在 client.connect()

之后它也对我有用

在同一个文档中,您可以看到没有参数它使用默认的系统设置

By default, on Python 2.7.9+ or 3.4+,  
the default certification authority of the system is used.

On older Python version this parameter is mandatory.

仅当 mosquitto_sub/mosquitto_pub 需要 --capath/etc/ssl/certs/ 时才需要。
如果 mosquitto_sub/mosquitto_pub 可以在没有 --capath/etc/ssl/certs/ 的情况下工作,那么不要使用它。


import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
print("Connected with result code", rc)
client.subscribe("test")

def on_message(client, userdata, msg):
print(msg.topic, msg.payload)


client = mqtt.Client(client_id="", clean_session=True, userdata=None, protocol=mqtt.MQTTv311, transport="tcp")
client.on_connect = on_connect
client.on_message = on_message

client.tls_set() # <--- even without arguments

client.username_pw_set(username="stackoverflow", password="stackoverflow")
print("Connecting...")
client.connect("learn.evermight.net", 9101, 10)
client.loop_forever()

关于python paho mqtt无法使用用户名和密码连接到mqtts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com