4、遥测数据入门:遥测数据上传、数据存储、数据查询、数据可视化基础

遥测数据,说白了就是设备上报的那些「活数据」。温度、湿度、电压、转速……这些才是物联网平台的灵魂。没有遥测数据,你的设备就是个哑巴。

我记得刚接触 ThingsBoard 时,最困惑的就是:数据到底怎么进去的?存哪了?怎么查出来?今天咱们就把这条链路彻底打通。

4.1 遥测数据上传:设备怎么「说话」

设备要上报数据,无非两种方式:MQTT 或者 HTTP。我个人习惯用 MQTT,毕竟轻量、实时,适合物联网场景。

先看一个最简单的 MQTT 上传例子。假设你有一个温湿度传感器,要上报数据到 ThingsBoard:

mosquitto_pub -d -q 1 \
  -h "你的服务器IP" \
  -p 1883 \
  -t "v1/devices/me/telemetry" \
  -u "设备访问令牌" \
  -m '{"temperature": 25.6, "humidity": 68.2}'

这里的关键点就两个:主题(topic)消息格式。主题必须是 v1/devices/me/telemetry,消息必须是 JSON 格式。嗯,就这么简单。

小提示: 如果你用 HTTP 上传,POST 请求到 http://你的服务器IP:8080/api/v1/设备令牌/telemetry,效果一样。但我还是推荐 MQTT,毕竟长连接省资源。

我在项目中遇到过一个问题:设备上报频率太高,每秒几十条,结果服务器压力山大。后来我加了限流策略,在规则链里做聚合处理。这个后面会细讲。

4.2 数据存储:数据到底存哪了?

数据上传后,ThingsBoard 默认存在 CassandraPostgreSQL 里。你可能会问:为什么有两个选项?

说白了,Cassandra 适合海量时序数据写入,但查询能力弱。PostgreSQL 查询强,但写入吞吐量有限。我个人建议:生产环境用 Cassandra + PostgreSQL 混合模式。时序数据进 Cassandra,元数据进 PostgreSQL。

来看看数据表结构。以 PostgreSQL 为例,遥测数据存在 ts_kvts_kv_latest 两张表里:

表名 作用 关键字段
ts_kv 存储历史遥测数据 entity_id, key, ts, bool_v, str_v, long_v, dbl_v
ts_kv_latest 存储最新一条遥测数据 entity_id, key, ts, bool_v, str_v, long_v, dbl_v

注意看,ts_kv 里同一个 key 会有多条记录,按时间戳排列。而 ts_kv_latest 只保留最新一条。为什么要分两张表?你想想看,查最新值如果去扫历史表,那效率得多低。

避坑指南: 我曾经在生产环境发现,如果设备上报的数据 key 特别多(比如上百个),ts_kv_latest 表会变得很大。后来我限制了每个设备的最大 key 数量,才解决这个问题。

4.3 数据查询:怎么把数据「捞」出来

数据存进去了,怎么查?ThingsBoard 提供了两种方式:REST APIWebSocket

先看 REST API。假设你要查某个设备最近一小时的温度数据:

GET /api/plugins/telemetry/DEVICE/{设备ID}/values/timeseries?keys=temperature&startTs=1680000000000&endTs=1680003600000

返回结果长这样:

{
  "temperature": [
    {"ts": 1680000001000, "value": "25.6"},
    {"ts": 1680000002000, "value": "25.8"},
    {"ts": 1680000003000, "value": "26.1"}
  ]
}

注意时间戳是毫秒级的。我刚开始用的时候,传了秒级时间戳,结果查出来全是空的。嗯,这个坑我踩过。

如果你需要实时推送,用 WebSocket:

ws://你的服务器IP:8080/api/ws/plugins/telemetry?token=设备令牌

连接成功后,订阅对应的设备 ID 和 key,数据就会实时推过来。这个在仪表盘上做实时曲线图特别有用。

4.4 数据可视化基础:让数据「说话」

数据查出来了,怎么展示?ThingsBoard 的仪表盘功能很强大。我个人最喜欢的是 时序折线图数字显示 这两个组件。

创建一个简单的温度曲线图,步骤是这样的:

  1. 进入仪表盘,添加一个新别名(Alias),指向你的设备
  2. 添加时序折线图组件,数据源选择刚才的别名
  3. 在数据源配置里,key 填 temperature
  4. 设置时间范围,比如「最近1小时」

就这么几步,一条温度曲线就出来了。你还可以叠加多条曲线,比如温度和湿度一起看。

核心要点: 可视化不是花架子。我在项目中见过有人把十几个指标堆在一个图上,结果根本看不清。我的建议是:一个图最多展示 3-5 条曲线,多了就分图。

还有一个实用技巧:阈值告警线。比如温度超过 30 度时,曲线变红。这个在仪表盘的「高级设置」里可以配,后面讲告警时会详细说。

4.5 实战:从零搭建一个遥测数据看板

光说不练假把式。咱们来做一个完整的实战:

  1. 创建一个模拟设备,用 MQTT 上传温湿度数据
  2. 在 ThingsBoard 里查看数据是否存储成功
  3. 创建一个仪表盘,展示温湿度曲线
  4. 添加一个数字显示组件,展示最新温度值

我建议你先用 mosquitto_pub 手动发几条数据,确认链路通了,再写自动化脚本。这样排查问题会快很多。

记得有一次,我帮客户排查问题,发现数据上传了但仪表盘不显示。查了半天,原来是仪表盘的时间范围设成了「最近15分钟」,而数据是1小时前的。嗯,这种低级错误,谁还没犯过呢?

好了,遥测数据的基础链路就这些。下一章咱们会深入规则链,看看怎么对数据做清洗、转换和告警。到时候你会发现,今天学的这些,都是地基。