1. 设备管理
ThinkLink 支持多种设备类型的统一接入与管理。设备数据来源不限于 LoRaWAN——任何符合 ThinkLink 协议的 MQTT 数据均可对接,包括通过第三方网关或 DTU 桥接的 Modbus、RS-485 设备。
设备类型概览
| 设备类型 | device_type | 说明 |
|---|---|---|
| 普通设备 | NORMAL | 直接通过 LoRaWAN 或 MQTT 上报数据的终端。数据来源(data_from)可以是 LoRaWAN 或 OTHER(符合 ThinkLink 协议的 MQTT 设备) |
| 子设备 | SUB_DEVICE | 由 EdgeBus(EB)等父设备抄读后自动生成的虚拟终端。每个被抄表设备对应一个子设备,父设备持有其 EUI 映射 |
| 资产 | VIRTUAL | 将多台设备的数据聚合为一个逻辑实体,如"一层楼的总用电量"或"一个房间的平均温湿度" |
数据来源(
data_from):
LoRaWAN:经 ThinkLink NS 接入的 LoRaWAN 标准设备,需先创建 LoRaWAN 档案OTHER:通过 MQTT 直接推送数据的第三方设备,只要报文格式符合 ThinkLink AS 协议即可,无需 LoRaWAN 档案
1.1. LoRaWAN 设备档案
LoRaWAN 设备档案(Profile)是 NS 层的身份配置,用于设备入网鉴权(AppKey/AppSKey/NwkSKey)和通信参数管理。档案和设备是两个独立对象:档案控制 NS 层是否允许该设备入网,设备控制数据处理层(物模型/RPC/数据存储)。同一个 devEUI 在档案中存在才能完成 Join;档案 enable=false 则 NS 不响应该设备。
1.1.1. ABP 与 OTAA 的区别
LoRaWAN 支持两种入网方式,决定了档案中需要填写哪些密钥字段:
| 对比项 | ABP(Activation By Personalization) | OTAA(Over-The-Air Activation) |
|---|---|---|
| 入网方式 | 设备出厂时预置固定的 DevAddr 和会话密钥,无需 Join 流程 | 设备上电时通过 Join Request / Join Accept 动态协商会话密钥 |
| 所需密钥 | devAddr(设备地址)+ apps_key(应用会话密钥)+ nwks_key(网络会话密钥) | app_key(应用主密钥)即可,DevAddr 由 NS 动态分配 |
| 配置稳定性 | DevAddr 和密钥固定,重启后无需重新入网 | 每次 Join 后密钥刷新,安全性更高但需要 NS 在线完成握手 |
| 适用场景 | 固定布点、网络环境简单、要求快速上线或批量预配置 | 安全要求较高、需要长期运维、设备需要在不同网络间迁移 |
推荐使用 ABP:对于大多数物联网项目,ABP 配置更简单,设备重启或断网后无需重新入网,批量部署时只需提前录入 DevAddr 和两个会话密钥即可。若使用 OTAA,设备每次重新入网都需要与 NS 完成 Join 握手,在网络不稳定时可能导致入网失败。
ABP 模式必填字段:
| 字段 | 说明 |
|---|---|
devEui | 设备唯一标识,全局不可重复 |
devAddr | 设备地址(4 字节 hex,如 32015019),在同一网络内不可冲突 |
apps_key | 应用会话密钥(16 字节 hex),用于加解密应用层数据 |
nwks_key | 网络会话密钥(16 字节 hex),用于 MIC 校验和 MAC 命令加密 |
OTAA 模式必填字段:
| 字段 | 说明 |
|---|---|
devEui | 设备唯一标识,全局不可重复 |
app_key | 应用主密钥(16 字节 hex),Join 过程中用于派生会话密钥 |
1.1.2. 新增单个 LoRaWAN 设备档案

所有字段说明如下:
| 字段名 | 是否必填 | 说明 |
|---|---|---|
devEui | 必填 | 设备唯一标识符(EUI),全局唯一,不可重复 |
join_mode | 必填 | 入网模式:ABP(预置密钥,推荐)或 OTAA(动态入网) |
devAddr | ABP 模式下必填 | 设备地址,确保在网络中不冲突 |
apps_key | ABP 模式下必填 | 应用会话密钥(16 字节 hex) |
nwks_key | ABP 模式下必填 | 网络会话密钥(16 字节 hex) |
app_key | OTAA 模式下必填 | 应用主密钥(16 字节 hex) |
enable | 必填(默认 TRUE) | NS 是否响应该设备的入网请求和上行数据。设为 FALSE 可静默禁用设备,不影响设备侧数据记录 |
down_enable | 必填(默认 TRUE) | 是否允许 NS 向设备下发数据 |
lw_ver | 必填(建议 1.0.2) | LoRaWAN 协议版本,兼容大多数 1.0.3 和部分 1.0.4 地区协议 |
standard | 必填 | 频段标准:CN470 / EU433 / EU868 / AS923 / AU915 / US902 |
class_mode | 必填(默认 ClassA) | 正常工作模式:ClassA(低功耗,上行后开窗) 或 ClassC(持续接收,需常供电) |
join_class_mode | 必填(默认 ClassA) | 重入网后的工作模式,应与设备实际行为一致 |
rx1dr_offset | 必填(按频段自动填充) | RX1 窗口 DR 偏移量 |
rx2dr | 必填(按频段自动填充) | RX2 窗口传输速率 |
rx_delay | 必填(默认 1) | 上行后第一个下行窗口的延迟(秒) |
rx_delay_join | 必填(默认 5) | Join 流程中的下行响应延迟(秒) |
rx2_freq | 必填(按频段自动填充) | RX2 接收窗固定频率 |
提示:选定正确的
standard和lw_ver后,rx1dr_offset、rx2dr、rx_delay、rx_delay_join、rx2_freq均自动填充默认值,无需手动调整。
档案与设备的关系:设备档案是 NS 层的鉴权配置,设备是数据处理层的管理实体。两者通过
devEUI关联。添加设备时在"数据来源"中选择LoRaWAN,并绑定对应档案即可。同一设备的档案在同一时间只应在一个平台(云平台/TKG/TKE)中处于启用状态,否则会导致入网冲突。
1.1.3. 批量导入 LoRaWAN 设备档案(Excel)
导入:
- 下载模板文件(参考示例:mt_sdev_pf_macs--1756347416255.xlsx)
- 按字段要求填写设备信息(ABP 填
devAddr/apps_key/nwks_key,OTAA 填app_key) - 点击"导入"上传 Excel 文件,系统自动批量创建档案
导出:
在 LoRaWAN 档案列表页点击"导出",可将当前所有档案导出为 Excel 文件,用于备份或在另一部署实例批量导入。
1.1.4. 从远程平台同步档案(Remote Pull)
在分布式部署场景(TKG 网关本地 NS / TKE 边缘服务器)中,设备 LoRaWAN 档案通常在中央平台录入,本地实例可以通过远程数据拉取功能将档案同步到本地 NS:
- 进入高级功能 → 远程数据拉取(详见 远程数据拉取)
- 配置上游地址和
secret_key - 在拉取列表中选择 LoRaWAN 档案,点击拉取
- 系统将上游的档案数据同步写入本地,已存在相同
dev_eui的档案会被覆盖更新
适用场景:工程师在云平台录入完整设备档案后,现场网关一键同步,无需在本地逐一重新录入。
1.1.5. 通过模板新增 LoRaWAN 设备
当需要批量新增同型号的 LoRaWAN 设备时,可以先创建设备配置模板,再通过模板快速建立设备:
- 在设备管理页面点击"新增"
- 填写设备
EUI(必填)和名称(可选) - 选择已创建好的配置模板(包含物模型、RPC、属性等默认配置)
- 数据来源选择
LoRaWAN - 提交后系统自动检测该 EUI 是否已有 LoRaWAN 档案:
- 已有档案:直接创建设备并应用模板配置
- 无档案:弹出提示,可选择"立即添加"跳转到档案配置页,或"稍后添加"先保存设备
提示:配置模板预置了物模型、RPC、服务端属性、共享属性、标签等内容,同一型号的设备只需在新增时选择同一模板,无需逐一手动配置。
1.1.6. 通过模板重置设备
将已有设备的全部配置还原为指定模板的默认值:
- 在设备管理列表勾选一台或多台设备
- 点击批量操作中的"通过模板重置"
- 在弹窗中选择目标配置模板
- 确认后,所选设备的以下配置将被覆盖为模板的内容:
| 重置内容 | 说明 |
|---|---|
物模型(thing_model) | 替换为模板绑定的物模型列表 |
RPC(rpc) | 替换为模板绑定的 RPC 列表 |
触发器(trigger) | 替换为模板绑定的触发器列表 |
共享属性(shared_attrs) | 重置为模板中各字段的默认值 |
服务端属性(server_attrs) | 重置为模板中各字段的默认值 |
标签(tags) | 替换为模板的标签 |
心跳周期(heart_period) | 替换为模板值 |
| 实时存储、ThingsBoard、BACnet 等开关 | 替换为模板配置 |
注意:设备的
EUI、名称、数据来源(data_from)和 LoRaWAN 档案不会被重置,保持原有值不变。此操作不可撤销,请确认选择了正确的模板。
档案与设备的关系:下行能力说明
⚠️ 仅有档案,无法下行。
LoRaWAN 档案只负责 NS 层的入网鉴权,控制设备能否上报数据。RPC 下行是数据处理层的能力,必须先在设备管理中创建对应设备,并为该设备挂载 RPC 模型,才能向设备下发指令。
快速下行方法:如果只需要发送原始下行数据,无需自定义 RPC,可以在新增设备时选择系统内置的
DEFAULT模板,该模板已预挂载系统内置 RPCmt_act_dn_data。挂载后直接在设备详情的 RPC Tab 中执行该 RPC,填写port(FPort)和data(hex 字符串)即可完成一次 LoRaWAN 下行发送。
1.2. 新增设备
1.2.1. 新增单个设备

| 字段 | 说明 |
|---|---|
| EUI | 设备唯一编号,在 ThinkLink 系统内必须全局唯一 |
| 名称 | 用户自定义的设备名称 |
| 设备类型 | 设备(普通/子设备)或 资产(虚拟聚合设备) |
| 数据来源 | LoRaWAN:经 ThinkLink NS 接入;OTHER:通过 MQTT 直接推送,符合 ThinkLink 协议即可 |
| 配置模板 | 选择预设模板可快速绑定物模型、RPC 等配置,批量上线同型号设备时推荐使用 |
非 LoRaWAN 设备接入:选择数据来源为
OTHER的设备,只需保证上报的 MQTT 报文格式符合 ThinkLink AS 协议,无需绑定 LoRaWAN 档案。适用于通过 DTU、Modbus 网关或自定义 MQTT 客户端接入的设备。
1.2.2. 批量增加设备
- 勾选已有设备,点击"导出"下载模板
- 填写或修改其他设备信息,必须填写
EUI字段 - 删除不需要修改的列
- 执行批量导入:
- 系统中已存在相同 EUI → 更新该设备参数
- 不存在该 EUI → 作为新设备添加
⚠️ 确保每个设备的 EUI 唯一且准确。
1.2.3. 一次性 RPC(批量下发指令)
一次性 RPC 用于临时批量向一组设备下发同一条指令,执行后即销毁,不保留定时任务记录。适合批量修改设备参数(采样间隔、阈值)或触发某次性操作(重启、清零、校准)。
操作步骤:
- 在设备管理列表勾选一台或多台目标设备
- 点击批量操作中的"一次性 RPC 执行"
- 在弹窗中填写:
- 名称:本次执行任务的描述性名称(便于在执行记录中识别)
- 设备间发送间隔(ms):相邻两台设备之间的下发间隔,用于避免瞬时并发过高,默认可留空
- RPC 及参数:选择要执行的 RPC 模型,并填写对应参数
- 点击"提交",系统立即开始逐台下发,弹窗内实时展示进度条(当前/总数)
查看执行中的任务:
点击批量操作中的"查看执行任务"可打开任务监控面板,其中列出所有正在运行的一次性 RPC 任务,显示任务名称、开始时间和实时进度。若需提前终止,点击对应任务的"中断"按钮。
与多设备 RPC 的区别:多设备 RPC(在配置管理菜单下)支持保存任务、定时执行和重复触发;一次性 RPC 仅做一次临时执行,不保存任何配置。
1.2.4. 批量修改设备配置
批量修改功能可以对已选中的多台设备统一变更指定配置,仅修改勾选的字段,未勾选的字段保持原有值不变。
操作步骤:
- 在设备管理列表勾选需要修改的设备
- 点击批量操作中的"批量修改参数"
- 在分步向导中逐步配置,每步都可以单独设置要修改的内容:
| 步骤 | 可修改内容 |
|---|---|
| 基本信息 | 名称、设备类型、心跳周期、实时存储、ThingsBoard/BACnet/HomeAssistant 开关。每项旁边有勾选框,只有打勾的项才会被修改 |
| 修改物模型 | 向所选设备新增物模型(穿梭框左→右),或从所选设备删除物模型(穿梭框左→右) |
| 修改 RPC | 向所选设备新增或删除 RPC 绑定 |
| 修改触发器 | 向所选设备新增或删除触发器绑定 |
| 修改服务端属性 | 新增键值对(支持设置数据类型和默认值),或删除现有的属性键 |
| 修改共享属性 | 新增键值对,或删除现有的属性键 |
| 删除遥测数据 | 按物模型粒度删除该物模型对应的遥测数据记录 |
| 修改标签 | 新增标签(输入后回车)或删除已有标签 |
| 提交确认 | 展示将被修改的设备列表,确认无误后提交 |
- 完成所有步骤后点击"提交",系统将变更同步到所选设备
注意:步骤之间可以点击顶部的步骤标题自由跳转。物模型/RPC/触发器的新增和删除是增量操作(不影响设备已有的其他绑定),不会清空整个列表。
1.3. 设备详情

1.3.1. 物模型(Thing Model)
物模型 Tab 展示该设备已绑定的所有物模型,以及每个物模型来自哪个作用域(PUBLIC 公共模型或当前租户私有模型)。
在此 Tab 可以:
- 新增:点击「新增」,从物模型列表中选择并挂载到该设备。一个设备可挂载多个物模型,每个物模型对应独立的 payload 解析脚本,解析结果写入各自名下的遥测数据分区
- 删除:移除不再需要的物模型绑定(不删除物模型本身,只解除关联)
物模型的作用:
- 负责将设备上报的原始 payload 解析为结构化数据(温度、湿度、电量、状态位等)
- 每个物模型有独立的 JavaScript 解析脚本,脚本返回
telemetry_data、server_attrs、shared_attrs等字段 - 资产设备(
VIRTUAL)的物模型脚本接收来自关联源设备的数据通知,用于聚合计算
物模型的定义和脚本编写详见 → 物模型
1.3.2. RPC
RPC Tab 展示该设备已绑定的所有 RPC 模型,可在此直接下发指令。
在此 Tab 可以:
- 新增:绑定已定义的 RPC 模型到该设备,支持绑定多个
- 删除:解除 RPC 绑定
- 执行:点击列表中每条 RPC 右侧的「执行」按钮,即可向该设备下发指令:
- 无参数 RPC:直接发送,无需确认
- 有参数 RPC:弹出参数输入框,填写后点击确认发送;参数默认值可从
shared_attrs/server_attrs中读取
RPC 的三个执行入口:
| 入口 | 位置 | 适用场景 |
|---|---|---|
| 设备配置 → RPC Tab | 运维管理 → 设备管理 → 详情 → RPC | 针对单台设备手动下发,调试或日常操作 |
| 应用数据 → 操作列 | 数据 → 应用数据 → 实时数据列表右侧 | 在查看实时数据时快速对指定设备下发 RPC |
| 仪表盘组件 | 仪表盘上配置了 RPC 按钮的卡片 | 运维人员通过仪表盘执行常规操作(如开关阀门、复位设备) |
绑定到设备执行(定时调度):
除手动「执行」外,RPC 列表新增了**「绑定的设备执行」** 列,可把该 RPC 加入一个设备执行任务,从而按定时任务周期自动下发,无需人工触发:
- 已绑定的设备执行以标签形式展示,点击标签可打开对应的设备执行配置抽屉
- 点击虚线标签 「+ 添加到设备执行」,从下拉菜单中选择:
- 新建设备执行:打开设备执行配置抽屉,自动带入当前 RPC 与当前设备的 EUI,可继续选择定时任务、执行类型(无限次/固定次数)、设备间发送间隔等并保存
- 添加到已有:把当前设备追加到一个已存在的设备执行任务中
- 仅已绑定到当前设备的 RPC 才能添加到设备执行(未绑定时会提示先在 RPC 列表中绑定)
RPC 模型的定义(指令格式、参数模板)详见 → RPC 模型
1.3.3. 服务端属性(Server Attributes)
服务端属性是由平台侧维护的键值对,与设备上报的遥测数据完全独立,设备侧不感知这些值。
在此 Tab 可以:
- 新增属性:填写 key 名称、初始值,以及元数据(数据类型、单位、别名、备注、关联 RPC)
- 编辑属性值:直接修改已有属性的值,修改后立即生效
- 删除属性:移除不需要的键
服务端属性的用途:
| 用途 | 说明 |
|---|---|
| 逻辑判断参数 | 物模型脚本通过 device.server_attrs 读取,参与计算或告警判断(如阈值上限、系数) |
| RPC 执行参数 | RPC 模板中可引用 server_attrs 字段作为默认参数值 |
| 跨设备状态缓存 | 资产设备用 server_attrs 缓存每台源设备的最新读数,用于聚合计算 |
| 运维标记 | 记录设备安装位置、负责人、维保日期等业务字段,不影响数据处理逻辑 |
属性元数据字段:
| 字段 | 说明 |
|---|---|
type | 数据类型(string / number / boolean),影响编辑框的展示形式 |
unit | 单位(如 ℃、kWh),仅展示用 |
alias | 别名,在仪表板/告警中以更友好的名字显示 |
remark | 备注,写给操作人员看的使用说明 |
rpcs | 关联的 RPC ID 列表,点击属性旁的快捷按钮可直接触发对应 RPC |
order | 排列顺序,数字越小越靠前 |
1.3.4. 共享属性(Shared Attributes)
共享属性是服务端与设备侧双向同步的键值对,是平台向设备下传配置参数的核心机制。
在此 Tab 可以:
- 新增属性:同服务端属性,支持同样的元数据字段
- 编辑属性值:修改后平台通过 LoRaWAN 下行或 MQTT 将新值推送给设备
- 删除属性:移除不需要的键
共享属性与服务端属性的区别:
| 对比项 | 共享属性(Shared Attrs) | 服务端属性(Server Attrs) |
|---|---|---|
| 同步方向 | 服务端 ↔ 设备侧双向同步 | 仅平台侧维护,设备不感知 |
| 典型用途 | 采样间隔、工作模式、OTA 升级标记 | 阈值、系数、运维标记 |
| 设备读取 | 设备可主动请求或接收推送 | 设备无法直接读取,只能通过脚本传递 |
| 修改触发下行 | 是,平台修改后会推送给设备 | 否 |
1.3.5. 遥测数据(Telemetry Data)
遥测数据 Tab 以物模型为分组,实时展示每个物模型最近一次解析后产生的所有字段值及其时间戳。
在此 Tab 可以:
- 查看实时值:打开设备详情后,遥测数据会通过 MQTT 实时推送更新,无需手动刷新
- 删除遥测记录:可按物模型整组删除该物模型产生的遥测数据(用于重置数据或清理测试数据)
历史遥测数据的查询和图表展示在 → 历史数据
1.3.6. 设备关联

建立设备间的数据通知拓扑:源设备(数据上报方)→ 目标设备(接收通知并聚合处理方)。
| 变更类型 | 触发时机 |
|---|---|
| 遥测数据 | 源设备上报新的 telemetry |
| 共享属性 | 平台或设备修改 shared attributes |
| 服务端属性 | 业务系统修改 server attributes |
目标设备的物模型脚本在收到通知时自动执行,msg 参数中包含源设备的 EUI 和最新数据。
术语对应:界面显示"绑定主设备 / 从设备",对应内部键
bind-master-device/bind-slave-device。"源设备"= 旧称"从设备 / slave","目标设备"= 旧称"主设备 / master"。
1.4. 子设备
子设备(SUB_DEVICE)是 EdgeBus 等父设备在抄表时自动生成的虚拟终端。父设备(DTU/EB 编译器)通过 RS-485、Modbus 等协议轮询多台从机,物模型脚本解析出每台从机的数据时,通过 result.sub_device 字段指定子设备标识,系统自动为每个标识创建并维护一个独立的子设备。
运作机制
- 父设备(NORMAL 类型,
data_from=LoRaWAN或OTHER)上报数据 - 物模型脚本解析 payload,对每台被采集设备返回一个包含
sub_device字段的结果 - 系统检查父设备的
server_attrs中是否已有该sub_device标识的 EUI 映射 - 无映射时自动生成新的 EUI,创建子设备并建立父子关联
- 子设备独立持有遥测数据、属性、物模型,可单独配置告警和 RPC
// 物模型脚本示例:父设备抄读 3 台 Modbus 从机
// payload 中按设备地址区分数据
let results = [];
// 1 号从机:温湿度传感器(地址 0x01)
results.push({
sub_device: "addr_01", // 子设备标识(同一父设备内唯一)
telemetry_data: {
temperature: payload.readInt16BE(2) / 10,
humidity: payload.readInt16BE(4) / 10,
}
});
// 2 号从机:电表(地址 0x02)
results.push({
sub_device: "addr_02",
telemetry_data: {
energy_kwh: payload.readUInt32BE(6) / 100,
power_w: payload.readUInt16BE(10),
}
});
// 3 号从机:CO₂ 传感器(地址 0x03)
results.push({
sub_device: "addr_03",
telemetry_data: {
co2_ppm: payload.readUInt16BE(12),
}
});
return results;最佳实践
- 子设备 EUI 由系统自动生成,不需要手动分配
- 父设备定义物模型时将
apply_to设为SUB_DEVICE,让系统路由到正确的子设备 - 子设备可单独绑定物模型、RPC、触发器,实现精细化告警和控制
- EdgeBus 场景下,每个 EB APP 抄读的每台从机都会生成一个子设备,子设备数量 = 父设备 × 从机数量
1.5. 资产
资产(VIRTUAL)是将多台设备的遥测数据汇聚为一个高层次逻辑实体的虚拟设备,适用于:
- 统计聚合:一层楼的总用电量、一个区域的平均温湿度
- 多维监控:一台综合仪表同时暴露多个监控指标
- 跨设备联动:多个传感器共同决定某个输出状态
资产本身不需要物理设备上报数据,它通过设备关联订阅一组源设备的变更,当任意源设备数据更新时,资产的物模型脚本自动触发计算。
最佳实践示例
示例一:楼层总用电量统计
场景:某楼层安装了 8 台单相电表(通过 EB 子设备上报),资产设备代表该楼层的聚合用电视图。
// 资产物模型脚本(数据来源:8 台电表的 telemetry)
if (!noticeAttrs.telemetry_data) {
return { telemetry_data: null, server_attrs: null, shared_attrs: null };
}
// server_attrs 中存储每台电表的最新读数(以 msg.eui 为 key)
let perMeterAttrs = device.server_attrs || {};
// 更新当前上报设备的读数
perMeterAttrs[msg.eui] = {
energy_kwh: msg.telemetry_data[msg.thing_model[0]]?.energy_kwh ?? 0
};
// 汇总所有已知电表的用电量
let totalEnergy = Object.values(perMeterAttrs)
.reduce((sum, m) => sum + (m.energy_kwh || 0), 0);
return {
telemetry_data: { total_energy_kwh: Math.round(totalEnergy * 100) / 100 },
server_attrs: perMeterAttrs,
shared_attrs: null,
};示例二:房间平均温湿度
场景:一个会议室安装了 4 台温湿度传感器,资产代表该房间的环境均值。
if (!noticeAttrs.telemetry_data) {
return { telemetry_data: null, server_attrs: null, shared_attrs: null };
}
// 以 server_attrs 缓存每台传感器的最新读数
let sensorCache = device.server_attrs || {};
sensorCache[msg.eui] = {
t: msg.telemetry_data[msg.thing_model[0]]?.t,
h: msg.telemetry_data[msg.thing_model[0]]?.h,
};
// 计算有效读数的平均值(过滤 null)
let temps = Object.values(sensorCache).map(s => s.t).filter(v => v != null);
let hums = Object.values(sensorCache).map(s => s.h).filter(v => v != null);
let avgT = temps.length ? temps.reduce((a, b) => a + b, 0) / temps.length : null;
let avgH = hums.length ? hums.reduce((a, b) => a + b, 0) / hums.length : null;
return {
telemetry_data: {
avg_temperature: avgT != null ? Math.round(avgT * 10) / 10 : null,
avg_humidity: avgH != null ? Math.round(avgH * 10) / 10 : null,
sensor_count: temps.length,
},
server_attrs: sensorCache,
shared_attrs: null,
};示例三:设备在线率统计
场景:监控一组设备中有多少台在线(心跳超时视为离线)。
if (!noticeAttrs.telemetry_data && !noticeAttrs.server_attrs) {
return { telemetry_data: null, server_attrs: null, shared_attrs: null };
}
let now = Date.now();
let onlineThreshold = 15 * 60 * 1000; // 15 分钟无上报视为离线
let statusCache = device.server_attrs || {};
statusCache[msg.eui] = { last_seen: now };
let total = Object.keys(statusCache).length;
let online = Object.values(statusCache)
.filter(s => (now - s.last_seen) < onlineThreshold).length;
return {
telemetry_data: {
total_devices: total,
online_devices: online,
online_rate: total ? Math.round(online / total * 100) : 0,
},
server_attrs: statusCache,
shared_attrs: null,
};1.6. Modbus TCP 对接
ThinkLink 内置 Modbus TCP Server,可将设备遥测数据和属性暴露为标准 Modbus 寄存器,供 SCADA/HMI 读取;第三方系统写寄存器时也可触发 RPC 下发指令。
详细配置步骤、寄存器映射说明和点表导出方法请参阅 → Modbus TCP Server
在设备详情的基本信息 Tab 中将 modbus_tcp 开关设为 TRUE 即可为该设备启用 Modbus 映射。
1.7. 设备关联关系(Relation)
在设备详情页的设备关联 Tab 中,可以管理当前设备与其他设备之间的数据通知关系。关联关系存储在 device_relation 表中,每条关系记录:
| 字段 | 说明 |
|---|---|
from_eui | 源设备 EUI(数据上报方,旧称"从设备") |
to_eui | 目标设备 EUI(接收通知方,旧称"主设备") |
notify_fields | 触发通知的属性类型列表:telemetry_data / shared_attrs / server_attrs |
params | 扩展参数(可选) |
当 from_eui 对应设备的 notify_fields 中任一类型的数据发生变更时,ThinkLink 会将变更数据推送给 to_eui 对应设备的物模型脚本进行处理,msg 参数中包含源设备的全量数据快照。
资产 + 关联关系 是 ThinkLink 实现多设备数据聚合的核心机制,不依赖外部脚本调度,完全在平台内驱动。
1.8. 设备租户迁移
将设备从一个租户迁移到另一个租户,需要分别迁移两个独立对象:LoRaWAN 档案(NS 层鉴权配置)和设备记录(数据处理层管理实体)。
非 LoRaWAN 设备(
data_from = OTHER)没有 LoRaWAN 档案,可直接跳到第 3 步。
第 1 步:从原租户导出并删除 LoRaWAN 档案
- 进入原租户的运维管理 → 设备管理 → LoRaWAN 档案
- 点击导出,将当前所有档案下载为 Excel 文件
- 打开文件,核实内容完整、包含所有待迁移设备的档案记录
⚠️ 危险操作提示: 务必在确认导出文件完整后再执行删除。若未成功导出就删除,档案中的密钥信息(AppKey / AppSKey / NwkSKey)将永久丢失,无法找回。
- 勾选待迁移的档案条目,点击删除
第 2 步:在新租户下导入 LoRaWAN 档案
- 切换到目标租户
- 进入运维管理 → 设备管理 → LoRaWAN 档案
- 点击导入,上传第 1 步导出的 Excel 文件
第 3 步:迁移设备记录
按相同的导出 → 删除 → 导入流程完成设备记录的迁移:
- 在原租户进入运维管理 → 设备管理
- 勾选需要迁移的设备,点击导出下载设备列表
- 确认导出文件完整后,在原租户中删除这些设备
⚠️ 危险操作提示: 同样需在确认导出成功后再删除。被删除的设备记录(包括已绑定的物模型、RPC、触发器和属性配置)无法自动恢复。
- 切换到目标租户,进入运维管理 → 设备管理,点击导入上传设备列表