本文以常见物联网使用场景为例,介绍了如何利用 EMQ X 消息中间件与开源数据可视化方案 InfluxDB + Grafana ,将物联网设备大量基于时序的数据便捷地展现出来。javascript
在物联网项目中接入平台的设备数据和存储方案如下特色:html
所以在物联网项目中使用时序数据库是比较好的选择。时序数据库能够带来显著的性能的提高,包括更高的容纳率、更快的大规模查询(部分数据库比其余关系数据库支持更多的查询),以及更好的数据压缩率等。数据入库后,每每须要其余方式如数据可视化系统将数据按照规则统计、展示出来,实现数据的监控、指标统计等业务需求,以便充分发挥数据的价值。java
假设现有一批设备,每一个设备有一个 Client ID,全部设备均经过 MQTT 协议往 MQTT 消息服务器上相应的主题发送数据,主题的设计以下:node
devices/{client_id}/messages
每一个设备发送的数据格式为 JSON,发送的经过该传感器采集的温度与湿度数据。git
{ "temperature": 30, "humidity" : 20 }
如今须要实时存储以便在后续任意时间查看数据,提出如下的需求:github
仪表盘右上角能够选择时间区间、自动刷新时间,此时设备持续发送数据,仪表盘数据值会随之变化,实现了比较好的可视化效果。docker
目前市面上已有多款物联网消息中间件、时序数据库和数据可视化产品,结合数据的采集上报、联网接入、消息存储与可视化功能来看,EMQ X(高性能物联网 MQTT 消息中间件) + InfluxDB(时序数据库)+ Grafana(美观、强大的可视化监控指标展现工具)组合无疑是最佳的物联网数据可视化集成方案。数据库
方案总体架构以下图所示:macos
本文所用各个组件均有 Docker 镜像,除 EMQ X 须要修改少数配置为了便于操做使用下载安装外,InfluxDB 与 Grafana 均使用 Docker 搭建,详细的安装步骤本文再也不赘述。npm
三大部件官网均有不一样操做系统/平台的服务或安装包资源与教程:
若是您是 EMQ X 新手用户,推荐经过 EMQ X 指南 快速上手
访问 EMQ 官网 下载适合您操做系统的安装包,因为数据持久化是企业功能,您须要下载 EMQ X 企业版(能够申请 License 试用) 写本文的时候 EMQ X 企业版最新版本为 v3.4.5,该功能须要使用该版本及以上版本,下载 zip 包的启动步骤以下 :
## 解压下载好的安装包 unzip emqx-ee-macosx-v3.4.4.zip cd emqx ## 将 License 文件复制到 EMQ X 指定目录 etc/, License 需自行申请试用或经过购买受权获取 cp ../emqx.lic ./etc ## 以 console 模式启动 EMQ X ./bin/emqx console
本文中须要用到的配置文件以下:
etc/emqx.lic
etc/plugins/emqx_backend_influxdb.conf
根据部署实际状况填写插件配置信息以下:
backend.influxdb.pool1.server = 127.0.0.1:8089 backend.influxdb.pool1.pool_size = 5 ## Whether or not set timestamp when encoding InfluxDB line backend.influxdb.pool1.set_timestamp = true ## Store Publish Message ## 因为业务仅需 devices/{client_id}/messages 主题,此处修改默认配置的主题过滤器 backend.influxdb.hook.message.publish.1 = {"topic": "devices/+/messages", "action": {"function": "on_message_publish"}, "pool": "pool1"}
## 模板文件 data/templates/emqx_backend_influxdb_example.tmpl ## 重命名修改成 data/templates/emqx_backend_influxdb.tmpl
因为 MQTT Message 没法直接写入 InfluxDB, EMQ X 提供了 emqx_backend_influxdb.tmpl 模板文件将 MQTT Message 转换为可写入 InfluxDB 的 DataPoint:
{ "devices/+/messages": { "measurement": "devices", "tags": { "client_id": "$client_id" }, "fields": { "temperature": ["$payload", "temperature"], "humidity": ["$payload", "humidity"] }, "timestamp": "$timestamp" } }
关于 EMQ X InfluxDB 使用详细教程见 InfluxDB 数据存储
经过 Docker 进行安装,映射数据文件夹与 8089
udp 端口与 8086
端口(Grafana 使用):
EMQ X 仅支持 InfluxDB UDP 通道,须要 influx_udp 插件支持,且数据库名称指定为 db
## 使用 influx_udp 插件 git clone https://github.com/palkan/influx_udp.git ## 进入插件目录 cd influx_udp ## 经过插件配置建立并启动容器 docker run --name=influxdb --rm -d -p 8086:8086 -p 8089:8089/udp \ -v ${PWD}/files/influxdb.conf:/etc/influxdb/influxdb.conf \ -e INFLUXDB_DB=db \ influxdb:latest ## 启动后检查容器运行状态 docker ps -a
至此,能够重启 EMQ X 并启动插件以应用以上配置:
./bin/emqx stop ./bin/emqx start ## 或使用 console 模式能够看到更多信息 ./bin/emqx console ## 启动插件 ./bin/emqx_ctl plugins load emqx_backend_influxdb ## 启动成功后会有如下提示 Plugin emqx_backend_influxdb loaded successfully.
使用如下命令经过 Docker 安装并启动 Grafana:
docker run -d --name=grafana -p 3000:3000 grafana/grafana
启动成功后浏览器访问 http://127.0.0.1:3000
访问 Grafana 可视化面板,使用 admin
admin
默认用户名密码完成初次登陆,登陆后按照提示修改密码使用新密码登陆进入主界面:
进行可视化配置以前须要写入模拟数据,方便配置过程当中进行效果预览。
如下脚本模拟完成了 100 个设备在过去 12 小时内、每隔 5 秒钟上报一条模拟温湿度数据并发送到 EMQ X 的场景,读者安装 Node.js 平台后能够经过如下命令启动:
npm install mqtt mockjs --save node mock.js
模拟脚本执行完毕后,数据将写入 InfluxDB db
数据库中,经过如下命令进入 InfluxDB 容器并查看数据:
## 进入 docker 容器 docker exec -it influxdb bash ## 进入 influxdb 命令行 root@581bde65650d:/# influx ## 切换到 db 数据库 use db; ## 查询数据 select * from devices limit 1; ## 查询结果 name: devices time client_id humidity temperature ---- --------- -------- ----------- 1574578725608000000 mock_client_1 54.33 98.5
附:模拟脚本以下:
// Node.js // mock.js const mqtt = require('mqtt') const Mock = require('mockjs') class MockData { constructor(clientNum = 20) { this.EMQX_SERVER = 'mqtt://localhost:1883' this.clientNum = clientNum this.clients = {} this.startMock() } async startMock() { const now = Date.now() // last 12h every 5s for (let ts = now - 12 * 3600 * 1000; ts <= now; ts += 5 * 1000) { for (let i = 0; i < this.clientNum; i++) { const clientId = `mock_client_${i}` const client = this.clients[clientId] || await this.createClient(clientId) this.clients[clientId] = client const mockData = this.getMockData() client.publish(`devices/${clientId}/messages`, JSON.stringify(mockData)) console.log(`${clientId} send temperature ${mockData.temperature} humidity ${mockData.humidity}`) } } } /** * Init a virtual mqtt client * @param {string} clientId ClientID */ createClient(clientId) { return new Promise((resolve, reject) => { const client = mqtt.connect(this.EMQX_SERVER, { clientId, }) client.on('connect', () => { console.log('client s% connected', clientId) resolve(client) }) client.on('error', (e) => { reject(e) }) }) } /** * Generate mock data */ getMockData() { return { temperature: parseFloat(Mock.Random.float(22, 100).toFixed(2)), humidity: parseFloat(Mock.Random.float(12, 86).toFixed(2)), } } } // startup new MockData(100)
组件安装完成,模拟数据写入成功后,按照 Grafana 可视化界面的操做指引,完成业务所需数据可视化配置。
添加数据源,即显示的数据源信息。选取 InfluxDB 类型数据源,输入链接参数进行配置,默认状况下,关键配置信息以下:
127.0.0.1
或 localhost
;db
,为 EMQ X 默认写入数据库名。添加好数据源后,添加须要显示的数据仪表盘信息。仪表盘为多个可视化面板的集合,点击 New Dashboard 后,选择 Add Query 经过查询来添加数据面板:
建立面板须要四个步骤,分别是 Queries(查询)、Visualization(可视化)、General(图表配置)、Alert(告警),下面按照业务需求与完成如下建立流程:
使用 Grafana 的可视化查询构建工具,查询出全部设备的平均值:
measurement
,按照 emqx_backend_influxdb.tmpl
文件配置,此处 measurement
为 devices
;temperature
mean
和 humidity
mean
,查询并计算温度、湿度字段的平均值;GROUP BY:默认使用时间区间聚合。
time($__interval)
函数表示取 $__interval
时间区间内的数据,如 time(5s)
表示从每 5
秒时间区间原始数据内取出值来进行计算(SELECT 中的计算)fill
参数表示没有值时候的默认值,为 null
的时候该数据点不会在图表显示出来;tag
可选,按照指定 tag 进行显示。Visualization 默认不作更改,General 里面修改面板名称为 Device temperature and humidity mean value
,若是须要对业务进行监控告警,能够在 Alert 里编排告警规则,此处仅作可视化展现,不使用此功能。
完成建立后,点击左上角返回按钮,该 Dashboard 里成功添加一个数据面板。点击顶部导航栏保存图标,输入 Dashboard 名称完成 Dashboard 的建立。
继续点击 Dashboard 的 Add panel 按钮,添加温度最大值、最小值图表。操做步骤同添加平均值,仅对查询中 SELECT 统计方法字段作出调整,调整为 Selectors 功能中的 max
和 min
方法。
继续点击 Dashboard 的 Add panel 按钮,添加温、湿度总平均值,数据条数面板。操做步骤近似上面两个步骤,分别使用 count
和 mean
方法对指定字段操做,取消 GROUP BY 字段便可完成查询。Visualization 配置中选择图表类型为 Gauge(仪表) 便可。
保存仪表盘,拖拽调整每一个数据面板大小、位置,最终获得一个视觉效果较好的数据仪表盘。最终报表完成后,呈现的就是文章开头展现的效果。
至此咱们完成了 EMQ X 与 InfluxDB + Grafana 物联网数据可视化集成方案的搭建实现。经过本文,读者能够了解到利用 EMQ X 丰富的拓展能力在数据可视化解决方案里能够很是快速、灵活地开发出基于 InfluxDB + Grafana 的可视化系统,实现海量数据存储、计算分析与展示。深刻学习掌握 Grafana 的其余功能后,用户能够定制出更完善的数据可视化乃至监控告警系统。
更多信息请访问咱们的官网 emqx.io,或关注咱们的开源项目 github.com/emqx/emqx ,详细文档请访问 官方文档。