Python AWS iot SDK подписка - PullRequest
       14

Python AWS iot SDK подписка

0 голосов
/ 11 ноября 2018

Я могу что-то упустить при подписке на тему, но не уверен. Ниже приведен мой код подписки на iot python, который работает отлично. однако, если я запускаю код без кода подписки "myAWSIoTMQTTClient.subscribe (" topic_1 ", 1, customCallback)" topic_1 публикуется, но если попытаться получить доступ для подписки topic_1 с другой консоли python, он просто возвращает true и не печатает сообщение из пользовательского обратного вызова. попробуйте запустить подписку и опубликовать в отдельной консоли, а затем выдает ошибку. другими словами, как я могу подписаться на тему, которая уже создана?

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)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

сделайте это следующим образом:

# 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)
0 голосов
/ 21 декабря 2018

Полагаю, вам нужно использовать уникальное значение clientId для каждого запущенного экземпляра сценария, в противном случае второй запущенный экземпляр отключит первый экземпляр.

Из этого сообщения на форуме: https://forums.aws.amazon.com/thread.jspa?threadID=219513

Идентификаторы клиента MQTT не связаны с Thing в AWS IoT.Эти идентификаторы клиента предназначены исключительно для уникальной идентификации соединения MQTT.Важно учитывать идентификаторы клиентов MQTT, которые должны быть уникальными для всех устройств в вашей учетной записи AWS.Если у вас есть клиент, подключенный как «идентификатор клиента 1», а второй клиент подключается с тем же идентификатором («идентификатор клиента 1»), то подключение первого клиента будет принудительно отключено.Это особенность спецификации MQTT, которая защищает клиента с прерывистой связью от запуска нескольких сеансов MQTT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...