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

约翰

我的 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 文档中,tls_set()您可以看到

Must be called before connect*().

但它对我有用 client.connect()


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

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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章