Google Cloud IoT使用Python订阅主题

时间:2018-03-29 16:12:09

标签: python google-cloud-platform mqtt subscribe google-cloud-iot

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

消息到达时调用回调。

2 个答案:

答案 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>

邮件到达时会调用回调。