Can a Google cloud function subscribe to an MQTT topic? - google-cloud-platform

I am trying to listen to the MQTT commands topic. I am publishing messages to the MQTT commands topic through the Google IoT Core function sendCommandToDevice. Is there a way to use a Google cloud function to listen to the MQTT commands topic?
Here is the link to the documentation for the sendCommandToDevice function https://cloud.google.com/iot/docs/reference/cloudiot/rest/v1/projects.locations.registries.devices/sendCommandToDevice

You can trigger a Cloud Function from a message published to the IoT Core MQTT bridge.
Cloud Functions can be triggered via Google Cloud Pub/Sub Triggers. The IoT Core MQTT bridge actually forwards messages to Cloud Pub/Sub. By default, it forwards messages to the default telemetry topic specified when creating a device registry. Note: it is possible to configure multiple topics as well.
Putting this together, when you create a Cloud Function, you will then configure a the Cloud Pub/Sub trigger using the Pub/Sub topic associated with your device registry as described above.

Related

Google IoT Core - How to subscribe to a topic

I have developed a device that is able to connect to Google IoT Core through the MQTT protocol, I can publish MQTT messages on telemetry topics (/devices/DEVICE_ID/events).
But I can't figure out how to subscribe my device to a generic topic and send messages from cloud to device via this topic.
Through the console I created the topic MyTestTopic and a subscription MyTestTopic-sub, I guess that somehow I have to subscribe my device to the subscription MyTestTopic-sub, but I don't know to which topic I have to subscribe my device.
I tried to subscribe my device to the following topics:
projects/PROJECT_ID/topics/MyTestTopic
projects/PROJECT_ID/topics/MyTestTopic-sub
/devices/DEVICE_ID/events/MyTestTopic
/devices/DEVICE_ID/events/MyTestTopic-sub
the subscription to these topics seems to be successful, but the device does not receive the messages I send from the console.
Any suggestions please?
I found this thread (Google Cloud IoT - Invalid MQTT publish topic) from 4 years ago, from which I understand that it is possible to subscribe only to some predefined topics, also from the various documents I have read I understand that Google IoT Core allows devices to subscribe to only two topics: /devices/{device-id}/config and /devices/{device-id}/commands/#
Has anything changed since then?
So to be clear, there are two different "topics" in play here. There's the MQTT topics that are described in the docs you found, config and commands. Those are subscribed to on the device using an MQTT client (e.g. Paho MQTT), and sent down to the device from somewhere else via the IoT Core Admin APIs. Then there's Pub/Sub topics. Out of the box, a device using IoT Core does not directly interact with Pub/Sub at all. They publish/receive via the MQTT topics only. So if you register a device with IoT Core, all messages come and go via the MQTT bridge (or HTTPS).
What Gambit support linked to in that github repo is a direct subscription to a Pub/Sub topic (not MQTT). If you look at the Python code, it's establishing proper Google Cloud Credentials via a json token (service account bearer token) that needs to be present on the device or a proxy device. Depending on the device you're using, that may not be possible of course (implementing GCP APIs on a microcontroller is difficult at best).
The easiest way I've seen this done is to implement a Cloud Function that subscribes to a Pub/Sub topic you want to use, and it implements the proper IoT Core Admin calls to push the Pub/Sub messages down to the device as needed. But of course, it all depends on what you're trying to do.

In Google Cloud Platform, is it require for each IOT Core device to have separate pub/sub topic?

I am publishing ESP data to Google Cloud IOT via MQTT to a particular topic. But If I have many devices data, then is it necessary to create different topic for each device? If Yes, then how can I trigger a single cloud function for multiple topics.
I couldn't find it anywhere on the Google Cloud Platform Documentation. So please help me!.
No, the message contain the attributes of your device. Like this, you can know the context of the message and process all the messages by the same Cloud Functions.

Google Cloud IoT- How to publish to the same topic with multiple IoT devices and process it by cloud functions

In my project multiple IoT devices need to publish to a single topic and cloud functions listening to that topic need to process data published by IoT devices. Multiple devices should be able to publish at the same time.A MQTT broker logic is needed. But in Google IoT Core "The MQTT bridge allows only a single connection for a given device ID. If a second device connects with the ID of a device that is already connected, the older device connection will be closed automatically.".
I am new to google cloud IoT and trying to understand basic concepts. I have looked into gateways but I am not sure that gateways work as broker. Can multiple devices publish through a gateway to a same single topic? or should I implement/add a MQTT broker(mosquitto I guess) myself or is there an another way to use google Cloud IoT in my case? Could you guys direct me to the right direction. Opening sub/pub topics for each device doesn't sound right because in my project there can be thousands of IoT devices.
Let all the devices in the registry publish messages to the common topic given to the registry.Then trigger a cloud function with this topic.
You can process the messages with cloud function based on the deviceId

How to publish to an IoT MQTT topic from a Lambda

I'm attempting to trigger an IoT event via Alexa. I've created an Alexa skill which triggers a Lambda written in Go, which publishes an event to SNS. However, I can't see of a way to get an IoT device to listen to an SNS event.
Similarly, there doesn't seem to be a Go library for IoT, so I can't get the Lambda to interact directly with the IoT MQTT protocol as a client either.
I just wondered if I'd need to re-write my Lambda as a JS Lambda for the purposes of interacting with the IoT core, or if there was a better way to trigger an IoT event from a Lambda?
You should be able to publish to an IoT topic from within your Lambda function via the IoTDataPlane.Publish method in the AWS SDK for Go.

How to publish message from AWS IoT to another host?

I would like to publish message from Amazon IoT to another host. In Amazon IoT there is MQTT client which have publish and subscribe functionalities. But as far as I know of MQTT client it can publish and subscribe with in Amazon only. I also checked aws iot commands. They don't provide commands for publish and subscribe. Can anyone suggest a way to publish messages from Amazon IoT to another host?