ThingsBoard HTTP Transport 实现方式

本篇文档系统梳理 ThingsBoard 平台 HTTP 设备接入的整体实现方式,重点详解 HTTP 自动注册(provision)机制的完整调用链、核心模块及消息流转机制,并补充核心注册逻辑代码说明,帮助理解其分层解耦与分布式架构设计。

一、测试 HTTP Transport

1、本地启动 thingsboard 服务,然后打开 http://localhost:8080/ 并使用系统管理员: sysadmin@thingsboard.org / sysadmin 进行登陆

2、在 http://localhost:8080/tenants 页面创建测试租户 test,并添加租户管理员:tenant@thingsboard.org / tenant

3、以租户管理员身份登陆,在 http://localhost:8080/entities/devices 页面创建测试设备 test

4、使用下面命令检查连通性(我使用的是 macos 系统):

curl -v -X POST http://localhost:8080/api/v1/p4qGvJp3443cotHE0JfY/telemetry \
--header Content-Type:application/json --data "{temperature:25}"

输出日志如下:

Note: Unnecessary use of -X or --request, POST is already inferred.
* Uses proxy env variable http_proxy == 'http://127.0.0.1:7890'
* Trying 127.0.0.1:7890...
* Connected to 127.0.0.1 (127.0.0.1) port 7890
> POST http://localhost:8080/api/v1/p4qGvJp3443cotHE0JfY/telemetry HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/8.7.1
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Type:application/json
> Content-Length: 16
>
* upload completely sent off: 16 bytes
< HTTP/1.1 200
< Content-Length: 0
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Connection: keep-alive
< Date: Wed, 02 Jul 2025 02:09:04 GMT
< Expires: 0
< Keep-Alive: timeout=4
< Pragma: no-cache
< Proxy-Connection: keep-alive
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-Xss-Protection: 0
<
* Connection #0 to host 127.0.0.1 left intact

说明调用成功

5、新设备自注册

现在 http://localhost:8080/profiles/deviceProfiles 编辑 设备预配置,设置 预配置策略 为允许创建新设备,保存后可以看到 provisionDeviceKey 和 provisionDeviceSecret。

然后,运行下面命令注册一个新设备,名称为 test-device-001

curl -X POST http://localhost:8080/api/v1/provision \
-H "Content-Type: application/json" \
-d '{
"deviceName": "test-device-001",
"provisionDeviceKey": "a22x2lalyyvc65v3vtib",
"provisionDeviceSecret": "8km4t2qotcg3thmqyvb8"
}'

返回结果如下:

{"credentialsValue":"K7KW5LFwRD4IBTUJ734L","credentialsType":"ACCESS_TOKEN","status":"SUCCESS"}

表明注册成功。在 http://localhost:8080/entities/devices 可以看到新注册的设备。

6、设备声明

a、设备声明(设备端/现场激活)

curl -X POST http://localhost:8080/api/v1/K7KW5LFwRD4IBTUJ734L/claim \
-H "Content-Type: application/json" \
-d '{
"secretKey": "mySecret",
"durationMs": 60000
}'

b、创建客户用户并用其认领设备(平台/客户侧)

获取客户用户 Token

TOKEN=`curl -s -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"username":"customer@thingsboard.org", "password":"customer"}' 'http://localhost:8080/api/auth/login'|jq -r .token`

客户用户认领设备

curl -X POST "http://localhost:8080/api/customer/device/test-device-001/claim" \
-H "Content-Type: application/json" \
-H "X-Authorization: Bearer $TOKEN" \
-d '{
"secretKey": "mySecret"
}'

c、回收设备(取消认领)

curl -X DELETE http://localhost:8080/api/customer/device/test-device-001/claim \
-H "Content-Type: application/json" \
-H "X-Authorization: Bearer $TOKEN"

二、HTTP Transport 实现方式

1. 架构与入口

2. 核心模块与类

3. 典型接口说明

  1. 设备自动注册(Provision)

  1. 设备声明(Claim)

  1. 属性上报

  1. 属性获取

  1. 遥测数据上报

  1. 设备固件下载

  1. 设备软件包下载

  1. 订阅属性/命令(长轮询,已不推荐)

  1. 回复命令

  1. 发送命令到平台

4. 请求认证与安全

5. 典型流程举例

  1. 设备首次上线,调用 /api/v1/provision,获取 token。
  2. 设备定期调用 /api/v1/{deviceToken}/telemetry 上报数据。
  3. 设备定期调用任意接口(如上报属性、数据),保持“在线”状态。
  4. 长时间未请求,平台自动判定设备下线。

6. 测试与调试建议

7. 设计启示


三、设备自动注册

1. 整体流程概述

  1. 设备通过 HTTP POST /api/v1/provision 发起注册请求。
  2. HTTP 控制器解析请求并转发到 Transport Service。
  3. Transport Service 将注册请求通过消息队列发送到 Core Service。
  4. Core Service 消费注册消息,分发到注册业务实现。
  5. 注册业务处理(校验、查找/创建设备、生成凭证)。
  6. 处理结果通过消息队列回传,最终响应给设备。

2. 详细调用链

3. 调用链时序图

sequenceDiagram
    participant Device as 设备
    participant HTTP as DeviceApiController
    participant TS as TransportService
    participant MQ as 消息队列
    participant Core as Core Service
    participant Handler as DefaultTransportApiService
    participant DPS as DeviceProvisionServiceImpl
    Device ->> HTTP: POST /api/v1/provision
    HTTP ->> TS: process(provisionRequest)
    TS ->> MQ: 发送注册消息
    MQ ->> Core: Core Service 消费消息
    Core ->> Handler: handle(msg)
    Handler ->> DPS: provisionDevice(provisionRequest)
    DPS -->> Handler: 返回注册结果
    Handler -->> Core: 返回处理结果
    Core -->> MQ: 发送注册结果
    MQ -->> TS: 回传注册结果
    TS -->> HTTP: 回调 DeviceProvisionCallback
    HTTP -->> Device: 返回注册响应

4. 核心设计要点

5. 相关核心类

6. DeviceProvisionServiceImpl 逻辑

DeviceProvisionServiceImpl 是 ThingsBoard 设备自动注册的核心业务实现类,主要负责校验 key/secret、查找/创建设备、生成凭证、推送事件等。

  1. 主要方法
  1. 关键点说明

四、设备声明

1. 典型业务流程

  1. 设备注册/自动注册
    • 设备通过 /api/v1/provision 或平台后台预注册,成为平台已知设备。
  2. 设备声明(Claim)
    • 设备端或客户用户通过声明接口,将设备归属到指定客户名下。
  3. 设备回收(Unclaim)
    • 客户用户可主动回收设备,设备归属权解除。

2. 接口与调用链

1. 设备端声明(现场激活)

2. 客户用户认领设备(平台/客户侧)

3. 设备回收(Unclaim)

3. 时序图(平台侧认领)

a、设备端声明(现场激活)

sequenceDiagram
    participant Device as 设备
    participant HTTP as DeviceApiController
    participant TS as TransportService
    participant MQ as 消息队列
    participant Core as Core Service
    participant Service as ClaimService
    participant DB as 数据库

    Device->>HTTP: POST /api/v1/{deviceToken}/claim
    HTTP->>TS: process(claimRequest)
    TS->>MQ: 发送声明消息
    MQ->>Core: Core Service 消费消息
    Core->>Service: 校验 token、参数、业务处理
    Service->>DB: 查找设备、保存密钥

    Service-->>Core: 返回结果
    Core-->>MQ: 发送处理结果
    MQ-->>TS: 回传处理结果
    TS-->>HTTP: 回调 DeviceClaimCallback
    HTTP-->>Device: 返回声明响应

b、平台侧认领(客户用户认领设备)

sequenceDiagram
    participant User as 客户用户
    participant API as DeviceController
    participant Service as ClaimService
    participant DB as 数据库

    User->>API: POST /api/customer/device/{deviceName}/claim
    API->>Service: 校验权限、参数
    Service->>DB: 查找设备、校验密钥
    Service->>DB: 更新设备归属
    Service-->>API: 返回结果
    API-->>User: 返回声明响应

4. 核心实现要点

五、总结

1. 设备注册同步调用时序图

设备注册(同步调用)时序图如下:

sequenceDiagram
    participant Device as 设备
    participant HTTP as DeviceApiController
    participant Service as DeviceProvisionServiceImpl
    participant DB as 数据库

    Device->>HTTP: POST /api/v1/provision
    HTTP->>Service: provisionDevice(provisionRequest)
    Service->>DB: 查找/创建设备、校验 key/secret
    Service->>DB: 生成凭证、保存注册状态
    Service-->>HTTP: 返回注册结果
    HTTP-->>Device: 返回注册响应

核心变化说明

2. ThingsBoard 和阿里设备注册校验过程对比

1. ThingsBoard 设备注册校验过程

注册方式

  1. 平台根据 provisionDeviceKey 查找设备配置(Device Profile)。

  2. 校验 provisionDeviceSecret 是否与 profile 中配置一致。

  3. 校验通过后,允许注册/创建设备,生成访问凭证(如 access token)。

  4. 支持多种注册策略(如仅允许预注册、允许自动创建设备等)。

密钥管理

认证机制

2. 阿里云设备注册校验过程

3. 主要区别对比

对比项ThingsBoard阿里云 IoT(物联网平台)
注册接口/api/v1/provision动态注册 API(/auth/register)
密钥管理主要为一型一密(profile 级别)支持一型一密和一机一密
动态注册支持,注册后生成 access token支持,注册后生成 DeviceSecret
认证方式URL token三元组(ProductKey/DeviceName/DeviceSecret)+ 签名
密钥传递位置URL 路径参数header/body(签名)
安全性依赖 HTTPS,token 易被日志等记录,泄露风险较高密钥不直接传输,签名防重放,安全性更高
预注册可选,支持预注册和自动创建设备一机一密必须预注册
典型场景通用物联网平台大规模设备自动化、工业/消费物联网

thingsboard 设备 HTTP 相关接口:

  1. 设备自动注册(Provision):POST /api/v1/provision
  2. 设备声明(Claim):POST /api/v1/{deviceToken}/claim
  3. 属性上报:POST /api/v1/{deviceToken}/attributes
  4. 属性获取:GET /api/v1/{deviceToken}/attributes
  5. 遥测数据上报:POST /api/v1/{deviceToken}/telemetry
  6. 设备固件下载:GET /api/v1/{deviceToken}/firmware?title=xxx&version=yyy
  7. 设备软件包下载:GET /api/v1/{deviceToken}/software?title=xxx&version=yyy
  8. 订阅属性/命令(长轮询,已不推荐):GET /api/v1/{deviceToken}/attributes/updatesGET /api/v1/{deviceToken}/rpc
  9. 回复命令:POST /api/v1/{deviceToken}/rpc/{requestId}
  10. 发送命令到平台:POST /api/v1/{deviceToken}/rpc

阿里云设备 http 相关接口:

4. 总结


RuoYi AI 源码分析
Thingsboard源码中的OAuth2登录实现