Google Cloud IoT Подпишитесь на тему с помощью Python

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

Проблема в том, что подписка всегда кажется успешной, но события не извлекаются.

Я могу подключиться к брокеру с помощью клиента MQTT.

Вот мой текущий код, обрабатывающий подключение и подписку:

broker_address= "mqtt.googleapis.com"
port = 8883
client = mqtt.Client(client_id='projects/<project_id>/locations/<location>/registries/<registry_id>/devices/<device_id>',
        protocol=4)
password=create_jwt(...) #works
client.username_pw_set(username='unused',password=password)
client.tls_set(ca_certs=<route_to_cert>, tls_version=ssl.PROTOCOL_TLSv1_2)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.connect(broker_address, port)
client.loop_start()
while connected_flag == 0: #changed in "on_connect" method
    print("Wait until connected ", connected_flag)
    time.sleep(1)
print("Connected")
topic = 'projects/<project_id>/topics/<device_id>'
client.subscribe(topic)
while subscribed_flag == 0: #changed in "on_subscribe" method
    time.sleep(1)
time.sleep(5)
client.loop_stop()  
client.disconnect()

Тема, на которую я пытаюсь подписаться: 'projects / _project_id_ / themes / _device_id_'.

Некоторая логика есть в методах on_connect и on_subscribe. И я знаю, что код нелогичен как есть, но я просто хочу прочитать данные, прежде чем продолжить.

Итак, когда я публикую событие в то время, когда клиент подключен и подписан, я предполагаю, что метод on_message будет запущен, но ничего не происходит.

Я никогда раньше не использовал MQTT или Google Cloud IoT, поэтому могу совершить очень простую ошибку.


ИЗМЕНИТЬ

Мне удалось получить сообщения, перейдя на библиотеки Google Cloud Pub Sub (https://cloud.google.com/pubsub/docs/reference/libraries). Необходимо было создать подписку на Google Cloud IoT и подключить ее к теме. Подписка по запросу.

Мое решение еще не идеально, но это шаг вперед. Вот мой код:

from google.cloud import pubsub;
subscriber = pubsub.SubscriberClient()
subscription_path = subscriber.subscription_path(<project_id>, <subscription_name>)
def callback(message):
    print(message.data)
subscriber.subscribe(subscription_path, callback=callback)

Обратный вызов вызывается при поступлении сообщения.


person StuckForTooLong    schedule 29.03.2018    source источник
comment
Я тоже занимаюсь этой проблемой ... Документация плохо связана с такого рода информацией ... кстати, как ваш on_message код?   -  person Dalton Cézane    schedule 04.04.2018
comment
Мне удалось получить сообщения с помощью библиотеки Google Pub Sub (cloud.google.com/pubsub/ docs / reference / libraries). Я обновлю вопрос своим новым кодом, который извлекает сообщения из темы.   -  person StuckForTooLong    schedule 05.04.2018
comment
Я хочу получать уведомления о подписке с использованием моего собственного кода, без google pub / sub lib ...   -  person Dalton Cézane    schedule 05.04.2018
comment
Поместите отредактированный текст как ответ и отметьте его как ответ.   -  person Dalton Cézane    schedule 06.04.2018


Ответы (2)


Тема устройств - только в одну сторону, от устройства к IoT Core. Он не будет отправлять сообщения обратно. Есть тема конфигурации, на которую вы также можете подписаться и отправлять сообщения обратно на устройство через IoT Core Admin SDK.

Ознакомьтесь с этим руководством по сообщениям конфигурации и состоянию отчетов. . Обратите внимание, что пример кода по умолчанию написан на Java, но там есть вкладки для Java, Node.js и Python.

person Gabe Weiss    schedule 03.04.2018

Мне удалось получить сообщения, перейдя на библиотеки Google Cloud Pub Sub (https://cloud.google.com/pubsub/docs/reference/libraries). Необходимо было создать подписку на Google Cloud IoT и подключить ее к теме. Подписка по запросу.

Мое решение еще не идеально, но это шаг вперед. Вот мой код:

from google.cloud import pubsub;
subscriber = pubsub.SubscriberClient()
subscription_path = subscriber.subscription_path(<project_id>, 
<subscription_name>)
    def callback(message):
print(message.data)
subscriber.subscribe(subscription_path, callback=callback)

Обратный вызов вызывается при поступлении сообщения.

person StuckForTooLong    schedule 06.04.2018