ESP32 物联网教程:ESP32、时序数据库 InfluxDB 与 Grafana 构建物联网应用

最近,我一直在进入更多的物联网/连接设备。有许多平台,但其中很多平台似乎非常封闭或范围有限(Losant 是一个有趣的例外)。另一方面,就像 AWS IoT 一样,它具有各种好处(可扩展性,机器学习,大数据),但学习曲线更陡峭,现在担心我会意外地花费巨额账单。

我之前使用 InfluxDB 在本地记录数据,并对其性能印象深刻。对于另一个项目,我已经每隔 20 毫秒通过 BLE(低功耗蓝牙)传输数据,同时用 Python 进程查询批量数据,并且它的执行效率非常好,延迟非常低。对数据进行机器学习也很方便(离线培训和实时执行)。该项目还使用了 ESP32 微控制器,我发现它非常适合原型设计,尽管它们正在补充文档和代码库。

我认为使用 InfluxDB 进行物联网应用,可以很好地介绍通过 WiFi 传输数据和一些不太令人生畏的云计算资料。这被分成三部分:

  1. 通过 HTTP 将数据发送到我的 Mac 上的 InfluxDB 服务器
  2. 如上所述,但使用的是 HTTPS
  3. 在 AWS 上部署服务器并对其进行流式传输。

结合。

设置时序数据库 InfluxDB

InfluxDB 是一个 NoSQL 数据库,专门用于时间序列数据(即我曾经使用过的所有数据)。前两个阶段,我在 Mac 上运行 InfluxDB:homebrew install influxdb。当前版本是 1.4.2,似乎最近发生了一些重大变化,Python 客户端都声称不支持它,但实际上我没有查询数据的问题。

要启动服务器,请运行 influxd(无需在 Mac 上使用 sudo)。 在另一个终端选项卡中,使用命令行界面设置数据库:

$ influx
Connected to http://localhost:8086 version v1.4.2
InfluxDB shell version: v1.4.2
> CREATE DATABASE esp32_tst

如果切换回运行守护程序的选项卡,您应该看到相应的消息出现:

InfluxDB 截图

当您在没有串口的情况下,运行嵌入式设备以显示错误消息时,检查此窗口对于弄清楚发生了什么问题很有用。

现在,我们可以使用 HTTP API 添加一些数据,这需要一个包含测量名称,标记集和字段集的字符串(字符串中的空格是标记和字段的分隔符):

curl -i -XPOST ‘http://localhost:8086/write?db=esp32_tst' — data-binary “dummy,device=mac field_1=69

它应该返回 HTTP/1.1 204 No Content,它意味着写入成功(404 可能意味着你没有创建数据库,而 400 意味着你没有写入有效的字符串)。 我们创建一个名为 “device” 的标签,并创建一个名为 “field_1” 的字段。有关这里的标签和字段的更多信息查参阅:InfluxDB 文档。 我们可以通过查询 CLI 中的数据来进行双重检查:

> use esp32_tst
Using database esp32_tst
> SELECT * FROM dummy
name: dummy
time                device field_1
----                ------ -------
1516658590825700342 mac    69

以后会有更多的 InfluxDB 配置,但现在这样做就够了。

Arduino 代码

我用一个简单的来编写使用 HTTP API 的数据。它是 HTTP Client 库的一个非常薄的封装,但使生活更轻松。它所需要的只是 InfluxDB 服务器运行位置的本地 IP(在本例中,我的 Mac 地址,可以使用 ipconfig getifaddr en0 找到)和端口(我们使用默认的 8086 )。 它还具有授权和 HTTPS 选项,我们将在稍后介绍。

您可以通过运行 WritePoints.ino 示例来测试它的工作原理,并为 WiFi 凭证和数据库名称(确保数据库存在或您将收到 404 错误)设置您自己的值。您可以在守护程序窗口中看到进入的数据,或使用 CLI 查看有哪些新数据进入:

USE esp32_tst
SELECT * FROM test WHERE time > now() - 5s
name: test
time                count new_tag random_var
----                ----- ------- ----------
1517223799607069455 91    Yes     0.802
1517223800492976221 92    Yes     0.263
1517223801509686351 93    Yes     0.092
1517223802510211739 94    Yes     0.322
1517223803492709390 95    Yes     0.765
>

授权

默认情况下,任何人都可以写入数据库。 为了确保我们知道数据来自哪里,我们可以通过添加用户来限制权限。在 influx CLI 中,创建一个管理员用户,然后创建另一个用户:

CREATE USER admin WITH PASSWORD ‘<password>’ WITH ALL PRIVILEGES
CREATE USER tom WITH PASSWORD ‘nicetry’ WITH ALL PRIVILEGES

然后,将配置文件保存到您选择的位置,作为一个 .conf 文件。 编辑配置文件的 auth-enabled 值为 true(它位于[http]头部下),然后重新启动 InfluxDB 守护进程,配置文件作为参数:influxd -config /path/to/conf/file/<configname.conf>。 现在,如果像往常一样进入流入 CLI 并尝试运行任何命令,您将收到以下消息:ERR: unable to parse authentication details。 相反,我们需要登录到 CLI:influx -username tom -password <password>。 请注意,运行 SHOW DATABASES 不会显示任何内容,因为我们所做的前一个是以 root用户身份创建的。

如果您创建数据库并尝试运行与以前相同的 Arduino 代码,毫不奇怪,您将看到 401(未授权)错误。 在应用程序中,取消 influx.authorise 行的注释并添加您的详细信息,并且您应该回到成功的 204 代码。

TLS 加密

授权可能会更安全一些,但其他人仍然可以拦截并读取您发送的数据。为了解决这个问题,我们可以使用 TLS 来加密它,并通过 HTTPS 发送。 HTTP Client 库可以使用 Espressif 方便地移植到 ESP32 的 mbed TLS 库(这不是一件容易的事)。

然而

我们将使用自签名证书,而不是将其发送给 Symantec 或有人批准。这意味着我们的数据将被加密,但未经过验证(我们无法正式证明我们说我们是谁)。这很好,但是很长一段时间它确实让我感到很悲伤。 我们必须稍微修改源代码,方法是从 WiFiClientSecure 库中更改 ssl_client.cpp 中的一行:

// mbedtls_ssl_conf_authmode(&amp;ssl;_client-&gt;ssl_conf, MBEDTLS_SSL_VERIFY_REQUIRED);
mbedtls_ssl_conf_authmode(&amp;ssl;_client-&gt;ssl_conf, MBEDTLS_SSL_VERIFY_NONE); //REQUIRED FOR SELF-SIGNED CERT

根据 InfluxData 的说明创建您的自签名证书。 我在 usr/local/etc/ssl 中创建了一个目录来保存它们,但我认为在任何地方都是很好的方法。在您的 .conf 文件中,从 auth-enabled 的设置开始,设置以下内容:

https-enabled = true
https-certificate = "/usr/local/etc/ssl/,<cert-name>.crt"
https-private-key = "/usr/local/etc/ssl/<key-name>.key"

重新启动守护进程,确保添加配置文件参数。如果您尝试访问CLI,则会发生错误,因为它仍在尝试使用 HTTP:

influx -username tom -password dontthinksomate
Failed to connect to https://localhost:8086: Get http://localhost:8086/ping: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
Please use the -ssl flag to connect using SSL.

正如它所说的,我们需要使用 -ssl 标志。 由于我们的证书是自签名的,我们还需要使用 -unsafeSsl 标志,它们似乎隐藏在文档中。influx -ssl -unsafeSsl -username tom -password comeon 应该让你像往常一样回来。

如果您尝试运行现有的 Arduino 程序,InfluxDB 将抛出 TLS 握手错误。要开始使用 HTTPS,您需要将您的证书复制到 InfluxCert.hpp 模板中,确保包含 “begin/end certificate” 行,换行符和反斜杠,以使编译器知道这是一个大字符串。 还要确保 #include “InfluxCert.hpp" 并取消 influx.addCertificate(ROOT_CERT); 行的注释。一旦编译完成,你应该得到相同的旧的 204 响应。如果你有任何提到 EOF 错误的东西,那可能意味着你已经 在 InfluxCert.hpp 中搞砸了复制/格式化证书。如果你得到 “remote error: tls: bad certificate”,这意味着 ssl_client.cpp 没有正确更改,它试图验证证书。

Grafana

Grafana 是一款流行的开源时间序列可视化/分析工具,支持与 InfluxDB 集成。 (InfluxData 制作了一个名为 Chronograf 的类似程序,我几年前并没有那么热衷,但我应该再试一次,因为很多内容都会改变,我发现 Grafana 的用户体验非常不直观)。

brew update
brew install grafana
brew tap homebrew/services 

使用以下其中一种启动 Grafana:

brew services start grafana
grafana-server --config=/usr/local/etc/grafana/grafana.ini --homepath /usr/local/share/grafana

如果您已经安装了 Grafana,那么请确保更新,因为只使用 CA 证书存在问题(它坚持使用客户端证书和密钥,根据我找不到的 Github Issue,它也是个安全缺陷)。

在您的浏览器中,前往 http://localhost:3000/login(3000 是 Grafana 的默认端口),然后以管理员身份以 admin 密码登录。 显然,您应该更改此密码:导航到左上角的 Grafana 徽标,转到您的个人资料。

通过填写表格来添加数据源。大部分内容是不言自明的:确保勾选 “With CA Cert” 框,然后跳过 TLS 验证框(因为我们是自签名的,请记住)。 另外请确保将默认 URL 更改为 HTTPS。

在左上角的 Grafana 菜单上,点击 Dashboards 并创建一个新的。将一个图形拖入阴影区域,然后点击标题,然后进行编辑以实际选择要绘制的数据(奇怪,对吧?)。 我做了一个非常基本的查询来绘制草图中生成的随机变量。 我们将涵盖您稍后可以做的更多事情。 您可以通过单击框左侧的部分来移除预定义的元素(例如平均聚合和按时间分组)。 点击窗口的右上角可以控制时间历史记录,包括菜单左下角的 “refresh every” 选项,该选项会定期刷新绘图,以便看到新的数据进入。

Dashboard

就是这样 - 记住要通过点击顶部的软盘来保存仪表板,否则下次登录时就不得不重复一遍......

英语原文链接:IoT with an ESP32, InfluxDB and Grafana

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.