通过 HTTP 网桥发布

本部分介绍设备如何使用 HTTP 网桥与 Cloud IoT Core 通信。如需大致了解 HTTP 和 MQTT,请参阅协议

请务必参阅 API 文档,详细了解本部分中介绍的每种方法。

请在使用 HTTP 网桥之前完成以下步骤:

  • 设置一个或多个设备注册表,包括用于遥测事件的 Cloud Pub/Sub 主题
  • 创建设备

对设备进行身份验证

发送到 HTTP 网桥的每个请求都必须在标头中包含一个 JSON Web 令牌 (JWT)

curl -H 'authorization: Bearer JWT' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{device-id}/config?local_version=1'

设备的完整路径可以以设备 ID 或设备数字 ID 结尾。如需详细了解设备标识符,请参阅设备注册部分。

即使您快速连续发送多个请求,每个请求也必须包含 JWT。Cloud IoT Core 不会“记住”HTTP 网桥上的身份验证。如需详细了解身份验证和 JWT,请参阅有关设备安全设备凭据的部分。

发布遥测事件

使用 publishEvent 方法将遥测事件发布到 Cloud IoT Core。二进制载荷数据必须采用 base64 编码。

curl -X POST -H 'authorization: Bearer JWT' -H 'content-type: application/json' --data '{"binary_data": "DATA"}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{device-id}:publishEvent'

遥测事件将转发到 Cloud Pub/Sub 主题,此主题在控制台或设备注册表资源中使用 eventNotificationConfigs[i].pubsubTopicName 字段指定。publishEvent 方法提供可选的 subFolder 字段,用于对遥测事件进行分类。如需了解如何将子文件夹中的数据发布到单独的 Pub/Sub 主题,请参阅下面的部分

将遥测事件发布到单独的 Pub/Sub 主题

设备可以通过在 publishEvent 方法的 subFolder 字段中指定子文件夹将数据发布到单独的 Pub/Sub 主题。

curl -X POST -H 'authorization: Bearer JWT' -H 'content-type: application/json' --data '{"binary_data": "DATA", "sub_folder": "SUBFOLDER"}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{device-id}:publishEvent'

必须在设备注册表资源的 eventNotificationConfigs.subfolderMatches 字段中配置此子文件夹,并在 eventNotificationConfigs.pubsubTopicName 字段中使用匹配的 Pub/Sub 主题。数据发送到子文件夹后,系统会将其发布到子文件夹的匹配 Pub/Sub 主题。

创建设备注册表中所述,所有设备注册表都应有一个默认 Pub/Sub 主题(没有匹配的子文件夹)。如果存在默认 Pub/Sub 主题,则设备会自动在以下情况下发布到该主题:

  • subFolder 字段中未指定子文件夹
  • subFolder 字段中指定了子文件夹,但它在设备注册表中没有匹配的 Pub/Sub 主题

在上述每种情况下,如果不存在默认的 Pub/Sub 主题,则从设备发送的数据将丢失。

过多的负载和指数退避算法

Cloud IoT Core 会限制生成过多负载的项目。如果设备在未等待的情况下重试失败的操作,则可能会触发限制,影响同一 Google Cloud 项目中的所有设备。

对于重试,我们强烈建议您使用引入的抖动实现截断指数退避算法

配置设备

您可以使用 Cloud IoT Core 配置设备。设备配置包含二进制数据,可用于更新固件、重新启动设备、开启功能或更改其他属性。

如需使用 HTTP 网桥配置设备,请先在 Cloud IoT Core 中定义配置,然后通过设备请求配置。

压缩 HTTP 请求

设备可以通过 HTTP 网桥向 Cloud IoT Core 发送经过 gzip 压缩的数据。为了向 Cloud IoT Core 发送压缩数据,每个 HTTP 请求都必须包含 content-encoding: gzip HTTP 标头。

通过压缩数据,您可以降低设备到云端的带宽。但是,您无法通过压缩数据来降低总的 Cloud IoT Core 使用费。如需了解详情,请参阅价格

更新设备配置

使用 HTTP 网桥时,设备必须通过 API 明确请求设备配置。Cloud IoT Core 不会通过 HTTP 网桥将配置推送到设备;设备必须轮询新配置。

要获取 Cloud IoT Core 中当前可用的设备配置,请使用 getConfig 请求。

curl -H 'authorization: Bearer JWT' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{deviceid}/config?local_version=0'

您可以使用 localVersion 查询参数指定当前存在于设备上的配置版本。下表显示了此参数如何影响响应:

设备版本 API 响应
localVersion 为 0(默认值) 来自 Cloud IoT Core 的最新版本
localVersion 为非零值,且等于当前 Cloud IoT Core 提供的版本 OKbinary_data 字段中的配置为空)
localVersion 为非零值,并且低于当前 Cloud IoT Core 提供的版本 来自 Cloud IoT Core 的当前(较新)版本
localVersion 为非零值,且高于当前 Cloud IoT Core 提供的版本 OUT_OF_RANGE 错误

设置设备状态

使用 setState 请求向 Cloud IoT Core 报告设备状态。状态数据必须采用 base64 编码。

curl -X POST -H 'authorization: Bearer JWT' -H 'content-type: application/json' --data '{"state": {"binary_data": "DATA"}}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{deviceid}:setState'

如需检索设备状态数据,请在 Cloud Console 中查看设备详细信息或使用 API。如需了解详情,请参阅设备状态部分。