Skip to main content

将 Wio Terminal 连接到 Google Cloud IoT Core

pir

可升级为工业传感器

通过 SenseCAP S2110 控制器S2100 数据记录仪,您可以轻松将 Grove 转变为 LoRaWAN® 传感器。Seeed 不仅帮助您完成原型设计,还为您提供使用 SenseCAP 系列坚固的工业传感器扩展项目的可能性。

IP66 外壳、蓝牙配置、与全球 LoRaWAN® 网络的兼容性、内置 19 Ah 电池以及来自 APP 的强大支持,使得 SenseCAP S210x 成为工业应用的最佳选择。该系列包括土壤湿度、空气温湿度、光强、CO2、EC 传感器以及一款 8 合 1 气象站。尝试最新的 SenseCAP S210x,为您的下一个工业项目取得成功。

SenseCAP 工业传感器
S2100
数据记录仪
S2101
空气温湿度
S2102
光强
S2103
空气温湿度 & CO2
S2104
土壤湿度 & 温度
S2105
土壤湿度 & 温度 & EC
S2110
LoRaWAN® 控制器
S2120
8 合 1 气象站

介绍

在本教程中,我们将引导您完成将 Wio Terminal 连接到 Google Cloud IoT Core 的过程,并将遥测数据从 Wio Terminal 发送到 Google Cloud IoT Core。教程分为两个部分,第一部分将介绍如何使用现有的库来发送代码中预配置的遥测数据,而第二部分将介绍如何将您自己的传感器添加到 Wio Terminal 上,并将遥测数据发送到 Google Cloud IoT Core。Google Cloud IoT Core 支持 HTTP 和 MQTT 协议进行通信,但在本教程中我们将使用 MQTT 协议。

什么是 Google Cloud?

Google Cloud 包括一组物理资产(如计算机和硬盘驱动器)以及虚拟资源(如虚拟机 (VM)),这些资源分布在 Google 全球的数据中心中。这种资源分布带来了多种优势,包括在发生故障时的冗余性,以及通过将资源定位在更靠近客户端的位置来减少延迟。

在云计算中,您可能习惯于将软件和硬件产品视为服务。这些服务提供对底层资源的访问。Google Cloud 提供的服务列表 很长,并且还在不断增长。当您在 Google Cloud 上开发网站或应用程序时,您可以将这些服务组合成满足您基础设施需求的组合,然后添加您的代码以实现您想要构建的场景。

什么是 Google Cloud Platform?

Google Cloud Platform (GCP) 是一组云计算服务的集合。通过一系列管理工具,它提供了一系列模块化的云服务,包括计算、数据存储、数据分析和机器学习。它提供基础设施即服务 (IaaS)、平台即服务 (PaaS) 和无服务器计算环境。

什么是 Google Cloud IoT Core?

Google Cloud Internet of Things (IoT) Core 是一项完全托管的服务,用于安全地连接和管理 IoT 设备,从少量设备到数百万台设备。它可以从连接的设备中摄取数据,并构建与 Google Cloud Platform 的其他大数据服务集成的丰富应用程序。

什么是 Google Cloud Console?

Google Cloud Console 提供了一个基于 Web 的图形用户界面,您可以使用它来管理 Google Cloud Platform 的资源。在使用 Cloud Console 时,您可以创建一个新项目或选择一个现有项目,并在该项目的上下文中使用您创建的资源。您可以创建多个项目,因此可以根据自己的需求使用项目来分隔工作。例如,如果您希望确保只有某些团队成员可以访问某个项目中的资源,而所有团队成员都可以继续访问另一个项目中的资源,则可以启动一个新项目。

将 Wio Terminal 连接到 Google Cloud IoT Core(通过 MQTT)

如前所述,我们将使用可用的 MQTT 桥接来实现 Wio Terminal 与 Google Cloud IoT Core 之间的通信。不过,如果需要,也可以使用 HTTP 桥接。

pir

Google Cloud 控制台设置

首先,我们需要访问 Google Cloud 控制台,创建一个 Cloud IoT Core 设备注册表并注册一个设备。

初始设置

  • 步骤 1: 访问 此处 创建一个新项目

注意: 如果提示,请登录您的 Google 账户

  • 步骤 2: 点击 选择项目 菜单

  • 步骤 3: 点击 新建项目 并输入一个 项目名称

  • 步骤 4: 点击 创建

  • 步骤 5: 为您的云项目启用计费。这是为了确保您不是机器人,并且不会被收费。在导航菜单中选择“计费”,并完成设置。

pir

  • 步骤 6: 访问 此处 启用 Cloud IoT Core 和 Cloud Pub/Sub API

注意: 从下拉菜单中选择您之前创建的项目

创建设备注册表

  • 步骤 1: 访问 Cloud 控制台中的 Google Cloud IoT Core 页面

  • 步骤 2: 点击 创建注册表

  • 步骤 3: 输入一个 注册表 ID

注意: 这是您的注册表名称

  • 步骤 4: 选择一个 区域

注意: 如果您在美国,请选择 us-central1 作为区域。如果您在美国以外,请选择您首选的区域。

  • 步骤 5:选择一个 Cloud Pub/Sub 主题 下拉列表中,选择 创建主题 并输入您首选的 主题 ID

  • 步骤 6: 点击 创建主题

  • 步骤 7: 点击 显示高级选项

  • 步骤 8: 设备状态主题证书值 字段是可选的,因此保持为空

  • 步骤 9:协议 选择 MQTT

  • 步骤 10: 在 Cloud IoT Core 页面上点击 创建

现在我们已经创建了一个设备注册表,并为发布设备遥测事件创建了一个 Cloud Pub/Sub 主题。

生成设备密钥对(EC 密钥)

Cloud IoT Core 使用公钥(或非对称)认证。

  • 设备使用私钥签署 JSON Web Token (JWT)。该令牌作为设备身份的证明传递给 Cloud IoT Core。
  • 服务使用设备的公钥(在发送 JWT 之前上传)来验证设备的身份。

Cloud IoT Core 支持 RSA 和椭圆曲线算法,在本教程中我们将使用椭圆曲线密钥。

  • 步骤 1: 在您的电脑上创建一个新文件夹

  • 步骤 2: 从终端窗口导航到该文件夹,并输入以下命令以生成 P-256 椭圆曲线密钥对

openssl ecparam -genkey -name prime256v1 -noout -out ec_private.pem
openssl ec -in ec_private.pem -pubout -out ec_public.pem

注意: 请确保通过 此链接 安装 openssl,并将目录位置添加到 PATH。

上述命令将创建以下公钥/私钥对:

  • ec_private.pem:必须安全存储在设备上的私钥,用于签署认证 JWT。
  • ec_public.pem:必须存储在 Cloud IoT Core 中的公钥,用于验证认证 JWT 的签名。

提取私钥

我们需要提取私钥字节,并将其复制到稍后将在本教程中创建的 Arduino 项目中的私钥字符串中。现在保存这些密钥以备后用。

  • 步骤 1: 打开一个终端窗口,导航到我们之前生成椭圆曲线密钥对的文件夹。

  • 步骤 2: 输入以下命令

openssl ec -in ec_private.pem -noout -text
  • 步骤 3: 将生成的私钥字节(位于 priv: 下)复制并粘贴到记事本中保存,以备后用。

将设备添加到注册表

  • 步骤 1: 访问 注册表页面,并选择您之前创建的注册表

  • 步骤 2: 选择 设备 标签并点击 创建设备

  • 步骤 3: 输入一个 设备 ID

  • 步骤 4: 设备元数据 字段是可选的,因此保持为空

  • 步骤 5: 点击 通信、云日志记录、认证 下拉菜单

  • 步骤 6:设备通信 选择 允许

  • 步骤 7:认证 字段中,在 输入方法 下选择 上传

  • 步骤 8:公钥格式 下拉菜单中选择 ES256

  • 步骤 9:公钥值 下,点击 浏览 按钮,导航到我们之前创建的 椭圆曲线密钥对 文件夹,并选择 ec_public.pem

  • 步骤 10: 点击 创建

现在您已将设备添加到注册表中。设备的 ES256 密钥会显示在设备的详细信息页面上。

设置订阅者

现在我们已经创建了一个设备注册表、一个主题并将设备添加到该注册表中,接下来我们将创建一个订阅者,以订阅我们创建的主题,从而获取来自 Wio Terminal 的遥测数据。

  • 步骤 1: 在 Google Cloud 控制台的搜索栏中输入 Pub,并从结果中选择 Pub/Sub

pir

  • 步骤 2: 点击导航菜单中的 订阅

  • 步骤 3: 点击 CREATE SUBSCRIPTION(创建订阅)

  • 步骤 4: 输入一个您选择的 Subscription ID(订阅 ID)

  • 步骤 5:Select a Cloud Pub/Sub topic(选择一个 Cloud Pub/Sub 主题) 下拉菜单中选择我们之前创建的 Pub/Sub topic(主题)

  • 步骤 6: 选择 Pull 作为交付类型

  • 步骤 7: 点击 Create(创建)

现在我们已经完成了 Google Cloud IoT Core 的设置。接下来,我们将开始设置 Wio Terminal 和 Arduino IDE。

使用 Arduino 设置 Wio Terminal

所需库

本教程需要两个库。

  1. lwMQTT MQTT Arduino 库
  2. Google Cloud IoT Arduino 库

下载这些库的步骤如下:

  • 步骤 1: 打开 Arduino IDE
  • 步骤 2: 导航到 Sketch > Include Library > Manage Libraries
  • 步骤 3: 在搜索框中输入 lwMQTTGoogle Cloud IoT 并安装这些库

配置凭据和账户信息

现在我们需要在 ciotc_config.h 文件中设置 Wi-Fi 凭据和 Google Cloud IoT Core 信息。

  • 步骤 1: 在 Arduino IDE 中,导航到 File > Examples > Google Cloud IoT JWT > Esp32-lwmqtt

  • 步骤 2: 打开 ciotc_config.h

  • 步骤 3: 修改 Wi-Fi 网络详情

const char *ssid = "Enter_SSID";
const char *password = "Enter_Password";
  • 步骤 4: 修改 Google Cloud IoT 详情
const char *project_id = "Enter_Project_ID";
const char *location = "Enter_location";
const char *registry_id = "Enter_Registry_ID";
const char *device_id = "Enter_Device_ID";
  • 步骤 5: 复制我们之前从 ec_private.pem 文件中获取并保存到记事本中的私钥字节
const char *private_key_str =
"6e:b8:17:35:c7:fc:6b:d7:a9:cb:cb:49:7f:a0:67:"
"63:38:b0:90:57:57:e0:c0:9a:e8:6f:06:0c:d9:ee:"
"31:41";

注意: 密钥长度应为 32 对十六进制数字。

修改 NTP 时间方法

打开 esp32-mqtt.h 文件,并用以下代码替换整个文件。在这里,我们用通过 UDP 获取 NTP 时间的实现替换了 configTime 函数。

#include <Client.h>
#include <rpcWiFi.h>
#include <WiFiClientSecure.h>

#include <MQTT.h>

#include <CloudIoTCore.h>
#include <CloudIoTCoreMqtt.h>
#include "ciotc_config.h" // 更新此文件以包含您的配置

// !!REPLACEME!!
// MQTT 的回调函数,用于命令和配置更新
// 在此处放置您的消息处理代码。
void messageReceived(String &topic, String &payload){
Serial.println("incoming: " + topic + " - " + payload);
}
///////////////////////////////

// 初始化此板的 WiFi 和 MQTT
//Client *netClient;
CloudIoTCoreDevice *device;
CloudIoTCoreMqtt *mqtt;
MQTTClient *mqttClient;
unsigned long iat = 0;
String jwt;
WiFiUDP udp;

unsigned int localPort = 2390;
unsigned long devicetime;
const int NTP_PACKET_SIZE = 48; // NTP 时间戳在消息的前 48 个字节中
byte packetBuffer[NTP_PACKET_SIZE]; // 用于存储传入和传出数据包的缓冲区

// 向给定地址的时间服务器发送 NTP 请求
unsigned long sendNTPpacket(const char* address) {
// 将缓冲区中的所有字节设置为 0
for (int i = 0; i < NTP_PACKET_SIZE; ++i) {
packetBuffer[i] = 0;
}
// 初始化形成 NTP 请求所需的值
packetBuffer[0] = 0b11100011; // LI、版本、模式
packetBuffer[1] = 0; // 层级或时钟类型
packetBuffer[2] = 6; // 轮询间隔
packetBuffer[3] = 0xEC; // 对等时钟精度
// 根延迟和根分散的 8 个字节为零
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;

// 所有 NTP 字段都已赋值,现在可以发送请求时间戳的数据包:
udp.beginPacket(address, 123); // NTP 请求发送到端口 123
udp.write(packetBuffer, NTP_PACKET_SIZE);
udp.endPacket();
}

unsigned long getNTPtime() {

// 模块返回一个无符号长整型时间值,表示自 1970 年 1 月 1 日以来的秒数
// 如果遇到问题,则返回 0

// 仅在连接时发送数据
if (WiFi.status() == WL_CONNECTED) {
// 初始化 UDP 状态
udp.begin(WiFi.localIP(), localPort);
sendNTPpacket(ntp_primary); // 向时间服务器发送 NTP 数据包
// 等待是否有回复
delay(1000);
if (udp.parsePacket()) {
udp.read(packetBuffer, NTP_PACKET_SIZE); // 将数据包读入缓冲区

unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
unsigned long secsSince1900 = highWord << 16 | lowWord;
const unsigned long seventyYears = 2208988800UL;
unsigned long epoch = secsSince1900 - seventyYears;

long tzOffset = 0UL;
unsigned long adjustedTime;
return adjustedTime = epoch + tzOffset;
}
else {
udp.stop();
return 0; // 0 表示失败
}
udp.stop();
}
else {
return 0;
}

}

///////////////////////////////
// 此板特定的辅助函数
///////////////////////////////
String getDefaultSensor(){
return "Wifi: " + String(WiFi.RSSI()) + "db";
}

String getJwt(){
Serial.println("Refreshing JWT");
iat = getNTPtime();
Serial.println(iat);
jwt = device->createJWT(iat, jwt_exp_secs);

Serial.println(jwt);
return jwt;
}

void setupWifi(){
Serial.println("Starting wifi");

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED){
delay(100);
}

Serial.println("Waiting on time sync...");
while (getNTPtime() < 1510644967){
delay(10);
}
}

void connectWifi(){
Serial.print("checking wifi...");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
}
}

///////////////////////////////
// 协调前面代码中的各种方法。
///////////////////////////////
bool publishTelemetry(String data){
return mqtt->publishTelemetry(data);
}

bool publishTelemetry(const char *data, int length){
return mqtt->publishTelemetry(data, length);
}

bool publishTelemetry(String subfolder, String data){
return mqtt->publishTelemetry(subfolder, data);
}

bool publishTelemetry(String subfolder, const char *data, int length){
return mqtt->publishTelemetry(subfolder, data, length);
}

void connect(){
connectWifi();
mqtt->mqttConnect();
}


WiFiClientSecure netClient;
void setupCloudIoT(){
device = new CloudIoTCoreDevice(
project_id, location, registry_id, device_id,
private_key_str);

setupWifi();
mqttClient = new MQTTClient(512);
mqttClient->setOptions(180, true, 1000); // keepAlive, cleanSession, timeout
mqtt = new CloudIoTCoreMqtt(mqttClient, &netClient, device);
mqtt->setUseLts(true);
mqtt->startMQTT();
}

在 Esp32-lwmqtt.ino 中添加宏定义

Esp32-lwmqtt.ino 文件中为 Wio Terminal 板添加宏定义:

#if defined(ESP32) || defined(WIO_TERMINAL)
#define __ESP32_MQTT_H__
#endif

现在我们已经完成了 Arduino IDE 的设置。最后,您需要将此代码上传到 Wio Terminal。打开串口监视器,您将看到如下所示的输出。

pir

显示遥测数据

现在我们需要显示来自 Wio Terminal 的传入遥测数据。在此示例代码中,Wi-Fi 信号强度将作为遥测数据发送。

  • 步骤 1: 访问 Google Cloud Console 中的 Pub/Sub

注意: 您可以在 Google Cloud Console 的搜索栏中搜索 Pub

  • 步骤 2: 在导航菜单中进入 Subscriptions

  • 步骤 3: 选择我们之前创建的订阅 ID

  • 步骤 4: 点击 VIEW MESSAGES

  • 步骤 5: 点击 PULL,您将看到如下所示的传入遥测数据。

pir

如何添加其他传感器?

您可以将任何传感器添加到 Wio Terminal,并将遥测数据发送到 Google Cloud IoT Core。为了简单起见,我们将使用 Wio Terminal 的内置光传感器,将光强度数据发送到 Google Cloud IoT Core。

Google Cloud IoT 设置

  • 步骤 1: 访问 Google Cloud Console 中的 IoT Core

注意: 您可以在 Google Cloud Console 的搜索栏中搜索 IoT Core

  • 步骤 2: 选择我们之前创建的注册表

  • 步骤 3:Cloud Pub/Sub topics 下选择 Add or edit topics

  • 步骤 4: 点击 ADD ADDITIONAL TOPIC

  • 步骤 5:Select a Cloud Pub/Sub topic 的下拉菜单中点击 CREATE A TOPIC

  • 步骤 6: 输入 Topic ID 并点击 CREATE TOPIC

  • 步骤 7:Subfolder 列中输入 Subfolder name

注意: 子文件夹名称将在 Arduino 代码中用于与主题关联

  • 步骤 8: 点击 UPDATE

  • 步骤 9: 按照之前的说明创建一个 新订阅

Arduino 设置

导航到 Esp32-lwmqtt.ino 并添加以下内容:

  • 步骤 1: 在循环后,为内置光传感器添加以下内容:
void loop() {
int light = analogRead(WIO_LIGHT); // 分配变量以存储光传感器值
light = map(light, 0, 1023, 0, 100); // 映射传感器值
  • 步骤 2: 添加带有子文件夹名称的主题:
    publishTelemetry(getDefaultSensor());
publishTelemetry("/light", String(light));

注意: 如果未添加子文件夹名称,遥测数据将发送到默认主题。在这种情况下,如前所述的 Wi-Fi 信号强度遥测数据将发送到我们之前创建的第一个主题,即默认主题。

将代码上传到 Wio Terminal 后,从新创建的主题中作为订阅者拉取数据,您将看到如下结果。

pir

如何添加其他传感器并在仪表板上可视化数据?

尽管 Google Cloud IoT Core 不提供现成的仪表板来可视化传感器数据,但我们将通过使用 InfluxDB 和 Grafana 来实现这一目标。

InfluxDB 是一个时间序列数据库,其中每条数据都与特定的时间戳相关联,显示与特定数据相关的日期和时间。而 Grafana 是一个开源解决方案,用于运行数据分析、提取有意义的指标,并通过可定制的仪表板监控应用程序。

基本上,我们将连接一个温度/湿度传感器到 Wio Terminal,使用 Google Cloud Function 将数据从 Pub/Sub 传输到位于 GKE(Google Kubernetes Engine)集群中的 InfluxDB,并使用交互式仪表板在 Grafana 上显示来自 InfluxDB 的数据。

pir

Arduino 硬件设置

将 Grove - 温湿度传感器 (DHT11) 连接到 Wio Terminal 的 Grove - 数字/模拟端口 (D0)。

Arduino 软件设置

  • 步骤 1: 访问 Grove - 温湿度传感器仓库 并将其下载为 zip 文件

  • 步骤 2: 打开 Arduino,导航到 Sketch > Include Library > Add .ZIP Library,选择下载的库以安装

导航到之前使用的 Esp32-lwmqtt.ino 并添加以下内容:

  • 步骤 1:#include "esp32-mqtt.h" 之后添加以下内容:
#include "DHT.h" // DHT 库

#define DHTPIN 0 // 定义 DHT 的信号引脚
#define DHTTYPE DHT11 // 定义 DHT 传感器类型
DHT dht(DHTPIN, DHTTYPE); // 初始化 DHT 传感器
  • 步骤 2:setup 中添加以下内容以启动 DHT 传感器:
dht.begin();
  • 步骤 3:void loop()if 循环 中添加以下内容:
int temperature = dht.readTemperature(); // 分配变量以存储温度
int humidity = dht.readHumidity(); // 分配变量以存储湿度

String payload = String("{\"timestamp\":") + getNTPtime() +
String(",\"temperature\":") + temperature +
String(",\"humidity\":") + humidity +
String("}");
publishTelemetry(payload);

注意: 在将所有数据解析为字符串并存入 InfluxDB 时,解析 时间 非常重要,因为 InfluxDB 是一个时间序列数据库。此外,pushTelemetry 函数会将数据发送到我们在本教程开头创建的默认主题。

  • 步骤 4: 将代码上传到 Wio Terminal

Google Cloud IoT 设置

  • 步骤 1: 访问 此处 的仓库并下载为 zip 文件

  • 步骤 2: 解压下载的 zip 文件

  • 步骤 3: 打开 Google Cloud 控制台并导航到 Google Kubernetes Engine,等待系统初始化

  • 步骤 4: 点击右上角的按钮启动 Cloud Shell

pir

  • 步骤 5: 输入以下命令为 gcloud 命令行工具设置默认值
export ZONE=<enter_zone> # 例如 us-central1-a,参考 https://cloud.google.com/compute/docs/regions-zones/#available
export PROJECT_ID=<enter_project-id> # 项目 ID 名称
gcloud config set project $PROJECT_ID
gcloud config set compute/zone $ZONE
  • 步骤 6: 输入以下命令创建一个包含一个 n1-standard-1 节点的 GKE 集群
gcloud container clusters create influxdb-grafana \
--num-nodes 1 \
--machine-type n1-standard-1 \
--zone $ZONE
  • 步骤 7: 输入以下命令创建一个用于存储 InfluxDB 和 Grafana 认证信息的密钥
kubectl create secret generic influxdb-grafana \
--from-literal=influxdb-user=admin \
--from-literal=influxdb-password=passw0rd \
--from-literal=grafana-user=admin \
--from-literal=grafana-password=passw0rd

注意: 你可以根据自己的喜好更改 InfluxDB 和 Grafana 的用户名和密码

  • 步骤 8: 点击 Google Shell 中的 Open Editor

  • 步骤 9: 将之前下载并解压的文件夹拖放到 Cloud Shell Editor

  • 步骤 10: 点击 Open Terminal 返回终端。输入以下命令导航到 05-influxdb_grafana_k8s 目录

cd esp32-cloud-iot-core-k8s-master/05-influxdb_grafana_k8s
  • 步骤 11: 输入以下命令将 InfluxDB 和 Grafana 部署到 Kubernetes
kubectl create -f k8s/

Grafana 设置

  • 步骤 1: 输入以下命令检查服务的外部 IP 和端口
kubectl get services
  • 步骤 2: 复制 Grafana 的外部 IP

  • 步骤 3: 访问 http://<grafana service external ip>:3000

注意: 将之前复制的 Grafana 外部 IP 粘贴到 <grafana service external ip>

  • 步骤 4: 使用之前设置的凭据登录 Grafana

  • 步骤 5: 点击齿轮图标并导航到 Configuration > Data Sources

  • 步骤 6: 点击 Add data source 并选择 influxDB

  • 步骤 7:URL 字段中输入以下内容

http://influxdb:8086
  • 步骤 8:Database 字段中输入以下内容并点击 Save & Test
iot

注意: 如果成功设置了 InfluxDB 数据源,你应该会看到消息 Data source is working

创建 Google Cloud Function

现在我们需要创建一个 Google Cloud Function,将数据从 Pub/Sub 的主题传输到 InfluxDB,并通过 Grafana 的交互式仪表板显示 InfluxDB 中的数据。

  • 步骤 1: 返回 Google Cloud Console 并打开 Cloud Shell

  • 步骤 2: 输入以下命令启用 Cloud Functions API

gcloud services enable cloudfunctions.googleapis.com
  • 步骤 3: 输入以下命令导航到 06-cloud_function 目录
cd esp32-cloud-iot-core-k8s-master/06-cloud_function
  • 步骤 4:vim 文本编辑器 中打开 main.py
cd esp32-cloud-iot-core-k8s-master/06-cloud_function
  • 步骤 5: 按下键盘上的 i 进入 编辑模式

  • 步骤 6: 修改 _get_influxdb_client 函数 中的 InfluxDB 变量(主机、端口、用户名、密码)

注意: 通过在 Cloud Shell 中输入以下命令并复制外部 IP 获取 InfluxDB 主机

kubectl get services
  • 步骤 7: 输入 :wq 保存文件

  • 步骤 8: 输入以下命令部署 Cloud Function

export PUBSUB_TOPIC="enter_topic-name>"
export REGION="enter_region" # https://cloud.google.com/functions/docs/locations
gcloud functions deploy iotcore_pubsub_to_influxdb --runtime python37 --trigger-topic $PUBSUB_TOPIC --region $REGION

返回 Grafana 设置

  • 步骤 1: 打开 Grafana 并导航到 Dashboards > Manage

  • 步骤 2: 点击 New Dashboard 并点击 Add new panel

  • 步骤 3: 导航到 Visualization 并点击 Graph

  • 步骤 4:Query 下的 FROM 标签中,点击 select measurement 并从下拉菜单中选择 temperature

  • 步骤 5: 点击 + Query 并为 humidity 重复 步骤 12

  • 步骤 6: 根据你的喜好更改其他设置

  • 步骤 7: 点击 Apply

  • 步骤 8: 点击 Add panelAdd new panel

  • 步骤 9: 导航到 Visualization 并点击 Gauge

  • 步骤 10:Query 下的 FROM 标签中,点击 select measurement 并从下拉菜单中选择 temperature

  • 步骤 11:Field 标签下的 Unit 中,从下拉菜单中选择 Temperature > Celcius

  • 步骤 12:MinMax 中输入仪表的最小值和最大值

  • 步骤 13:Display name 中输入 Temperature

  • 步骤 14: 按照 步骤 15 的方法为 humidity 重复操作

  • 步骤 15: 点击 Apply

现在你将在 Grafana 上看到创建的仪表板

pir

技术支持与产品讨论

感谢您选择我们的产品!我们致力于为您提供多种支持,确保您使用我们的产品时能够获得尽可能顺畅的体验。我们提供了多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...