1. 服务器配置
1.1. BACnet
注意:BACnet 服务功能仅支持在独立部署的 TKE设备/网关(TKG)上使用,云版本(Cloud Service)暂不提供此功能。
ThinkLink(TKL)支持将物模型中的设备数据以标准 BACnet 协议对外暴露,便于与楼宇管理系统(BMS)进行集成。要实现完整的 BACnet 服务功能,需完成以下两个步骤:
- 在物模型中对相关字段进行 BACnet 属性配置;
- 在目标设备上启用 BACnet 功能并正确配置服务器参数。
1.1.1. BACnet 字段配置
启用 BACnet 服务前,必须在物模型 中对需要对外映射的字段配置相应的 BACnet 属性。具体配置方法请参考文档第 7.1
1.1.2. 服务器配置
为使 TKL 成功作为 BACnet 服务器运行,需在系统中配置以下核心参数。服务参数位于系统管理 → 服务器配置 → BACnet;点表另在运维管理 → BACnet维护。
请确保已在设备管理 页面为对应设备开启 BACnet 服务,之后在此处完成详细配置,并将生成的 BACnet 点表导出提供给 BMS 平台使用。
2.00.077 起,平台内置 BACnet 服务。系统管理员在系统平台 → 系统配置 → 组织服务使用权限允许 BACnet 后,组织在此填写参数,先“提交”,再点“重启”。关闭全局权限会停止服务并禁止配置与点表操作;重新允许不会自动启动。保存点表会自动同步正在运行的服务,无需“应用点表”。同一进程只运行一个组织的 BACnet 服务,在另一组织启动会停止前一实例。 详见 BACnet 操作说明和2.00.079 升级说明。
以下数值供现场配置参考,不表示当前新增表单会自动填入;应读取已有配置并与 BMS 集成方确认。
| 配置项 | 说明 | 参考值 | 是否可修改 |
|---|---|---|---|
| IP 地址 | TKL 所在设备的本地 IP 地址,用于 BACnet 通信 若设为 0.0.0.0,表示绑定所有网络接口 | 0.0.0.0 | 是 |
| Port | BACnet 服务监听端口 | 47808(十进制) (即 UDP 端口 0xBAC0) | 是,可根据 BMS 要求调整 |
| Device ID | BACnet 设备唯一标识符,必须在系统内唯一 需与 BMS 平台协商一致 | 1 | 是 |
| Vendor Identifier | 厂商标识号,代表设备制造商 | 按实际厂商标识填写 | 是 |
| Device Name | 设备名称,用于在 BMS 中显示 | TKE | 是,建议按现场命名规范修改 |
| Max APDU Length Accepted | 最大可接受 APDU 长度,影响通信效率和兼容性 | 1024 | 是,根据客户端能力调整 |
| Segmentation Supported | 当前版本不通过此项启用分段传输;请与 BMS 集成方确认通信兼容性。 | 以实际表单为准 | 兼容性需现场核对 |

完成上述配置后,请进入 点表管理模块查看或导出当前设备的 BACnet 对象列表(即点表),并交付给 BMS 集成方用于接入和监控。提示:
- 修改配置后需重启 BACnet 服务或相关设备以生效。
- 建议与 BMS 集成方确认上述参数的具体要求,避免因协议不匹配导致连接失败。
- BACnet over IP 协议基于 UDP 构建,确保网络层面允许相应端口通行。
1.2. 第三方 MQTT
TKL 支持将解析后的设备遥测数据推送至第三方 MQTT Broker,使外部平台无需直接订阅 ThinkLink Broker 即可接收结构化设备数据。
1.2.1. 服务器配置
进入系统管理 → 服务器配置,找到 ThirdParty 配置区域,填写以下参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| Protocol | MQTT 连接协议 | mqtt 或 mqtts |
| Host | 第三方 Broker 地址 | 192.168.1.100 |
| Port | Broker 端口 | 1883 |
| Telemetry Topic | 发布设备遥测数据的主题 | /your/custom/topic |
| Username | Broker 认证用户名 | user |
| Password | Broker 认证密码 | pass |
填写完成后,点击提交,再点击重启以激活连接。
1.2.2. 设备层面启用
完成服务器配置后,需在目标设备上单独启用 ThirdParty 功能:
- 进入设备管理,打开目标设备;
- 在设备详情页中,启用 ThirdParty 开关;
- 保存配置。
启用后,每当设备有新数据上行时,ThinkLink 会将解析后的遥测数据推送至配置的主题。
1.3. Modbus TCP 服务器
注意:Modbus TCP Server 功能仅支持独立部署的 TKE 或 TKG 设备,云版本(Cloud Service)暂不提供此功能。
TKL 可作为 Modbus TCP 从站服务器(Slave),将设备遥测数据以 Modbus 寄存器形式对外暴露,供 SCADA 系统、PLC 及其他 Modbus TCP 主站通过标准 Modbus 协议读取设备数据。
1.3.1. 服务器配置
进入系统管理 → 服务器配置,找到 Modbus TCP Server 配置区域,配置以下参数:
| 参数 | 说明 | 默认值 | 备注 |
|---|---|---|---|
| Port | Modbus TCP 监听端口 | 502 | 确保该端口在网络层面对外开放 |
| Coils | 线圈寄存器映射(可读写位寄存器) | — | 映射设备布尔字段 |
| Discrete Inputs | 离散量输入映射(只读位寄存器) | — | 映射设备布尔字段 |
| Input Registers | 输入寄存器映射(只读 16 位字寄存器) | — | 映射设备数值字段 |
| Holding Registers | 保持寄存器映射(可读写 16 位字寄存器) | — | 映射设备数值字段 |
配置完成后,点击提交,再点击重启以启动 Modbus TCP 服务。
全局 Modbus 使用权限同样受系统配置控制:关闭会停服并阻止启动和恢复,配置与寄存器点表保留;重新允许后需手动点击“重启”。
1.3.2. 设备层面启用
Modbus TCP 寄存器的值来源于设备物模型字段。要将设备数据对外暴露:
- 在物模型中配置 Modbus TCP 字段映射;
- 在设备管理中为目标设备启用 Modbus TCP 功能。
启用后,Modbus TCP 主站即可通过配置的端口和寄存器地址读取 TKL 设备数据。
1.4. 组织参数(Org Params)
组织参数是当前组织(租户)级别的"环境变量",集中保管在 系统管理 → 服务器配置 → 组织参数 中。一次维护,全租户共享,并由平台在执行下列脚本时作为入参 org_params 自动注入:
- RPC 模型:
rpc_script({ device, params, alarms, logger, org_params }) - 物模型解析脚本:
payload_parser(device, msg, thingModelId, noticeAttrs, org_params) - 触发模型:
trigger_script(device, thingModelId, org_params) - MQTT 转发器脚本:
forwardScript({ topic, msg, org_params })
💡 设计目的:把"对接外部系统所需的凭证 / 地址 / 业务标识"从脚本里剥离出来——脚本只负责逻辑,凭证写在组织参数里。换 webhook、轮换密钥、切换环境时只改一处,无需逐个修改 RPC/触发/转发器脚本。
1.4.1. 与 server_attrs / shared_attrs / params 的区别
| 来源 | 作用域 | 写在哪里 | 谁能看到 |
|---|---|---|---|
params | 单次 RPC 调用 | 调用方在调用时传入 | 调用方 |
device.shared_attrs | 单个设备 | 设备 ↔ 平台双向同步 | 该设备的运维 |
device.server_attrs | 单个设备 | 平台侧设备详情页 | 该设备的运维 |
org_params | 整个组织 | 服务器配置 → 组织参数 | 组织管理员(普通运维不可见) |
典型用途:
- 第三方机器人 Webhook(企业微信 / 钉钉 / Slack / Telegram)的 URL 或 key
- 第三方 HTTP API 的 base URL、access key
- 全组织共用的业务标识(如 BMS 接入方编号、运营商账号)
- 不同环境(生产/测试)切换的常量
1.4.2. 配置方式
进入 系统管理 → 服务器配置 → 组织参数,按"键值对"维护:
| 字段 | 说明 |
|---|---|
| Key | 在脚本中通过 org_params.<key> 读取,建议小写下划线命名(如 wecom_webhook_url) |
| Value | 字符串;若需结构化数据,请填 JSON 字符串并在脚本中 JSON.parse |
| Remark | 给平台操作者看的"这个参数怎么用"的说明,例如"企业微信告警机器人 webhook,每季度轮换" |
配置完成后点击提交,新值即刻对该组织所有脚本生效(无需重启服务)。
1.4.3. 在脚本中读取
// RPC:从 org_params 拿企业微信 webhook
function rpc_script({ device, params, alarms, logger, org_params }) {
let webhook = org_params?.wecom_webhook_url;
if (!webhook) {
logger.error("wecom_webhook_url not configured in org_params");
return null;
}
return [{
sleepTimeMs: 0,
type: "axios",
dnMsg: {
method: "POST",
url: webhook,
headers: { "Content-Type": "application/json" },
data: { msgtype: "text", text: { content: params.content } },
timeout: 5000
}
}];
}1.4.4. 安全提示
- 组织参数页面仅组织管理员可访问——普通运维看不到 webhook key/secret,可放心存放敏感凭证
- 一旦怀疑泄漏,在第三方平台重置密钥,回到本页面更新 value即可;所有引用该 key 的脚本自动使用新值
- 建议每季度轮换一次 webhook/access key,并在 Remark 里记录上次轮换时间
⚠️ 不要把
org_params的值写回到device.server_attrs或日志正文里——那等于把"安全藏起来的密钥"又暴露到调用方/日志读者面前。