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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐