linux配置emqx tdengine grafana
1. 安装docker和拉取镜像
安装docker命令:
curl -fsSL https://get.docker.com | sudo sh
将docker添加事件组:
sudo usermod -aG docker $USER
将docker开机自启:
sudo systemctl enable docker
2.拉取hello-world镜像
在拉取emqx等核心镜像之前 先拉取hello world镜像测试当前网络环境是否可用
拉取hello world :
docker pull hello-world
如果出现以下命令
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
说明在拉取过程中 镜像代理有问题
输入以下命令
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
进入编辑代理的json界面输入以下json命令:
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://mirror.ccs.tencentyun.com",
"https://hk.mirror.aliyuncs.com",
"https://mirror.gcr.io",
"https://docker.m.daocloud.io"
]
}
然后Crtl+O 回车 Ctrl + X 保存并退出
重启docker 服务:
sudo systemctl restart docker
然后重新拉取hello world
运行helloworld :
docker run hello-world
3.拉取emqx镜像:
docker pull emqx/emqx:6.2.0
输入以下配置emqx命令:
docker run -d \
--name emqx \
--privileged \
-p 1883:1883 \
-p 8083:8083 \
-p 8883:8883 \
-p 8084:8084 \
-p 18083:18083 \
emqx/emqx:6.2.0
如何查看当前linux的IP地址:
ip addr show ens33
回复:
ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:b3:46:f6 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.1.92/24 brd 192.168.1.255 scope global dynamic noprefixroute ens33
valid_lft 7128sec preferred_lft 7128sec
inet6 240e:3b6:3262:290:7f02:a12c:ccf3:be36/64 scope global temporary dynamic
valid_lft 259130sec preferred_lft 85813sec
inet6 240e:3b6:3262:290:35af:eef9:971b:c556/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 259130sec preferred_lft 172730sec
inet6 fe80::e063:4591:4f58:b90b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
红色文字为当前ip地址
在浏览器输入 192.168.1.92:18083 进入emqx
初始用户名为admin 密码为public 每次重新启动emqx 密码会初始化 所以就不改密码了
4.拉取tdengine
拉取命令:
docker pull tdengine/tsdb:latest
创建本地数据和日志目录 命令:
mkdir -p ~/tdengine_data ~/tdengine_log
配置命令:
docker run -d \
--name tdengine \
--privileged \
--shm-size=2g \
-e TAOS_FQDN=localhost \
-p 6030:6030 \
-p 6041:6041 \
-p 6043-6060:6043-6060 \
-p 6043-6060:6043-6060/udp \
-v ~/tdengine_data:/var/lib/taos \
-v ~/tdengine_log:/var/log/taos \
tdengine/tsdb:latest
输入
docker exec -it tdengine /bin/bash
再输入
taos
就进入数据库了
5.拉取grafana
拉取命令:
docker pull grafana/grafana:latest
因为grafana最新版已经不支持tdengine了 我们需要再配置中安装tdengine的插件命令如下:
docker run -d \
--name grafana \
-p 3000:3000 \
-e "GF_INSTALL_PLUGINS=https://github.com/taosdata/grafanaplugin/releases/latest/download/tdengine-datasource.zip;tdengine-datasource" \
grafana/grafana:latest
6.emqx的配置

选择规则

可以看到 SQL编辑器中 “t/#“是这个规则定义的主题消息
我们可以改成我们自己设备需要的主题
连接TDengine :
在右面的动作输出中 点击添加动作 在动作类型中找到TDengine 可以参考以下配置

数据库名字必须和tdengine创建的数据库(database)名字一样 我这里创建的名字是sensor
SQL模板中 是连接 设备发送的消息和数据库中存在的字段的桥梁
INSERT INTO sensor.sensor VALUES(
now,
${payload.co2},
${payload.pm25},
${payload.temperature},
${payload.humidity}
)
sensor.sensor 前面是database 后面是此database里创建的表
now 是tdengine自带的时序
${payload.co2} 是拿设备发送的co2的值 必须和设备发送的json的键 一一对应 才能拿到对应的值
存入的顺序必须是数据库创建的字段顺序
像是这一个表 顺序就是 ts co2 pm25 temperature humidity
连接器配置
如何查看tdengine的服务器地址:
在linux中输入
docker inspect tdengine | grep IPAddress
回复:"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
用户名默认为root 密码为taosdata 点击测试连接 显示连接成功就成功了
数据实时查看和接收:
找到WebSocket客户端

默认连接配置就可以 点击连接按钮即可连接
订阅设备发布的主题 可以看到接收的指令

可以下发指定的主题 sensor/data payload输入设备指定的格式 可以看到设备端日志如下,显示为更新参数成功

7.grafana配置
在左侧列表中选择连接 添加新连接 因为我们下载了tdengine插件所以能看到有一个
⚠已弃用 的TDengine Datasource标记 点击右上方 添加数据源
host选择 数据库的链接
http:/172.17.0.4:6041
user :root password:taosdata
点击保存并测试 会有一个测试的结果
在仪表盘选项中选择创建仪表盘 选择刚刚创建的数据源
这边已start 类型举例
sql语句
select temperature from sensor.sensor
就可以显示当前数据库存入的温度
也可以选择Time series
sql语句:
SELECT
_wstart AS time,
AVG(temperature) AS temperature,
AVG(humidity) AS humidity,
AVG(pm25) AS pm25,
AVG(co2) AS co2
FROM sensor.sensor
WHERE ts>= NOW() - 1h
AND ts<= NOW()
INTERVAL(10m)
FILL(NULL)
ORDER BY _wstart;
解释: 将1个小时之内的数据 分成10分钟一份 将这十分钟的温度 湿度 pm2.5 co2做了一个平均值 从早到晚的显示到图表中
在使用interval(10m)这个以十分钟作为一个时间聚合的时间片中,tdengine会自动创建一个_wstart 作为时序开始的时间, where ts >=NOW() -1h AND ts <=NOW() 是将时间控制到1h之内 这个ts是数据库中创建的字段 在tdengine中会介绍
8.TDengine配置
在docker中 输入docker exec -it tdengine /bin/bash
输入taos 进入数据库
下面讲一下常用的SQL语句
创建数据库:
CREATE DATABASE sensor;
使用刚刚创建的数据库
use sensor;
在此数据库中创建数据表
CREATE TABLE sensor (
ts timestamp,
co2 int
pm25 int
temperature float,
humidity float,
)TTL 1;
可以看到我们创建的数据库的数据位置完全符合在emqx创建的规则里的动作的SQL模板里的数据是一一对应的 其中TTL1 是代表此表数据只存在一天
查找数据表的字段:
DESC sensor.sensor;
DESCRIBE sensor.sensor;
查找最近的十个数据:
select * from sensor limit 10;
带有时间聚合的查询:
SELECT
_wstart AS time,
AVG(temperature) AS temperature,
AVG(humidity) AS humidity,
AVG(pm25) AS pm25,
AVG(co2) AS co2
FROM sensor.sensor
WHERE ts >= NOW() - 1h
INTERVAL(10m)
FILL(NULL)
ORDER BY _wstart;
删除特定时间段的数据:
DELETE FROM sensor.sensor
WHERE ts >= '2026-04-01 00:00:00'
AND ts <= '2026-04-02 00:00:00';
在数据库查询数据时 会发现tdengine的时间不是北京时间
taos> select * from sensor;
ts | co2 | pm25 | temperature | humidity |
================================================
2026-04-20 06:36:14.386| 607 | 39 | 27.07 | 67.77 |
这是因为tdengine配置的默认时间是UTC时间 也就是零时区 北京时间为东八区 所以在此时间的基础上加八个小时就可以了 但是grafana本身就自带解析正确的时间的处理 所以我们无需处理
9.总结
每次启动linux时 需要输入以下命令来启动对应容器
docker start emqx
docker start tdengine
docker start grafana
进入数据库需要输入
docker exec -it tdengine /bin/bash
taos
在实际使用中,TDengine 容器的 IP 地址并不总是固定的。当你的 Linux 虚拟机/服务器通过 DHCP 获取 IP 地址时,虽然宿主机 IP 可能会变化,但更常见的问题是:
Docker 容器在默认的 bridge 网络下,每次容器重启或重新创建时,其内部 IP 地址(通常是 172.17.x.x 段)有可能发生改变。
因此,当你在 EMQX、Grafana 或其他应用中直接使用 TDengine 的 IP 地址进行连接时,经常会出现“连接拒绝”(Connection refused)的情况。这时就需要重新查看 TDengine 容器的当前 IP 地址。
docker inspect tdengine | grep IPAddress
更多推荐



所有评论(0)