我正在尝试使用我使用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()
我想要订阅的主题是: '项目/ _project_id_ /主题/ _device_id _'
on_connect和on_subscribe方法中有一些逻辑。我知道代码不符合逻辑,但我只想在继续之前读取数据。
因此,当我在连接和订阅客户端期间发布事件时,我会假设on_message方法会运行,但没有任何反应。
我以前从未使用过MQTT或Google Cloud IoT,所以我可能会犯一些非常基本的错误。
修改
我设法通过更改为Google Cloud Pub子库(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)
消息到达时调用回调。
答案 0 :(得分:0)
设备主题只是一种方式,从设备到物联网核心。它不会发回消息。您还可以订阅配置主题,并通过IoT Core Admin SDK将消息发送回设备。
查看有关配置消息和报告状态的this guide。请注意,默认情况下代码示例在Java上,但是有Java,Node.js和Python的选项卡。
答案 1 :(得分:0)
我设法通过更改为Google Cloud Pub子库(https://cloud.google.com/pubsub/docs/reference/libraries)来获取邮件。必须为Google Cloud IoT创建订阅,并且必须将其连接到该主题。订阅是拉式的。
我的解决方案还不完善,但这是向前迈出的一步。这是我的代码:
<build>
<resources>
<resource>
<directory>src/main/locale</directory>
<filtering>true</filtering>
<targetPath>global</targetPath>
<includes>
<include>*.xml</include>
<include>*.config</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
邮件到达时会调用回调。