利用ThingsBoard与CnosDB高效存储遥测数据的实践


CnosDB.gif

在物联网(IoT)应用中,遥测数据的收集和存储至关重要。ThingsBoard 是一个开源物联网平台,支持设备管理、数据可视化和分析。 CnosDB 是一个高性能的时序数据库,专为处理大量时间序列数据而设计。本文将介绍如何将 ThingsBoard 与 CnosDB 集成,以存储和管理遥测数据。

环境准备

在开始之前,请确保您已准备好以下环境:

  1. Docker:运行 ThingsBoard 以及 CnosDB 的容器。

  2. 开发环境:Python、Java 或其他编程语言,用来运行程序模拟 IoT 设备。

步骤一:启动 CnosDB

CnosDB 的安装运行可以参考官方文档。运行如下命令,通过 Docker 启动 CnosDB:

docker network create tb-cnosdb
docker run -d --name cnosdb --network tb-cnosdb cnosdb/cnosdb:community-latest

执行 SHOW DATABASES 命令,验证 CnosDB 是否成功启动:

docker exec cnosdb curl -s -X POST -u 'root:' 'http://127.0.0.1:8902/api/v1/sql' -d 'SHOW DATABASES'

若输出如下数据,则说明 CnosDB 启动并初始化成功:

database_name
cluster_schema
public
usage_schema

步骤二:启动 ThingsBoard(CnosDB)

以 ThingsBoard v3.7 为基础开发,添加了使用 CnosDB 存储时序数据的功能,获取安装包请扫描文末二维码,添加CC为好友。

通过设置配置文件中的 database.ts.type=cnosdb 或环境变量 DATABASE_TS_TYPE=cnosdb 来启动 ThingsBoard 的混合模式(实体数据存储至 PostgreSQL,时序数据存储至 CnosDB)。

在通过混合模式启动 ThingsBoard 时,需要额外配置时序数据库的部分,以下介绍时序数据库 CnosDB 的相关配置项:

  • cnosdb.host 或环境变量 CNOSDB_HOST - 数据库 JDBC 服务的 IP 和端口号,默认为 127.0.0.1:8904

  • cnosdb.tenant 或环境变量 CNOSDB_TENANT - CnosDB 租户名称,默认为 cnosdb

  • cnosdb.database 或环境变量 CNOSDB_DATABASE - CnosDB 数据库名称,默认为 ThingsBoard

  • cnosdb.user 或环境变量 CNOSDB_USER - CnosDB 用户名。

  • cnosdb.password 或环境变量 CNOSDB_PASSWORD - CnosDB 密码。

配置文件示例:

cnosdb:
  host: 'cnosdb:8904'
  tenant: 'cnosdb'
  database: 'ThingsBoard'
  user: 'root'
  password: 'root'

以下是使用 Docker 安装 ThingsBoard 的基本步骤:

# 加载 Docker 镜像
# docker load -i tb-postgres-cnosdb.tar
# 启动 ThingsBoard(CnosDB),暴露 HTTP 接口 9090 和 MQTT 接口 1883
docker run -d --name ThingsBoard --network test \
  -p 9090:9090 -p 1883:1883 \
  -e TB_QUEUE_TYPE=in-memory \
  -e DATABASE_TS_TYPE=cnosdb \
  -e _JAVA_OPTIONS='--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED' \
  -e CNOSDB_HOST='cnosdb:8904' \
  cnosdb/tb-postgres-cnosdb:0.0.1

访问 [http://localhost:9090](http://localhost:9090,您将看到 ThingsBoard 的登录界面。

接下来,使用默认的租户登录租户界面:

  • 用户名:tenant@ThingsBoard.org

  • 密码:tenant

步骤三:启动模拟设备

在 ThingsBoard 中,您需要创建一个新的设备,并配置数据源以将数据发送到 CnosDB。

  1. 登录 ThingsBoard 控制台。

  2. 打开“实体/设备”界面,点击右上角“添加设备”,创建一个新设备,记录下设备的访问令牌(Access token)。

  1. 使用 Python 或其他语言编写脚本,将遥测数据发送到 ThingsBoard。以下是一个示例:

首先安装 ThingsBoard 的 MQTT 客户端 tb-mqtt-client 以及依赖的组件 paho-mqtt

pip3 install paho-mqtt
pip3 install tb-mqtt-client

编写 Python 脚本:

from tb_device_mqtt import TBDeviceMqttClient, TBPublishInfo
import time
import random

# 初始化 MQTT 客户端
client = TBDeviceMqttClient(host="127.0.0.1", username="访问令牌")
# 连接 ThingsBoard
client.connect()
# 每 10 秒发送一次遥测数据,共发送 10 次
# 遥测数据包含 temperature、enabled、currentFirmwareVersion 三个属性
for _ in range(10):
    telemetry = {"temperature": random.uniform(10, 15), "enabled": True, "currentFirmwareVersion": "v1.1.0"}
    # 发送遥测数据(默认 QoS = 1)
    result = client.send_telemetry(telemetry)
    # 调用阻塞函数 get() 来取得发送结果
    is_success = result.get() == TBPublishInfo.TB_ERR_SUCCESS
    print("Telemetry was published:", is_success)
    # 等待 10 秒
    time.sleep(10)
# 断开连接
client.disconnect()
  1. 运行 Python 脚本:
python3 ./python/mqtt.py 

预期输出如下:

Waiting for connection to be established before sending data to ThingsBoard!
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
Timeout while waiting for service configuration!, session will use default configuration.
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
Telemetry was published: True
MQTT client was disconnected with reason code 0 (The operation completed successfully.)

步骤四:验证数据存储

  1. 打开“实体/设备”界面,在列表中点击设备,在弹出页面中点击“复制设备 ID”。

执行 SQL 验证数据存储。

docker exec cnosdb curl -s -X POST -u 'root:' 'http://127.0.0.1:8902/api/v1/sql?db=ThingsBoard' -d "SELECT * FROM ts_kv WHERE entity_id = '设备ID' ORDER BY time ASC"

正确运行的情况下,结果如下所示:

time,entity_type,entity_id,key,partition,bool_v,str_v,long_v,dbl_v,json_v
2024-05-09T07:08:09.466000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.466000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.466000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,12.730445863623686,
2024-05-09T07:08:09.480000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.480000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.480000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,12.730445863623686,
2024-05-09T07:08:09.493000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.493000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.493000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.663143608620802,
2024-05-09T07:08:09.500000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.500000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.500000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.663143608620802,
2024-05-09T07:08:09.532000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.532000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.532000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.078936704849081,
2024-05-09T07:08:09.552000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.552000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.552000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.078936704849081,
2024-05-09T07:08:09.566000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.566000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.566000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.704042825901556,
2024-05-09T07:08:09.567000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.567000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.567000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,14.704042825901556,
2024-05-09T07:08:09.577000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.577000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.577000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,13.731712874911237,
2024-05-09T07:08:09.580000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,58,,,v1.1.0,,,
2024-05-09T07:08:09.580000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,57,,true,,,,
2024-05-09T07:08:09.580000000,,4d91a170-797c-11ef-a9f4-41fb9b44b87d,39,,,,,13.731712874911237,

步骤五:展示数据

关于仪表板的使用,详见官方文档。

创建仪表板展示数据

  1. 打开“仪表板”界面,点击右上角的“创建仪表板”按钮,设置仪表板名称,点击右下角的“添加”前往仪表板布局界面。
  1. 点击“添加部件”,弹出“选择部件包”窗口,选择“Charts”,并选择“Time series chart”,进入图表设置界面。
  1. 点击“数据源”输入框,选择刚才创建的设备,点击右下角的“添加”,回到仪表板布局界面。
  1. 添加的图表应该会表现为一个折线图,展示模拟设备不断推送至 ThingsBoard 的遥测数据。

结论

通过将 ThingsBoard 与 CnosDB 集成,您可以高效地存储和管理遥测数据。这种组合不仅提高了数据处理能力,还增强了数据的可视化和分析能力。希望本文能帮助您顺利完成集成。如果您有任何问题或建议,请随时联系。

获取 CnosDB 可观测性白皮书请点击以下链接或者点击阅读原文:
https://jsj.top/f/qyV9DC

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。
欢迎关注我们的社区网站:https://cn.cnosdb.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容