ThingsBoard 二次开发 - 设备遥测

本文详细描述了如何通过ThingsBoard平台规划遥测数据,利用RabbitMQ进行消息传递,整合元数据并按设备类型分类。内容涉及MQTT通信、规则链设置、RESTAPI接口以及在SpringBoot项目中的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# ThgingsBoard

https://iothub.org.cn/docs/iot/
https://iothub.org.cn/docs/iot/dev/dev-telemetry/

一、遥测数据规划

1.遥测规划

  1. 遥测数据上传ThingsBoard平台
  2. ThingsBoard通过规则引擎整合元数据
  3. ThingsBoard通过规则引擎按设备类型对数据分类
  4. ThingsBoard通过规则引擎把消息路由到消息队列(RabbitMQ或Kafka、EMQX),根据设备类型建topic
  5. 消息队列(RabbitMQ)根据topic消费数据,保存到数据库
  6. 根据微服务划分创建数据库,根据时序数据规则创建表

二、准备工作

1.上传遥测

package com.iothub.telemetry;
import com.iothub.mqtt.EmqClient;
import com.iothub.mqtt.MqttProperties;
import com.iothub.mqtt.QosEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class Upload {

    @Autowired
    private EmqClient emqClient;

    @Autowired
    private MqttProperties properties;

    @PostConstruct
    public void init(){
        //连接服务端
        emqClient.connect(properties.getUsername(),properties.getPassword());
        //订阅一个主题
        //emqClient.subscribe("testtopic/#", QosEnum.QoS1);
    }

    @Scheduled(fixedRate = 2000)
    public void publish(){

        String data = getData(2);

        emqClient.publish("v1/devices/me/telemetry",data,
                QosEnum.QoS1,false);
    }

    private String getData(Integer type){

        if (type == 1) {
            // 携带时间戳
            String data = "{\n" +
                    "\t\"ts\": 1451649600512,\n" +
                    "\t\"values\": {\n" +
                    "\t\t\"stringKey\": \"value1\",\n" +
                    "\t\t\"booleanKey\": true,\n" +
                    "\t\t\"doubleKey\": 42.0,\n" +
                    "\t\t\"longKey\": 73,\n" +
                    "\t\t\"jsonKey\": {\n" +
                    "\t\t\t\"someNumber\": 42,\n" +
                    "\t\t\t\"someArray\": [1, 2, 3],\n" +
                    "\t\t\t\"someNestedObject\": {\n" +
                    "\t\t\t\t\"key\": \"value\"\n" +
                    "\t\t\t}\n" +
                    "\t\t}\n" +
                    "\t}\n" +
                    "}";

            return data;

        } else if (type == 2) {
            // 不携带时间戳
            String data = "{\n" +
                    "  \"stringKey\": \"value1\",\n" +
                    "  \"booleanKey\": true,\n" +
                    "  \"doubleKey\": 42.0,\n" +
                    "  \"longKey\": 73,\n" +
                    "  \"jsonKey\": {\n" +
                    "    \"someNumber\": 42,\n" +
                    "    \"someArray\": [1,2,3],\n" +
                    "    \"someNestedObject\": {\"key\": \"value\"}\n" +
                    "  }\n" +
                    "}";

            return data;
        }else {
            // 数组
            String data = "[{\"key1\":\"value1\"}, {\"key2\":true}]";
            return data;
        }
    }
}
server:
  port: 8999
spring:
  application:
    name: tb-telemetry

mqtt:
  broker-url: tcp://82.157.166.86:1883
  client-id: emq-client-telemetry
  username: LuUoLXi3DMqOPqDjm20C
  password:

遥测数据

{
    "stringKey": "value1",
    "booleanKey": true,
    "doubleKey": 42.0,
    "longKey": 73,
    "jsonKey": {
        "someNumber": 42,
        "someArray": [1, 2, 3],
        "someNestedObject": {
            "key": "value"
        }
    }
}

元数据

{
    "deviceName": "Test-telemetry",
    "deviceType": "default",
    "ts": "1696730983079"
}

2.RabbitMQ

2.1.Docker部署RabbitMQ
docker run -d  --network host --restart=always --name rabbitmq rabbitmq:management

# 访问地址
http://82.157.166.86:15672/ 
# 账户/密码:
guest/guest 
2.2. 创建直连交换机

1.创建直连交换机
在这里插入图片描述

2.创建队列
在这里插入图片描述

3.绑定队列
在这里插入图片描述

2.3.创建主题交换机

1.创建topic交换机
在这里插入图片描述

2.创建队列
在这里插入图片描述

3.绑定交换机
在这里插入图片描述

3.创建规则链

3.1.创建遥测规则链

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.整合元数据
# copy keys

{
    "deviceName": "Test-telemetry",
    "deviceType": "default",
    "ts": "1696730983079"
}

在这里插入图片描述
在这里插入图片描述

3.3.按设备类型消息分类
# 按设备类型消息分类

if(msg.deviceType === 'test-telemetry') {
    return ['test-telemetry'];
} else {
    return ['default'];
}

在这里插入图片描述
在这里插入图片描述

三、上传遥测

1.创建设备

在这里插入图片描述
在这里插入图片描述

2.上传遥测数据

{
    "stringKey": "value1",
    "booleanKey": true,
    "doubleKey": 42.0,
    "longKey": 73,
    "jsonKey": {
        "someNumber": 42,
        "someArray": [1, 2, 3],
        "someNestedObject": {
            "key": "value"
        }
    }
}


{
	"stringKey": "value1",
	"booleanKey": true,
	"doubleKey": 42.0,
	"longKey": 73
}

在这里插入图片描述

@Component
public class Upload {

    @Autowired
    private EmqClient emqClient;

    @Autowired
    private MqttProperties properties;

    @PostConstruct
    public void init(){
        //连接服务端
        emqClient.connect(properties.getUsername(),properties.getPassword());
        //订阅一个主题
        //emqClient.subscribe("testtopic/#", QosEnum.QoS1);
    }

    @Scheduled(fixedRate = 2000)
    public void publish(){

        String data = getData(2);

        emqClient.publish("v1/devices/me/telemetry",data,
                QosEnum.QoS1,false);
    }

    private String getData(Integer type){

        if (type == 1) {
            // 携带时间戳
            String data = "{\n" +
                    "\t\"ts\": 1451649600512,\n" +
                    "\t\"values\": {\n" +
                    "\t\t\"stringKey\": \"value1\",\n" +
                    "\t\t\"booleanKey\": true,\n" +
                    "\t\t\"doubleKey\": 42.0,\n" +
                    "\t\t\"longKey\": 73,\n" +
                    "\t\t\"jsonKey\": {\n" +
                    "\t\t\t\"someNumber\": 42,\n" +
                    "\t\t\t\"someArray\": [1, 2, 3],\n" +
                    "\t\t\t\"someNestedObject\": {\n" +
                    "\t\t\t\t\"key\": \"value\"\n" +
                    "\t\t\t}\n" +
                    "\t\t}\n" +
                    "\t}\n" +
                    "}";

            return data;
        } else if (type == 2) {
            // 不携带时间戳
            String data = "{\n" +
                    "  \"stringKey\": \"value1\",\n" +
                    "  \"booleanKey\": true,\n" +
                    "  \"doubleKey\": 42.0,\n" +
                    "  \"longKey\": 73,\n" +
                    "  \"jsonKey\": {\n" +
                    "    \"someNumber\": 42,\n" +
                    "    \"someArray\": [1,2,3],\n" +
                    "    \"someNestedObject\": {\"key\": \"value\"}\n" +
                    "  }\n" +
                    "}";

            return data;
        }else {
            // 数组
            String data = "[{\"key1\":\"value1\"}, {\"key2\":true}]";
            return data;
        }
    }
}

3.RabbitMQ

1.创建队列

telemetry-default-queue、telemetry-queue

在这里插入图片描述

2.创建交换机
在这里插入图片描述

4.配置规则引擎

4.1.整体配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.整个元数据
{
    "deviceName": "Test-telemetry",
    "deviceType": "default",
    "ts": "1696730983079"
}

在这里插入图片描述

4.3.按设备类型消息分类
if(msg.deviceType === 'test-telemetry') {
    return ['test-telemetry'];
} else {
    return ['default'];
}

在这里插入图片描述

5.测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

{
	"stringKey": "value1",
	"booleanKey": true,
	"doubleKey": 42.0,
	"longKey": 73,
	"jsonKey": {
		"someNumber": 42,
		"someArray": [1, 2, 3],
		"someNestedObject": {
			"key": "value"
		}
	},
	"deviceType": "default",
	"deviceName": "Test-telemetry",
	"ts": "1451649600512"
}
{
	"stringKey": "value1",
	"booleanKey": true,
	"doubleKey": 42.0,
	"longKey": 73,
	"deviceType": "test-telemetry",
	"deviceName": "Test-telemetry1",
	"ts": "1696824491527"
}

四、REST API

1.遥测API

在这里插入图片描述
在这里插入图片描述

# ThgingsBoard

https://iothub.org.cn/docs/iot/
https://iothub.org.cn/docs/iot/dev/dev-telemetry/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoTHub - 物联网开源技术社区

支持开源技术! 传播开源文化!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值