在 Google Cloud IoT Core 中创建客户端的两种方式有什么区别?

What's the difference between the two ways of creating client in Google Cloud IoT Core?

为了在 Google Cloud IoT Core 中创建客户端,我最初只使用:

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

不过,在许多文档代码示例中,我看到使用了下面给出的这种方式和另一种方式:

client = get_client(service_account_json)

为了能够使用上面的内容,我必须生成另一个 JSON 密钥。无法理解两个客户之间的本质区别是什么。另外,我使用了第二种方式来获取设备的状态。

第一种方法是using the MQTT bridge

第二个是基于不同的 API 使用不同的访问方法。来自 Getting device state data:

This sample uses the Google API Client Library for Python.

client = get_client(service_account_json)

这些来自两个不同的 API。一个是客户端(本身没有 API,它只是设备 [客户端] 用来连接到 IoT Core 的方法),另一个是 IoT Core 管理端。

MQTT bridge 用于将设备连接到 IoT Core 以发送遥测数据。那是您第一个片段中的 mqtt 客户端代码。没有 API 设备可以连接以发送遥测数据,IoT Core 只是一个 MQTT(或 HTTP)端点。在上面的例子中,您可能还获得了执行 client.publish 到 mqtt.googleapis.com:8883 的代码。通过 MQTT 将设备连接到 IoT Core。

第二个是调用 IoT Core Admin SDK 时需要使用的。例如,如果您有一个脚本想要 update the config 在由 IoT Core 控制的设备上。

您必须生成的 JSON 密钥用于通过 API 服务进行身份验证。有关于身份验证片的详细信息 here。在使用 MQTT 的设备中,没有 API 身份验证,它在该实例中使用 JWT 进行身份验证,但对于管理 SDK,您需要使用 Cloud Project 进行身份验证才能发出这些类型的管理命令。

所以 TL;DR,在您的第一个片段中,这是您正在创建的 MQTT 客户端。在第二个片段中,它是一个 Google Cloud Project (GCP) 客户端。第一个用于向 IoT Core 发送数据的设备,第二个用于向 GCP 发出管理类型调用。