我能够通过这样创建的MQTT客户端(使用paho python(将事件发布到我的云IOT注册表中的设备:
self.__client = mqtt.Client(client_id='projects/{}/locations/{}/registries/{}/devices/{}'.format(project_id,
cloud_region,
registry_id,
device_id))
现在我想知道我是否可以创建一个MQTT客户端,通过在注册表级别设置客户端id(即不指定设备id(来将事件发布到多个设备:
self.__client = mqtt.Client(client_id='projects/{}/locations/{}/registries/{}'.format(project_id,
cloud_region,
registry_id))
即使我已将CA证书添加到注册表,此客户端也无法连接。
我的问题是:单个MQTT客户端实例能否将事件发布到注册表中定义的一组设备?我应该使用网关吗?
不,不能像这样向注册表发送消息。
你想要做到这一点的方法是:1(像你说的那样使用网关,发送一条消息,然后将其传播到本地设备。或者2(使用DeviceManagerClient()
获取注册表中的设备列表,并对它们进行迭代,每个设备在循环中发送消息。
看看这个:https://cloud.google.com/iot/docs/samples/device-manager-samples#list_devices_in_a_registry
用于获取注册表中的设备列表。python代码段:
# project_id = 'YOUR_PROJECT_ID'
# cloud_region = 'us-central1'
# registry_id = 'your-registry-id'
print("Listing devices")
client = iot_v1.DeviceManagerClient()
registry_path = client.registry_path(project_id, cloud_region, registry_id)
devices = list(client.list_devices(request={"parent": registry_path}))
for device in devices:
print("Device: {} : {}".format(device.num_id, device.id))
return devices
因此,在for device in devices
循环中,您可以调用代码来获取MQTT客户端,并将您想要的消息发送到指定的设备。