1

我正在尝试使用我使用 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_/topics/_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)

消息到达时调用回调。

4

2 回答 2

0

设备主题只是一种方式,从设备到 IoT 核心。它不会发回消息。您还可以订阅一个配置主题,并通过 IoT Core Admin SDK 将消息发送回设备。

查看有关配置消息和报告状态的本指南。请注意,代码示例默认使用 Java,但那里有 Java、Node.js 和 Python 的选项卡。

于 2018-04-03T15:06:11.007 回答
0

我设法通过更改为 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)

消息到达时调用回调。

于 2018-04-06T08:00:05.627 回答