EMQ X + TDengine + Grafana 环境搭建教程
操作系统:ubuntu 18.04 LTS
EMQ X:EMQ 官网 https://www.emqx.io/cn/
TDengine:涛思数据官网 https://www.taosdata.com/cn/
Grafana:Grafana 官网 https://grafana.com/
1. 安装 EMQ (开源版本: EMQ X Broker)
去官网下载 EMQ(官网网址:https://www.emqx.io/cn/)下载 zip 压缩包
(docker 建议不要下载,不好修改,慎用)
下载压缩包 : wget https://www.emqx.io/cn/downloads/broker/v4.2.2/
emqx-ubuntu18.04-4.2.2-x86_64.zip
解压下载好的压缩包 unzip emqx-ubuntu18.04-4.2.2-x86_64.zip
运行 EMQ(以 console 模式启动 EMQ X 方便调试): ./bin/emqx console
EMQ 启动成功后浏览器访问 http://127.0.0.1:18083 访问 EMQ X 管理控制台
Dashboard,使用 默认用户名:admin 密码: public 完成初次登录。
2. 安装 TDengine(以 docker 方式安装)
第一次启动 TDengine:
拉取并启动容器 :sudo docker run -d --name tdengine -p 6030-6041:6030-6041
tdengine/tdengine:latest
启动以后检查容器运行的状态,看看是否成功启动 : sudo docker ps -a
第二次及以上启动 TDengine:
查看容器状态 : sudo docker ps -a
重启 TDengine 容器: sudo docker restart + CONTAINER ID 号
3. 安装 Grafana(可视化数据库界面)
安装相关环境:sudo apt-get install -y adduser libfontconfig1
下载 Grafana : wget https://dl.grafana.com/oss/release/
grafana_7.2.1_amd64.deb
安装 Grafana : sudo dpkg -i grafana_7.2.1_amd64.deb
启动 Grafana : sudo service grafana-server start
停止 Grafana:sudo service grafana-server stop
为 Grafana 添加 TDengine 数据源插件
下载插件:git clone https://github.com/taosdata/TDengine.git
拷贝插件到相关位置:sudo cp -r ./TDengine/minidevops/grafana/tdengine
/var/lib/grafana/plugins/
重启 Grafana : sudo service grafana-server restart
Grafana 启动成功后浏览器访问 http://127.0.0.1:3000 访问 Grafana 可视化面板,
使用 默认用户名:admin 密码:admin 完成初次登录,登录后按照提示修改密码使用
新密码登录进入主界面:
测试应用
本文模拟物联网环境数据采集场景,假设现有一定数据的环境数据采集点,所有采集点
数据均通过 MQTT 协议 传输至采集平台(MQTT Publish),主题设计如下:
sensor/data
第 1 页 共 15 页
传感器发送的数据格式为 JSON,数据包括传感器采集的温度、湿度、噪声音量、PM10、
PM2.5、二氧化硫、二氧化氮、一氧化碳、传感器 ID、区域、采集时间等数据。
{
}
"temperature": 30,
"humidity" : 20,
"volume": 44.5,
"PM10": 23,
"pm25": 61,
"SO2": 14,
"NO2": 4,
"CO": 5,
"id": "10-c6-1f-1a-1f-47",
"area": 1,
"ts": 1596157444170
现在需要实时存储以便在后续任意时间查看数据,提出以下的需求:
每个设备按照每 5 秒钟一次的频率进行数据上报,数据库需存储每条数据以供后续回
溯分析;
通过可视化系统查看 任意区域、任意时间区间内 的指标数据,如平均值、最大值、最
小值。
操作步骤
1. 配置 EMQ X 存储数据到 TDengine
TDengine 创建数据库与数据表
进入 TDengine Docker 容器: docker exec -it tdengine bash
创建 test 数据库:
1.taos
2.create database test;
创建 sensor_data 表,关于 TDengine 数据结构以及 SQL 命令(参见
https://www.taosdata.com/cn/documentation20/taos-sql/#表管理 ):
use test;
CREATE TABLE sensor_data (
ts timestamp,
temperature float,
humidity float,
volume float,
PM10 float,
pm25 float,
SO2 float,
NO2 float,
CO float,
sensor_id NCHAR(255),
第 2 页 共 15 页
area TINYINT,
coll_time timestamp
);
2. 配置 EMQ X 规则引擎
首先把 EMQ X 更换为中文界面
打开 EMQ X Dashboared,进入 规则引擎 -> 规则 页面,点击 创建 按
钮进入创建页面。
规则 SQL
规则 SQL 用于 EMQ X 消息以及事件筛选,以下 SQL 表示从
sensor/data 主题筛选出 payload 数据:
SELECT
payload
FROM
"sensor/data"
第 3 页 共 15 页
如下图所示配置 SQL 测试,payload 填写如下所示
{
"temperature":30,
"humidity":20,
"volume":44.5,
"PM10":23,
"pm2.5":61,
"SO2":14,
"NO2":4,
"CO":5,
"id":"10-c6-1f-1a-1f-47",
"area":1,
"ts":1596157444170
}
第 4 页 共 15 页
测试结果如下所示为正确(使用 SQL 测试功能,输入测试数据进行
筛选结果测试,测试有结果且输出内容如下,标明 SQL 编写正确):
{
"payload":
"{\"temperature\":30,\"humidity\":20,\"volume\":44.5,\"PM10\":23,\"pm2.5
\":61,\"SO2\":14,\"NO2\":4,\"CO\":5,\"id\":\"10-c6-1f-1a-1f-47\",\"area\":1,\
"ts\":1596157444170}"
}
响应动作
为支持各种不同类型平台的开发,TDengine 提供符合 REST 设计标准的
API。通过 RESTful Connector
第 5 页 共 15 页
(https://www.taosdata.com/cn/documentation20/connector/#RESTful-Connector)
提供了最简单的连接方式,即使用 HTTP 请求携带认证信息与要执行的 SQL
操作 TDengine。
使用 EMQ X 开源版中的发送到 Web 服务即可通过 RESTful Connector
写入数据到 TDengine。即将到来的 EMQ X 企业版 4.1.1 版本将提供原生更
高性能的写入 Connector。
响应动作创建过程:点击响应动作下的添加按钮,在弹出框内选择 发送
数据到 Web 服务,点击 新建资源 新建一个 WebHook 资源。
发送到 Web 服务需要两个数据,一个是关联资源,另一个是消息内容模
板。
关联资源:HTTP 服务器配置信息,此处为 TDengine 的 RESTful Connector
消息内容模板:此处为携带数据的 INSERT SQL,注意我们应当在 SQL 中
指定数据库名,字符类型也要用单引号括起来, 消息内容模板为:
消息内容模板编写如下所示
INSERT INTO test.sensor_data VALUES(
now,
${payload.temperature},
${payload.humidity},
${payload.volume},
第 6 页 共 15 页
${payload.PM10},
${payload.pm25},
${payload.SO2},
${payload.NO2},
${payload.CO},
'${payload.id}',
${payload.area},
${payload.ts}
)
关联资源如下所示
关联资源 - > 新建资源
资源类型选择 Webhook,请求 URL 填写
http://127.0.0.1:6041/rest/sql,请求方法选择 POST,还需添加
Authorization 请求头作为认证信息。
Authorization 的值为 Basic + TDengine 的 {username}:{password}
经过 Base64 编码之后的字符串, 例如 root:taosdata 编码后为
第 7 页 共 15 页
cm9vdDp0YW9zZGF0YQ==,实际填入的值为:Basic
cm9vdDp0YW9zZGF0YQ==
创建响应动作完成之后如下图所示
第 8 页 共 15 页