【发布时间】:2020-06-19 23:15:55
【问题描述】:
我的 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",
});
【问题讨论】:
-
为什么你知道它是否挂起?
loop_forever()应该一直运行代码,直到你杀死它。 -
对我来说所有问题都可以是
--capath /etc/ssl/certs/。当我使用代理运行您的代码时,它会运行,当我运行mosquitto_pub而没有--capath /etc/ssl/certs/时,它也会运行,但当我使用--capath /etc/ssl/certs/时,我会得到Error: Connection refused。可能在代码中你必须使用类似于--capath /etc/ssl/certs/ -
@furas 我更新了我的代码,为我的 mqtt 服务器提供了真实的凭据,并在 bash、nodejs 和纯 JavaScript 中提供了真实的工作示例。唯一失败的是我的python代码。我的服务器是否适用于您的 python 脚本?
-
它不适用于 Python。它仅适用于
mosquitto_sub/mosquitto_pub,因此我可以连接。有命令client.tls_set()和client.tls_set_context(),也许他们可以提供帮助。但我从来不用它。我在本地网络中有自己的 MTTQ,所以我懒得使用certs