嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

构建电子2018连接站数据平台

Main27_7933684d09f87695d7eba14597dc91d963c0d970.jpg

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的安装方式而有所不同。 接下来,我们将继续介绍实现应用程序逻辑的流程。

物联网区块链

CSDP_IoTBC_NR_Flow_9c31d3b0e3b30fb78e142517d2c795e1b312a982.jpg

上面我们可以看到物联网区块链示范者的流程。 这里我们有一个最左边的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环境传感器

CSDP_DSES_NR_Flow_527838358ce5af07946b57581151d29fa0ba628c.jpg

环境传感器流程非常相似,也从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,数据库名称以及具有读访问权限的用户名和密码

物联网区块链

EDB_IoTBC_ce2da720338d1d945e8dfc7eaa01f062fabffa90.jpg

使用物联网区块链演示器,我们只想显示单个统计信息,而不是图形或类似信息。 例如,最新的块编号及其保留的事务数,车祸的Y加速力或上次报告的机器故障的时间。 这很容易使用Singlestat类型的面板和查询,如:

SELECT last("block") FROM "blockchain" WHERE ("node" = 'miner')

Singlestat面板还提供各种选项,例如标签,字体大小和颜色。

LoRaWAN环境传感器

EDB_IndoorSensors_9554393a86109f39492d203bae3bb77d393f2c9d.jpg

对于环境传感器,我们实际上有两个仪表板:一个用于放置在RS支架周围的室内传感器,另一个用于位于牛津郡,伦敦和哈利法克斯的室外传感器。 两者基本相同,唯一的区别是在查询中选择的传感器。

SELECT last("temperatureAvg") FROM "environment" WHERE ("sensor" = 'sens021') AND $timeFilter GROUP BY time($__interval) fill(linear)

上述查询检索传感器记录的周期平均温度。 然后简单地针对每个传感器重复这些查询以获得最高温度,加上湿度和空气压力平均值和最大压力等。 每个面板绘制来自不同传感器的相同类型的测量值

总结

因此,正如我们所见,我们可以使用功能强大的免费和开源软件快速组装完整的处理,存储和可视化的物联网数据平台。 虽然我们的用例相对简单,只需要少量设备和非常基本的处理,但同样可以创建更复杂的仪表板,支持更多设备以及更先进的数据处理。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.