Search code examples
google-cloud-platformmqttiotpaho

Google Cloud IoT - Single MQTT client instance for all devices in a registry


I am able to publish events to a device in my Cloud IOT Registry via an MQTT client created this way (using paho python):

self.__client = mqtt.Client(client_id='projects/{}/locations/{}/registries/{}/devices/{}'.format(project_id,
                                                                                                 cloud_region,
                                                                                                 registry_id,
                                                                                                 device_id))

Now I'm wondering if I can create an MQTT client being able to publish events to multiple devices by setting the client id at registry level (i.e. not specifying the device id):

        self.__client = mqtt.Client(client_id='projects/{}/locations/{}/registries/{}'.format(project_id,
                                                                                                     cloud_region,
                                                                                                     registry_id))

This client is not able to connect even if I've added a CA Certificate to the registry.

My question is: can a single MQTT Client instance publish events to a set of devices defined in a registry? Should I use a gateway instead?


Solution

  • No, you can't send messages to a registry like this.

    The way you'd want to do this is either 1) Use a gateway like you say, send one message then spread it to the devices locally. Or 2) Grab the list of devices in the registry using the DeviceManagerClient(), and iterate over them each sending each device the message in a loop.

    Check out this: https://cloud.google.com/iot/docs/samples/device-manager-samples#list_devices_in_a_registry

    For fetching the list of devices in a registry. Snippet for 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
    

    So in that for device in devices loop you can call your code to get the MQTT client and send the message you want to the specified device.