本指南包含分步说明,介绍如何通过T-Mobile NB IoT网络将SODAQ NB-IoT开发板连接到ThingsBoard专业版(PE)。本指南使用免费的ThingsBoard PE演示服务器thingsboard.cloud。适用于希望将SODAQ NB-IoT开发板或其他硬件连接到T-Mobile NB IoT网络的用户。
- 前置条件
- 集成概述
- 步骤1:数据转换器配置
- 步骤2. Integration配置
- 步骤3:发布遥测数据并验证集成配置
- 步骤4:T-Mobile NB-IoT平台回调配置
- 步骤5:检查集成调试事件
- 步骤6:导入规则链
- 步骤7:导入演示仪表板
- 高级配置(可选)
- 下一步
前置条件
假设您至少有一块SODAQ NB-IoT追踪器已接入T-Mobile IoT网络。 并假设您已有ThingsBoard PE服务器或免费演示账户;否则可在此注册30天免费演示:thingsboard.cloud。
建议具备ThingsBoard基础知识,请先完成入门指南。
集成概述
ThingsBoard平台集成功能可将各平台与连接方案的数据推送到ThingsBoard。 我们将使用”T-Mobile IoT CDP”平台集成,消费T-Mobile NB IoT网络数据并在ThingsBoard中自动注册设备。 除配置集成外,还将配置ThingsBoard解码上行数据、写入数据库、在仪表板中可视化并按可配置阈值告警。
<img data-gifffer=”/images/samples/sodaq/demo-dashboard.gif”alt=”演示仪表板”>
步骤1:数据转换器配置
要创建集成,需先创建上行数据转换器。 转换器会将T-Mobile NB IoT的编码十六进制遥测载荷解码为易读、简化的ThingsBoard数据格式。
- 来自T-Mobile NB IoT平台的输入数据如下所示:
1
2
{"reports": [{"serialNumber":"IMEI:0123456789","timestamp": 1547035621977,"subscriptionId":"43524b52-b924-40f0-91f0-e7fa71dca87b","resourcePath":"uplinkMsg/0/数据","值":"010145292a2bfbfc0000000000000000e6e3355c751a879de31e6535d10306005600d00402"}]
}
- 解码后的输出数据如下所示:
1
2
3
4
{"deviceName":"0123456789","deviceType":"tracker","遥测": [{"ts": 1547035622000,"values": {"batteryVoltage": 4.17,"temperature": 26,"latitude": 51.8233479,"longitude": 6.4042341,"altitude": 6,"speed": 86,"satellitesObserved": 208,"timetToFirstFix": 4
}
}]
}
需要注意以下几点:
- 上行消息中的IMEI将作为ThingsBoard中的设备名称;
- ThingsBoard会自动创建设备,类型为”tracker”,名称等于IMEI;
-
时间戳与传感器读数从上行十六进制字符串解码。
- 下表显示了传入十六进制字符串中包含的每个编码字段的第一个字节位置和字节数:
| 字段 | 首字节 | 字节长度 |
| ts | 16 | 4 |
| batteryVoltage | 20 | 1 |
| temperature | 21 | 1 |
| latitude | 22 | 4 |
| longitude | 26 | 4 |
| altitude | 30 | 2 |
| speed | 32 | 2 |
| satellitesObserved | 35 | 1 |
| timetToFirstFix | 36 | 1 |
-
进入 数据转换器 -> 添加新数据转换器 -> Import Converter
-
导入以下 json 文件:SODAQ 上行数据转换器 (left click on the link and then ‘Ctrl+S’ to download) as described on the following screencast:
<img data-gifffer=”/images/samples/sodaq/import-and-test-converter.gif”alt=”Import and test converter”>
步骤2. Integration配置
- 创建新集成,并根据下方录屏从集成窗口复制 HTTP Endpoint URL:
<img data-gifffer=”/images/samples/sodaq/import-integration.gif”alt=”Import integration”>
- Fill in the fields with the input数据shown in the following table:
| Field | Input数据 |
| 名称 | SODAQ Integration |
| 类型 | T-Mobile – IoT CDP |
| Debug mode | True |
| 上行数据转换器 | SODAQ上行数据转换器 |
| 下行数据转换器 | (空) |
| Base URL | https://THINGSBOARD_URL |
| HTTP端点URL | https://THINGSBOARD_URL/API/v1/integrations/tmobile_iot_cdp/$ROUTING_KEY |
- 填写完所有字段后,点击”添加”按钮。
步骤3:发布遥测数据并验证集成配置
在配置T-Mobile IoT平台前,先用简单命令确认ThingsBoard已正确配置。 下面将用命令模拟T-Mobile IoT平台的消息。 请注意使用步骤2中的HTTP端点URL。
为此,我们需要从SODAQ集成中复制HTTP端点URL。

下载附带的遥测数据JSON文件并执行以下命令:
1
2
curl -v -X POST -d @telemetry-data.json $HTTP_ENDPOINT_URL --header "Content-Type:application/json"
**请将$HTTP_ENDPOINT_URL替换为实际HTTP端点URL**
设备应被创建:
如不需要可删除该测试设备。
步骤4:T-Mobile NB-IoT平台回调配置
使用步骤2的HTTP端点URL,在T-Mobile平台配置将数据推送到该URL。请参考下方图示。

步骤5:检查集成调试事件
进入集成调试事件(同步骤3),再次确认真实设备的数据已到达并被成功处理。 请注意,新消息开始到达可能需要一段时间(据我们经验最多约30分钟)。
步骤6:导入规则链
本教程中我们修改了根规则链并创建了规则链追踪器告警。 目的是将所有传入的遥测数据转发到数据库中保存后,转发到追踪器告警规则链。 该规则链为每个追踪器查找单个告警阈值参数。用户可以在仪表板中配置这些参数。
下载附带的JSON文件用于追踪器告警规则链。
以下屏幕截图将演示如何导入和配置规则链:
步骤7:导入演示仪表板
下载并导入本教程附带的仪表板JSON文件。
以下屏幕截图将演示如何导入仪表板:
创建仪表板后进入追踪器详情,设置告警限值,包括:
- 最高速度
- 最低电压
- 最低温度
- 最高温度
规则链与仪表板配置完成后,可触发设备上报真实数据,验证集成与规则链是否按预期工作。 下方高级配置指南逐步说明如何配置规则链及其工作原理。 这些步骤为可选,初学者建议直接跳至下一步。
高级配置(可选)
安全
可为安全添加额外HTTP头及唯一参数。 例如在集成配置(步骤2)与T-Mobile配置(步骤4)中均添加「MY-INTEGRATION-AUTH-HEADER」并填入随机字符串值。 两处头信息须一致,数据流才能正常工作。
消息流
本节说明本教程中各节点的作用:
- 节点A:发起者属性节点。
-
该节点将消息发起者属性(客户端\共享\服务器作用域)和最新遥测值添加到消息元数据中。
- 节点B、C、D、E:过滤脚本节点。
- 这些节点具有不同的阈值测试脚本。特定脚本在条件执行时返回true,否则返回false。
- 节点F、H、G、L:创建告警节点。
- 如果发布的遥测数据不在预期范围内(过滤脚本节点返回True),则创建或更新告警。
- 节点G、I、K、M:清除告警节点。
- 如果发布的遥测数据在预期范围内(过滤脚本节点返回False),则清除告警(如存在)。
- 节点O:规则链节点。
- 将传入消息转发到指定的规则链创建和清除告警。
配置规则链
在本教程中,我们修改了根规则链并创建了规则链追踪器告警
以下屏幕截图显示上述规则链的配置如何:
- 追踪器告警:
![]()
- 根规则链:

下载附带的JSON文件用于追踪器告警规则链。
以下部分将显示如何从零开始创建追踪器告警规则链并修改根规则链。
创建新的追踪器告警规则链
转到规则链 > 添加新规则链
配置:
- 名称:追踪器告警

规则链已创建。按编辑按钮进行配置。
添加所需节点
在此规则链中,您将创建13个节点,如以下部分所述:
节点A:发起者属性
-
添加发起者属性节点并将其连接到输入节点。
该节点将用于获取消息发起者的共享属性,这些属性将直接从仪表板设置。 -
使用下表所示的输入数据填充字段:
| 字段 | 输入数据 |
| 名称 | 获取限制遥测 |
| 共享属性 | maxTemperature |
| 共享属性 | minTemperature |
| 共享属性 | maxSpeed |
| 共享属性 | minVoltage |
节点B:过滤脚本
- 添加过滤脚本节点并将其连接到发起者属性节点,关系类型为成功。
该节点将验证:”温度是否小于最高温度值”,使用以下脚本:
1
return msg.temperature > metadata.shared_maxTemperature
如果温度大于最大值,脚本将返回true,否则返回false。
- 将名称字段输入为验证最高温度。

规则节点C、D和E具有与上述规则节点相同的配置。
将下表所示的JavaScript脚本代码粘贴到相应的规则节点:
| 规则节点 | 脚本代码 |
| C:验证最低温度 | return msg.temperature < metadata.shared_minTemperature; |
| D:验证最高速度 | return msg.speed > metadata.shared_maxSpeed; |
| E:验证最低电压 | return msg.batteryVoltage < metadata.shared_minVoltage; |
节点F:创建告警
-
添加创建告警节点并将其连接到过滤脚本节点,关系类型为True。
该节点加载具有配置告警类型的最新告警。如果发布的温度超过maxTemperature值(过滤脚本节点返回True),则为消息发起者创建告警。 -
将名称字段输入为最高温度,将告警类型设置为最高温度。
-
告警详情函数:
1
2
3
4
5
6
var详情 = {};
详情.值 = msg.temperature;
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
return详情;

规则节点H、J和L具有与上述规则节点相同的配置。
将下表所示的告警类型粘贴到相应的规则节点:
| 规则节点 | 告警类型 | 脚本代码 |
| H:最低温度 | 最低温度 |
var详情 = {};
详情.值 = msg.temperature;
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
return详情; |
| J:最高速度 | 最高速度 |
var详情 = {};
详情.值 = msg.speed;
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
return详情; |
| L:最低电压 | 最低电压 |
var详情 = {};
详情.值 = msg.batteryVoltage;
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
return详情; |
节点G:清除告警
-
添加清除告警节点并将其连接到过滤脚本节点,关系类型为False。
该节点加载具有配置告警类型的最新告警。如果发布的温度小于maxTemperature值(脚本节点返回False),则清除消息发起者的告警。 -
将名称字段输入为清除告警,将告警类型设置为最高温度。
-
告警详情函数:
1
2
3
4
5
6
var详情 = {};
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
详情.clearedValue = msg.temperature;
return详情;

规则节点I、K和M具有与上述规则节点相同的配置。
将下表所示的告警类型粘贴到相应的规则节点:
| 规则节点 | 告警类型 | 脚本代码 |
| G:最低温度 | 最低温度 |
var详情 = {};
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
详情.clearedValue = msg.temperature;
return详情;
|
| I:最高速度 | 最高速度 |
var详情 = {};
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
详情.clearedValue = msg.speed;
return详情;
|
| K:最低电压 | 最低电压 |
var详情 = {};
if (metadata.prevAlarmDetails) {
详情 = JSON.parse(metadata.prevAlarmDetails);
}
详情.clearedValue = msg.batteryVoltage;
return详情;
|
修改根规则链
初始的根规则链已被修改,添加了以下节点:
节点A:过滤脚本
- 添加过滤脚本节点并将其连接到保存时间序列节点,关系类型为成功。
该节点将使用以下脚本检查消息发起者类型是否正确:
1
return metadata.deviceType === 'tracker';
- 将名称字段输入为追踪器过滤器。
![]()
节点O:规则链
-
添加规则链节点并将其连接到过滤脚本节点,关系类型为True。
该节点将传入消息转发到指定的规则链追踪器告警。 -
将名称字段输入为追踪器告警。
