【问题标题】:Python AWS iot SDK subscriptionPython AWS 物联网 SDK 订阅
【发布时间】:2019-02-19 22:50:36
【问题描述】:

我在订阅某个主题时可能会遗漏一些东西,但不确定。下面是我的 iot python 订阅代码,它可以完美运行。 但是,如果我在没有订阅代码的情况下运行代码“myAWSIoTMQTTClient.subscribe("topic_1", 1, customCallback)" topic_1 已发布,但如果尝试从另一个 python 控制台访问订阅 topic_1,它只会返回 true,并且不会打印来自自定义回调的消息。只有在同一 python 控制台中同时保留订阅和发布时,它才能工作,但我尝试在单独的控制台中运行订阅和发布,然后它会引发错误。换句话说,我如何订阅已经创建的主题?

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import time
import argparse
import json

host = "XXXXXXXX.iot.us-east-2.amazonaws.com"
rootCAPath = "root-CA.crt"
certificatePath = "XXXXX.cert.pem"
privateKeyPath = "XXXXX.private.key"
port = 8883
clientId = "sdk-java"
topic = "topic_1"
message_to_print="aws aws_preethi"

def customCallback(client, userdata, message):
    print("Received a new message: ")
    print(message.payload)
    print("from topic: ")
    print(message.topic)
    print("--------------\n\n")


myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId)
myAWSIoTMQTTClient.configureEndpoint(host, port)
myAWSIoTMQTTClient.configureCredentials(rootCAPath, privateKeyPath, certificatePath)

# AWSIoTMQTTClient connection configuration
myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1)  # Infinite offline Publish queueing
myAWSIoTMQTTClient.configureDrainingFrequency(2)  # Draining: 2 Hz
myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10)  # 10 sec
myAWSIoTMQTTClient.configureMQTTOperationTimeout(5)  # 5 sec

# Connect and subscribe to AWS IoT
myAWSIoTMQTTClient.connect()
myAWSIoTMQTTClient.subscribe("topic_1", 1, customCallback)

# Publish to the same topic in a loop forever
loopCount = 0
while True:
    message = {}
    message['message'] = message_to_print
    message['sequence'] = loopCount
    messageJson = json.dumps(message)
    myAWSIoTMQTTClient.publish(topic, messageJson, 1)
    loopCount += 1
    time.sleep(10)

【问题讨论】:

  • 嘿,我就是这样做的,connect() 和 subscribe() 都返回“True”,但 subscribe 没有在终端屏幕上打印任何内容。我错过了什么吗?我的 customCallback() 和你的一样……

标签: python-3.x aws-sdk


【解决方案1】:

我相信您需要为每个正在运行的脚本实例使用唯一的 clientId 值,否则第二个正在运行的实例将断开第一个实例的连接。

来自此论坛帖子:https://forums.aws.amazon.com/thread.jspa?threadID=219513

MQTT 客户端 ID 与 AWS IoT 中的事物没有关联。 这些客户端 ID 纯粹是为了唯一标识 MQTT 连接。 关于 MQTT 客户端 ID 需要考虑的一件重要事情是它们需要 在您的 AWS 账户中的设备中是唯一的。如果你有客户 连接为“客户端 ID 1”,第二个客户端连接相同 ID ("client ID 1") 然后第一个客户端的连接将被强制 断开连接。这是保持客户端的 MQTT 规范的一个特性 产生多个 MQTT 会话的间歇性连接。

【讨论】:

    【解决方案2】:

    像下面这样:

    # Connect and subscribe to AWS IoT
    myAWSIoTMQTTClient.connect()
    
    # Publish to the same topic in a loop forever
    loopCount = 0
    while True:
        myAWSIoTMQTTClient.subscribe("topic_1", 1, customCallback)
        message = {}
        message['message'] = message_to_print
        message['sequence'] = loopCount
        messageJson = json.dumps(message)
        myAWSIoTMQTTClient.publish(topic, messageJson, 1)
        loopCount += 1
        time.sleep(1)
    

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2021-11-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2018-08-16
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多