【问题标题】:Not able to connect to AmazonMQ via MQTT protocol using Python(paho.mqtt.python) library无法使用 Python(paho.mqtt.python) 库通过 MQTT 协议连接到 AmazonMQ
【发布时间】:2020-12-22 11:47:58
【问题描述】:
import paho.mqtt.publish as publish
import paho.mqtt.client as mqtt

USERNAME = "admin-user"
PASSWORD = "admin-user@12345"
AUTH = {"username":USERNAME, "password":PASSWORD}
HOSTNAME = "ssl://b-c7d1ea8g-f777-4c71-23a3-2d73088fdb64-1.mq.us-west-2.amazonaws.com"
PORT = 8883
TOPICNAME = "paho/test/single"
PAYLOAD = "Hope Stackoverflow Help Me Resolve This Issue!"

publish.single(TOPICNAME, payload=PAYLOAD, hostname=HOSTNAME, port=PORT, auth=AUTH, protocol=mqtt.MQTTv311, transport="tcp", client_id="", keepalive=60, will=None) # This won't work
# publish.single(TOPICNAME, payload=PAYLOAD, hostname="localhost") # This works!

print('published message payload = ', PAYLOAD)

我可以使用 Java eclipse Paho 客户端连接到 AmazonMQ,但无法在 Python 中执行相同操作。它给了我一个错误“gaierror: [Errno -2] Name or service not known”。

上面的 python 代码可以与本地托管的 ActiveMQ MQTT 代理一起正常工作,也可以在我托管 ActiveMQ MQTT 代理的独立服务器中正常工作。但同样不适用于 AmazonMQ 代理。

Github Paho 的问题跟踪器中已经提到了这个问题,但仍然没有解决方案可以提供帮助。

【问题讨论】:

  • 你解决了这个问题吗?

标签: python activemq mqtt paho amazon-mq


【解决方案1】:

您需要从主机变量中删除“ssl://”,并设置一个 ssl 上下文,以便使用 paho 连接到 Amazon-MQ。

context = ssl.create_default_context()
client.tls_set_context(context=context)

这是发布在您的 github 问题上的示例的工作版本。

import paho.mqtt.client as mqttClient

import time
import ssl

context = ssl.create_default_context()

Connected = False 
broker_address= "b-xxxxxx-acbf-xxxx-xxxx-xxxxx-1.mq.us-east-1.amazonaws.com" # No ssl://
port = 8883
user = "xxxxxx"
password = "xxxxx"

def on_connect(client, userdata, flags, rc):

    if rc == 0:
        print("Connected to broker")
        global Connected                #Use global variable
        Connected = True                #Signal connection  
        client.subscribe("test/data")
    else:
        print("Connection failed")

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

client = mqttClient.Client("Test") #create new instance
client.username_pw_set(user, password=password) #set username and password
client.on_connect=on_connect
client.on_message=on_message
client.tls_set_context(context=context)
client.connect(broker_address, port=port)
client.loop_start()

while Connected != True:
    time.sleep(0.1)

client.publish("test/data", "This is my test msg 123.")
time.sleep(10)

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2020-11-07
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多