你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
Mosquitto,NodeRED,InfluxDB和Grafana结合在一起,提供了一个非常灵活的开源数据平台。
RS Components 连接站具有物联网区块链和LoRaWAN环境传感器,这些可视化的数据可以通过仪表板显示在大型监视器上。在这篇文章中,我们将了解Node-RED如何用于提供“粘合剂”和一些简单的处理,其中InfluxDB用于数据存储,最后是Grafana用于可视化。
对于两个演示者,消息队列遥测传输(Message Queuing Telemetry Transport)都提供了数据源。然而,环境传感器通过物联网连接,因此只需连接到其MQTT API以获取数据馈送,但是物联网区块链演示程序需要一个代理来发布。
虽然可以在本地运行整个软件堆栈,但是决定在云中托管它,以便能够在需要时从远程站点进行查看。
每种软件组件的安装方式有很多种。例如,从源代码,通过O / S包或Docker容器。不是详细说明每个组件的每个安装步骤,这里我们将仅介绍配置和官方文档,有关软件安装的详细信息,请参阅操作指南。
Mosquitto
# Anonymous user access
topic read public/#
# Authenticated users
user app
topic #
user iotdemo
topic iotbc/
Mosquitto是MQTT发布/订阅消息传递协议的开源消息代理,它提供了一种在应用程序之间发送消息的轻量级方法。它受益于各种编程语言的广泛支持和易于使用的库。
虽然物联网区块链演示器使用以太坊提供安全,不可变的事务记录,但区块链技术不提供实时处理,因此MQTT用于仪表板集成。因此,演示程序需要一个中间人来发布信息。
Mosquitto配置非常简单,默认情况下,任何人都可以发布和订阅代理上的所有主题,这在网络连接的主机上肯定是不可取的。
上面我们可以看到实现访问控制的/ etc / mosquitto / acl文件。在这方面,我们已经说过,任何人都可以订阅在public /下发布的主题,这对于例如测试。应用程序用户可以发布到任何主题,而iotdemo只能发布到iotbc /下的主题。这里,app是Node-RED将使用的用户,而iotdemo将由演示者使用。
为了使用ACL,我们需要在/etc/mosquitto/mosquitto.conf文件中指定它,该文件还必须配置密码文件,其中代理将查找用户并确认其密码有效。通过网络连接时,最好配置TLS。有关如何执行此操作以及配置密码文件等的详细信息,请参阅文档。
InfluxDB
env:
INFLUXDB_DB: 'iotdemo'
INFLUXDB_READ_USER: 'dashboard'
INFLUXDB_READ_USER_PASSWORD: 'secretReadPass'
INFLUXDB_WRITE_USER: 'app'
INFLUXDB_WRITE_USER_PASSWORD: 'secretWritePass'
INFLUXDB_ADMIN_USER: 'admin'
INFLUXDB_ADMIN_PASSWORD: 'secretAdminPass'
INFLUXDB_HTTP_ENABLED: true
INFLUXDB_HTTP_AUTH_ENABLED: true
所以现在我们将跳过一步,转到InfluxDB,它将提供我们的数据存储。接下来我们将介绍Node-RED,然后它将提供MQTT数据源和存储之间的粘合剂。
InfluxDB是一个时间序列数据库(TSDB),这意味着它优化用于存储按时间排序的信息 - 例如来自物联网设备的读数。它使用HTTP作为接口,与MQTT一样,有相当广泛的支持。 InfluxDB附带了一个命令行界面来管理它,还有一个名为Chronograf的可选Web界面,用于查看和管理数据。
InfluxDB可以从O / S包安装,以及其他方法。上面可以看到一个用于通过Docker部署flowxdb的Ansible playbook的片段。使用此机制,我们可以使用环境变量来设置初始数据库,以及各种用户帐户和可选配置。但是,在安装后创建用户和数据库同样容易。
再一次,如果我们想通过互联网访问这个资源,建立TLS是明智的。有关如何执行此操作以及一般配置和使用的详细信息,请参阅文档。
因此,在这一点上,我们将假设已经安装了Mosquitto和InfluxDB,并根据需要配置了安全性,并将其作为一部分用户帐户的一部分。
NodeRED
Node-RED是连接物联网的工具,并且非常具有可扩展性,多年来它不断发展以支持各种输入和输出 - 核心功能不断发展变得越来越复杂,同时保持易用性和新手友好性。
假设我们已经通过O / S包,Docker或其他方法安装了Node-RED,我们还需要安装一些额外的“节点”来扩展它,以便我们可以连接到物联网和我们的InfluxDB数据库。进入数据目录后,可以通过以下方式完成:
$ npm install node-red-contrib-ttn node-red-contrib-influxdb
数据目录的位置将根据操作系统和Node-RED的安装方式而有所不同。 接下来,我们将继续介绍实现应用程序逻辑的流程。
物联网区块链
上面我们可以看到物联网区块链示范者的流程。 这里我们有一个最左边的MQTT输入节点,它订阅了iotbc /下的所有主题(哈希是一个通配符)。 此节点已配置为使用Mosquitto代理,以及我们之前设置的用户名和密码。
然后将输出连接到一个节点,该节点将消息有效负载中的JSON字符串转换为JavaScript对象表示,使得访问值更容易一些。
// Check sensor status and if good, format and post to InfluxDB
// Fields = sensor readings
// Tag = TTN DevID
if (msg.topic == 'iotbc/miner'){
var influx = {
measurement: 'blockchain',
payload: [
msg.payload,
{ node: 'miner'
}]
}
} else if (msg.topic == 'iotbc/carcrash') {
var influx = {
measurement: 'blockchain',
payload: [
{impact: msg.payload},
{ node: 'carcrash'
}]
}
} else {
return;
}
return influx;
流程信息函数节点的部分内容如上所示。这里我们首先查找完整的MQTT主题名称,然后相应地处理消息。对于矿工,我们有一个JSON格式的有效负载,其中包含最新的以太坊块号以及包含的交易数量。其他节点(用例),例如车祸和机器故障等只发出一个整数值。上面我们刚刚展示了Miner和Car Crash单元代码以简化。
InflugDB输出节点使用msg.measurement属性,这意味着,我们可以在我们的应用程序逻辑中指定它,而不是对输出节点中的测量进行硬编码,它将与要存储的有效载荷一起进行通信。有效负载本身由包含两个对象的数组组成,第一个是一组字段,第二个是标记。
什么是测量,字段和标签?测量描述了将要存储的数据。字段是键值对,不进行索引。标记也是键值对,但它们被索引。因此,标记应该用于通常查询的元数据。
所以现在我们有一个名为区块链的测量,它有一个miner,carcrash和temperaturealert等标记的索引。此时我们可以执行查询并检索以太坊区块中包含的交易数量的值,或者最后一次车祸的影响, 例如。
LoRaWAN环境传感器
环境传感器流程非常相似,也从MQTT数据源开始。 但是,这次我们将使用TTN Uplink节点,而不是使用MQTT输入节点,这使得通过基于MQTT的物联网API获取数据变得更加容易。 有了这个,我们只需要配置应用程序ID和访问密钥,由TTN控制台提供。
// Check sensor status and if good, format and post to InfluxDB
// Fields = sensor readings
// Tag = TTN DevID
if (msg.payload.status == 'good'){
delete msg.payload.status;
var influx = {
measurement: 'environment',
payload: [
msg.payload,
{ sensor: msg.dev_id
}]
};
}else{
return;
}
return influx;
通过此流程,Process Message功能特别简单,我们:
1.检查状态是否良好(传感器未处于老化期)
2.如果状态良好,我们删除status属性,因为没有记录它的点
3.将InfluxDB测量设置为环境
4.获取有效负载 - 本身是具有温度和湿度等的JSON对象的键值对 - 并使用它来填充InfluxDB字段
5.将InfluxDB传感器标签设置为LoRaWAN传感器/ TTN设备ID。
应该指出的是,先前通过TTN控制台配置了有效载荷格式解码器。这将解压缩通过LoRaWAN网络上行链路发送的传感器二进制格式,并将其转换为更友好的JSON对象,其中键值对用于所有各种传感器读数。
在这个阶段,我们现在有两个测量记录到InfluxDB,其中包括物联网区块链和环境传感器演示器的时间序列订购数据。
Grafana
最后,我们将数据可视化,为此我们将使用Grafana,一个基于Web的分析和监控平台,支持各种数据源,包括InfluxDB。有关安装信息,请参阅官方文档。
安装Grafana后,需要设置InfluxDB类型的数据源,为此我们只需要输入服务器URL,数据库名称以及具有读访问权限的用户名和密码
物联网区块链
使用物联网区块链演示器,我们只想显示单个统计信息,而不是图形或类似信息。 例如,最新的块编号及其保留的事务数,车祸的Y加速力或上次报告的机器故障的时间。 这很容易使用Singlestat类型的面板和查询,如:
SELECT last("block") FROM "blockchain" WHERE ("node" = 'miner')
Singlestat面板还提供各种选项,例如标签,字体大小和颜色。
LoRaWAN环境传感器
对于环境传感器,我们实际上有两个仪表板:一个用于放置在RS支架周围的室内传感器,另一个用于位于牛津郡,伦敦和哈利法克斯的室外传感器。 两者基本相同,唯一的区别是在查询中选择的传感器。
SELECT last("temperatureAvg") FROM "environment" WHERE ("sensor" = 'sens021') AND $timeFilter GROUP BY time($__interval) fill(linear)
上述查询检索传感器记录的周期平均温度。 然后简单地针对每个传感器重复这些查询以获得最高温度,加上湿度和空气压力平均值和最大压力等。 每个面板绘制来自不同传感器的相同类型的测量值
总结
因此,正如我们所见,我们可以使用功能强大的免费和开源软件快速组装完整的处理,存储和可视化的物联网数据平台。 虽然我们的用例相对简单,只需要少量设备和非常基本的处理,但同样可以创建更复杂的仪表板,支持更多设备以及更先进的数据处理。