如何使用Google Core IoT与InfluxData

导航到

随着越来越多的物联网部署寻求利用云计算解决方案的力量,我们在这里的InfluxData一直在与云服务提供商紧密合作,确保InfluxDB继续成为物联网的首选时间序列数据库。Google的核心物联网平台也不例外,因此我们为Google Core IoT构建了一个新的Telegraf插件,以及一个完整的端到端教程,介绍如何使用Google Core IoT和InfluxData部署您的物联网解决方案。

本教程假设您有一个可访问的InfluxDB实例正在运行。

我们还将构建和安装一个支持Google Core IoT Pub/Sub客户端的Telegraf版本。该Telegraf实例必须在公网服务器上运行,并具有SSL加密证书。**Google Pub/Sub只能写入Telegraf的SSL加密实例**。

我要特别感谢Google的工程师们为此做出的帮助。没有我们紧密的合作,这一切都不可能实现。

您需要什么

正如我所说,这是一个关于使用Google Core IoT构建端到端物联网应用程序的完整教程,因此我们肯定需要自己构建一个物联网设备。有几种方法可以实现,包括**不**构建设备,所以我们将探讨所有选项。

完成本教程所需的物品

  • Google Cloud 账户
  • 可在互联网上访问的InfluxDB实例InfluxDB

当然,您也可以在Google Cloud中运行InfluxDB实例,但配置它超出了本教程的范围。

如果您想使用**真实**的传感器数据,您将需要

否则,您可以使用应用程序在模拟模式下生成的虚拟数据。

本教程所需的所有代码均可在以下GitHub仓库中找到

您必须从源代码构建Telegraf(如上链接所示),才能使用此集成,因为该插件尚未包含在Telegraf的官方构建中。构建指南也包括在内。

在GCP侧设置物联网核心

Google Cloud Platform账户

在您设置物联网核心之前,您需要一个Google账户。如果您已有Google账户,可以开始使用,或者为这个教程创建一个新账户。一旦您的Google账户准备就绪,您就可以运行下面的gcloud命令。或者您可以使用Google Cloud Console。该说明将在下一节中提供。

安装Google Cloud命令行工具

首先,根据Google提供的此文档安装Google Cloud命令行工具。您需要安装组件,对Google Cloud进行身份验证,并创建和配置您的项目。


# gcloud components install beta
# gcloud auth login
# gcloud projects create ? <YOUR_PROJECT_NAME>
# gcloud config set project ? <YOUR_PROJECT_NAME>
# gcloud beta pubsub topics create ? <iot-topic>
# gcloud beta pubsub subscriptions create --topic ? <iot-topic>? ? <iot-subscription> 

Google Cloud IoT平台要求所有通信都使用SSL/TLS加密,因此您需要生成一对公钥/私钥,以便您的设备能够与云平台通信。首先,您将生成RSA公钥和私钥,然后使用这些密钥来发送数据。

只要您的计算机安装了OpenSSL,您就可以运行以下命令来生成所需的密钥文件


# mkdir PemFiles
# cd PemFiles
# openssl req -x509 -newkey rsa:2048 -keyout private_key.pem -nodes -out public_key.pem -subj "/CN=unused"
Now that you have your Public/Private key pair, your can create a device registry and a device.
# gcloud beta iot registries create ?<iot-registry>? --region us-central1 --event-pubsub-topic=?<iot-topic>
# gcloud iot devices create <DEVICE_ID>\
 --project=<PROJECT_ID> \
 --region=<REGION> \
 --registry=<REGISTRY_ID>\
 --public-key path=public_key_file,type=rs256

注意:将public_key_file替换为您上面生成的公钥文件的路径。

使用Google Web控制台

您需要登录到您的Google Cloud Platform账户。这里有很好的入门指南帮助您开始。

创建注册表

您需要创建一个Google Core IoT注册表。

GCP-Create-a-registry

 

一旦您为您设备的公钥/私钥对和证书创建了证书,您就可以创建一个设备写入该注册表。

 

一旦您创建了设备,并拥有适当的证书,您就可以在该设备上运行客户端应用程序。

InfluxData组件

InfluxData Architecture

本教程假设您有一个可访问的InfluxDB实例正在运行。

我们还将构建和安装一个支持Google Core IoT Pub/Sub客户端的Telegraf版本。这个Telegraf实例必须运行在公开可访问的互联网服务器上,并且必须具有SSL加密证书。 Google Pub/Sub只能写入Telegraf的SSL加密实例。

构建InfluxData Telegraf

目前,Telegraf的Google Core IoT插件尚未在Telegraf的“发布”版本中发布。这是一个预览发布版本,因此必须在运行之前从源代码构建。

先决条件:Golang

安装和配置Go超出了本教程的范围,但您可以在这里找到您操作系统的详细说明。

注意:您可以在本地机器上构建Telegraf,并通过设置一些GO环境变量在可访问的互联网服务器上运行它,我们稍后也会介绍这些变量。

构建Telegraf

首先,您需要将Telegraf的GoogleIoTCore分支克隆到您的机器上,然后您需要构建telegraf。


$ git clone https://github.com/davidgs/telegraf/tree/GoogleIoT
$ cd GoogleIoT
$ make

上面的代码将为您的平台构建Telegraf代理。如果您在Mac OS X机器上构建,但计划在Linux机器上运行它,您仍然可以在本地构建。


$ export GOOS=linux
$ export GOARCH=amd64
$ make

上面的代码将构建64位Linux版本的Telegraf。

配置Telegraf

一旦构建了telegraf,您需要创建并编辑一个配置文件以调整特定于Google的部分。


$ telegraf config > telegraf.conf

## Server listens on <server name>:port
## Address and port to host HTTP listener on
service_address = ":9999"
## Path to serve
## default is /write
## path = "/write"
## maximum duration before timing out read of the request
read_timeout = "10s"
## maximum duration before timing out write of the response
write_timeout = "10s"
## precision of the time stamps. can be one of the following:
	# second, millisecond, microsecond, nanosecond
	# Default is nanosecond
precision = "nanosecond"
# Data Format is either line protocol or json
protocol="line protocol"
## Set one or more allowed client CA certificate file names to
## enable mutually authenticated TLS connections
## tls_allowed_cacerts = ["/etc/telegraf/clientca.pem"]
## Add service certificate and key
tls_cert = "/etc/telegraf/cert.pem"
tls_key = "/etc/telegraf/key.pem"
## You **must** provide the certificate and key files!

一旦此文件完成,将其保存到/etc/telegraf/telegraf.conf,然后您可以启动telegraf。


$ sudo telegraf -config /etc/telegraf/telegraf.conf

您可以使用以下命令验证您的telegraf代理是否正在监听


$ netstat -nlp

并查找输出行


tcp6 129 0 :::9999 :::* LISTEN -

运行客户端应用程序

客户端应用程序也完全用Go编写,因此您应该能够在支持Golang的几乎所有设备上运行它。在这个例子中,我一直在树莓派3上运行它,但任何具有网络连接并且可以运行Go代码的设备都应该没问题。


$ git clone https://github.com/davidgs/GoogleIoTClient
$ cd GoogleIoTClient
$ go build GoogleIoT.go 
$ ./GoogleIoT -ca_certs roots.pem -device [deviceName] -private_key [privatekey.pem] -project [projectID] -region [region] -registry [registryName] -format json -virtual

上面的命令(在您替换方括号内的值后)将以JSON格式发布“虚拟”(随机)值。

无K30传感器的设备示例输出

$ ./GoogleIoT -ca_certs roots.pem -device [deviceName] -private_key [privatekey.pem] -project [projectID] -region [region] -registry [registryName] -format line

将(假设您有上面提到的传感器)以行协议格式发布实时传感器数据,并显示以下输出


2018/09/15 12:45:58 [main] Humidity: 66.24 Temperature: 22.56
2018/09/15 12:45:59 [main] Humidity: 66.26 Temperature: 22.56
2018/09/15 12:46:01 [main] Humidity: 66.24 Temperature: 22.57
2018/09/15 12:46:02 [main] Humidity: 66.23 Temperature: 22.56
2018/09/15 12:46:04 [main] testingGoogle,sensor=bme_280 temp_c=22.56,humidity=66.24 1537029958025504878
testingGoogle,sensor=bme_280 temp_c=22.56,humidity=66.26 1537029959527147539
testingGoogle,sensor=bme_280 temp_c=22.57,humidity=66.24 1537029961028724629
testingGoogle,sensor=bme_280 temp_c=22.56,humidity=66.23 1537029962530306772

请注意,输出是4行Influx Line Protocol,因此每次迭代都会写入4个温度和湿度点。

这会将数据写入Google Core IoT MQTT代理,然后它将数据发送到Google Pub/Sub代理,该代理将数据推送到Telegraf(使用davidgs的Telegraf GoogleIoT分支)。

查看结果

如果您已正确配置所有内容,并且正在运行客户端应用程序,则应该能够启动Chronograf,并实时看到数据流到数据库中。

现在您已经拥有了一个从设备到Google Core IoT以及InfluxDB的端到端物联网传感器数据数据管道!

致谢

感谢Daz Wilkins的文章,代码的90%来自该文章!在GitHub上找不到它,所以……好的开发者复制,伟大的开发者粘贴。:-)