BGT-SMPS 多合一土壤传感器对接文档
模型清单
可使用下列名称或 ID 在 ThinkLink 中搜索对应模型。
| 模型类型 | 名称 | id_name | 平台模型 ID |
|---|---|---|---|
| RPC | [BGT-SMPS GET] para | bgt_smps_get_25101 | 102256370513874949 |
| RPC | [BGT-SMPS SET] para | bgt_smps_set_25101 | 102256081450831877 |
| Template | BGT-SMPS-25101 | 102256727507865605 | |
| Thing Model | [BGT-SMPS] | bgt_smps_25101 | 102254589725642757 |
| Thing Model | [BGT-25101-BGT-SMPS资产] 区域聚合 | bgt_smps_asset_25101 | 119677174411063296 |
| Parameter Thing Model | [BGT-SMPS-PARA] | bgt_smps_para_25101 | 102255300635004933 |
设备型号:BGT-SMPS
模板名称:BGT-SMPS-25101
业务代码:25101
1. 传感器简介
BGT-SMPS 是国信华源(GXHY / Beijing Guoxinhuayuan Technology Co., Ltd)推出的多合一土壤参数传感器,支持土壤温度、土壤湿度、土壤 EC、土壤盐度、土壤氮、土壤磷、土壤钾、土壤 pH 等参数采集。
传感器采用 RS-485 接口,通信协议为标准 Modbus-RTU,默认地址为 01,默认通信参数为 9600, 8N1。传感器可直接插入或埋入土壤中使用,适合农业、环境监测、温室大棚、土壤检测等场景。
本对接方案中,BGT-SMPS 通过 KC21 + EdgeBus + LoRaWAN + ThinkLink 接入平台,由 KC21 通过 RS-485 读取传感器 Modbus 数据,再通过 LoRaWAN 上报至 ThinkLink 平台。
2. 产品特点
| 特点 | 说明 |
|---|---|
| 多参数一体化 | 支持土壤温度、湿度、EC、盐度、氮、磷、钾、pH 等参数采集 |
| Modbus-RTU 通讯 | 标准 RS-485 / Modbus-RTU 协议,便于接入采集器 |
| 测量精度高 | 温度、湿度、EC、pH 等参数具有较高测量精度 |
| 响应速度快 | 上电后稳定时间短,可快速完成数据采集 |
| 防护性能好 | 采用环氧树脂密封,防水等级 IP68 |
| 耐腐蚀探针 | 探针材料为 316L 不锈钢 |
| 适合埋地安装 | 可将探针完全插入土壤,或将整机埋入土壤使用 |
3. 适用范围
BGT-SMPS 适用于以下场景:
| 应用场景 | 说明 |
|---|---|
| 节水农业灌溉 | 监测土壤温湿度及肥力参数,用于灌溉策略优化 |
| 气象监测 | 配合农业气象站进行土壤环境监测 |
| 环境监测 | 用于土壤环境数据采集 |
| 温室大棚 | 监测作物根系环境参数 |
| 花卉、蔬菜种植 | 用于精细化种植管理 |
| 草地、牧场 | 监测土壤水分及养分状态 |
| 土壤快速检测 | 现场快速获取土壤多参数数据 |
| 科学实验 | 用于农业、生态、土壤相关实验数据采集 |
4. 采集器信息
4.1 硬件信息
| 项目 | 内容 |
|---|---|
| 采集器型号 | KC21 |
| 通信方式 | LoRaWAN |
| 传感器接口 | RS-485 |
| 采集协议 | Modbus-RTU |
| 供电方式 | 电池供电 |
| 外设供电 | KC21 向传感器提供约 15.1V 电压 |
| 业务代码 | 25101 |
| 模板名称 | BGT-SMPS-25101 |
| 采集设备数量 | 默认支持 3 路土壤传感器 |
| 传感器地址配置 | 地址分别存放在 APP 参数区 150、151、152 |
| 周期配置 | 周期参数分别为 70、74、78 |
4.2 接线信息
电源与通讯接口
BGT-SMPS 传感器为 4 芯线缆,接线定义如下:
| 线色 | 定义 | 说明 |
|---|---|---|
| 红色 | Power+ | DC 9–24V / 新版手册给出 DC 5–24V |
| 黑色 | GND | 电源负极 |
| 黄色 | RS485_A | RS-485 A |
| 绿色 | RS485_B | RS-485 B |
在本方案中:
| KC21 侧 | BGT-SMPS 侧 |
|---|---|
| 外设电源输出 + | 红线 Power+ |
| GND | 黑线 GND |
| RS485 A | 黄线 RS485_A |
| RS485 B | 绿线 RS485_B |
传感器接口
| 项目 | 内容 |
|---|---|
| 接口类型 | RS-485 |
| 通信协议 | Modbus-RTU |
| 默认地址 | 0x01 |
| 波特率 | 9600 |
| 数据位 | 8 |
| 停止位 | 1 |
| 校验位 | None |
5. 数据采集
本方案中,通过 Modbus 读取以下寄存器:
| 参数 | Modbus 寄存器地址 | PLC 地址 | 数据类型 | 说明 |
|---|---|---|---|---|
| 土壤温度 | 0x0000 | 40001 | int16 | 1 位小数,负数采用补码 |
| 土壤湿度 | 0x0001 | 40002 | uint16 | 1 位小数,0–100% |
| 土壤 EC | 0x0002 | 40003 | uint16 | 无小数,单位 μS/cm |
| 土壤盐度 | 0x0003 | 40004 | uint16 | 无小数,单位 mg/L |
| 土壤氮 | 0x0004 | 40005 | uint16 | 无小数,单位 mg/kg |
| 土壤磷 | 0x0005 | 40006 | uint16 | 无小数,单位 mg/kg |
| 土壤钾 | 0x0006 | 40007 | uint16 | 无小数,单位 mg/kg |
| 土壤 pH | 0x0007 | 40008 | uint16 | 2 位小数 |
传感器读取命令示例:
01 03 00 00 00 08 44 0C含义:
| 字节 | 内容 | 说明 |
|---|---|---|
| 01 | 从站地址 | 默认地址 1 |
| 03 | 功能码 | 读保持寄存器 |
| 00 00 | 起始寄存器 | 从 0x0000 开始 |
| 00 08 | 寄存器数量 | 连续读取 8 个寄存器 |
| 44 0C | CRC16 | Modbus CRC 校验 |
5.1 寄存器定义
| 序号 | 参数名称 | 字段名 | 单位 | 索引 | 类型 | 系数 | 小数位 |
|---|---|---|---|---|---|---|---|
| 1 | 土壤温度 | soil_temperature | ℃ | 6 | int16be | 0.1 | 1 |
| 2 | 土壤湿度 | soil_moisture | % | 8 | uint16be | 0.1 | 1 |
| 3 | 土壤 EC | soil_ec | μS/cm | 10 | uint16be | 1 | 0 |
| 4 | 土壤盐度 | soil_salinity | mg/L | 12 | uint16be | 1 | 0 |
| 5 | 土壤氮 | soil_nitrogen | mg/kg | 10 | uint16be | 0.088 | 3 |
| 6 | 土壤磷 | soil_phosphorus | mg/kg | 10 | uint16be | 0.044 | 3 |
| 7 | 土壤钾 | soil_potassium | mg/kg | 10 | uint16be | 0.066 | 3 |
| 8 | 土壤 pH | soil_ph | pH | 20 | uint16be | 0.01 | 2 |
说明:本项目物模型中,土壤氮、磷、钾字段使用 EC 数据位置
index: 10并通过系数换算得到,分别为0.55 × 0.16、0.55 × 0.08、0.55 × 0.12。
5.2 状态位定义
本方案未单独定义传感器状态位。
物模型脚本中对采集超时状态进行了处理:
if((tdata?.status&0x02)===0x02) {
const status=tdata.status
tdata={ ...(device.telemetry_data?.[thingModelId] ?? {})}
tdata.status=status
}逻辑说明:
| 状态位 | 含义 | 处理方式 |
|---|---|---|
status & 0x02 | 采集超时 / time out | 保留原有遥测数据,仅更新状态值 |
6. EdgeBus 模型
本设备本身不是 LoRaWAN 传感器,而是 RS-485 / Modbus-RTU 传感器,因此需要通过 KC21 内置 EdgeBus 执行 Modbus 采集逻辑。
本方案中,EdgeBus 默认配置 3 路传感器:
| 路数 | 周期参数 index | 地址参数 index |
|---|---|---|
| 第 1 路 | 70 | 150 |
| 第 2 路 | 74 | 151 |
| 第 3 路 | 78 | 152 |
6.1 EB 配置参数
| 参数 | 值 |
|---|---|
| SwVersion | 31 |
| BaudRate | 9600 |
| StopBits | 1 |
| DataBits | 8 |
| Checkbit | NONE |
| Battery | true |
| ConfirmDuty | 60 |
| BzType | 25101 |
| BzVersion | 11 |
| LoRaWAN Port | 22 |
| version | 0x88 |
| dataType | 0x01 |
| 协议 | Modbus |
| Modbus 功能码 | 0x03 |
| 默认传感器地址 | 从 APP 参数区读取 |
| APP 地址参数 | 150、151、152 |
| 查询周期参数 | 70、74、78 |
6.2 EB 代码
import {Buffer} from "buffer";
import {buildOtaFile} from "@EBSDK/run";
import {LoraUpEvent} from "@EBSDK/EBCompiler/all_variable";
import {EBModel} from "@EBSDK/EBCompiler/EBModel/EBModel";
import {EventInfoItem} from "@EBSDK/EBCompiler/plugins/EBHelper";
import type {UserConfUPItem} from "@EBSDK/EBCompiler/plugins/EBHelper";
import {CheckbitEnum, getOtaConfig, HwTypeEnum} from "@EBSDK/otaConfig";
////////////////////////////////////////////////////////////////////////////////////////
let eventInfo: UserConfUPItem[] = [];
let otaConfig = getOtaConfig({
SwVersion:31,
BaudRate: 9600,
StopBits: 1,
DataBits: 8,
Checkbit: CheckbitEnum.NONE,
Battery: true,
ConfirmDuty: 60,
BzType: 25101,
BzVersion: 11
})
for(let i=0;i<3;i++) {
let userConf:UserConfUPItem={
name: "BGT_SMPS_6CH", version: "0x88",dataType: "0x01", port: 22, upPeriod: "10y",
quInfo: [
{
protocol: "modbus", addr: "0x01", code: "0x03", periodIndex: 70,
indexAPP: 150, indexCMD: 0, copySize: 1,
isLast:true,
listVal: [
{ start: "0", end: "7" }
]
}
]
}
userConf.name="BGT_SMPS_6CH_"+i.toString();
userConf.quInfo[0].periodIndex=70+i*4
userConf.quInfo[0].indexAPP = 150+i;
eventInfo.push(userConf)
}
const MODBUS_TT = (ebModel: EBModel) => {
for (let i=0; i<eventInfo.length; i++){
let event=new EventInfoItem(eventInfo[i]);
event.upEventSetup()
event.eventInstall()
}
return JSON.stringify(ebModel, null, 2)
}
buildOtaFile(import.meta.url, otaConfig, MODBUS_TT)6.3 说明
当前 EB 逻辑说明:
- KC21 通过 RS-485 接入 BGT-SMPS 土壤多参数传感器。
- EdgeBus 使用 Modbus-RTU 协议读取传感器数据。
- 默认生成 3 个采集事件,对应 3 路传感器。
- 每一路传感器的 485 地址从 APP 参数区读取:
- 第 1 路:
app_150 - 第 2 路:
app_151 - 第 3 路:
app_152
- 第 1 路:
- 每一路传感器的采集周期分别由以下参数控制:
- 第 1 路:
app_70 - 第 2 路:
app_74 - 第 3 路:
app_78
- 第 1 路:
- 每次采集使用 Modbus
0x03功能码读取连续 8 个寄存器。 - 上行使用 LoRaWAN
port 22,帧头 tag 为:0x880x01
- 上行数据中通过
subDevice.index = 5的值区分不同子设备 / 不同传感器。
7. 物模型
7.1 物模型基本信息
| 项目 | 内容 |
|---|---|
| 物模型名称 | BGT-SMPS-25101 |
| 模板名称 | BGT-SMPS-25101 |
| 业务代码 | 25101 |
| 设备类型 | 多合一土壤传感器 |
| 通讯方式 | KC21 + LoRaWAN |
| 上行端口 | 22 |
| 数据长度 | 22 |
| 是否解析 RSSI | 是 |
| 是否解析电池电压 | 是,battery: 4 |
| 子设备识别 | index: 5, type: uint8 |
| 上行帧标识 | 0x88 0x01 |
7.2 上行帧结构
| 字节索引 | 内容 | 说明 |
|---|---|---|
| 0 | 0x88 | 业务版本 / 帧标识 |
| 1 | 0x01 | 数据类型 |
| 4 | battery | 电池电压字段 |
| 5 | subDevice | 子设备编号 |
| 6–7 | soil_temperature | 土壤温度 |
| 8–9 | soil_moisture | 土壤湿度 |
| 10–11 | soil_ec | 土壤 EC |
| 12–13 | soil_salinity | 土壤盐度 |
| 20–21 | soil_ph | 土壤 pH |
注:根据提供的物模型脚本,土壤氮、磷、钾字段均基于
index: 10数据并通过不同换算系数计算得到。
7.3 物模型脚本
let port = msg?.userdata?.port || null;
if(port != 22) return null
let frameInfo = {
port: 22,
dataLen: 22,
rssi: true,
battery: 4,
subDevice: { index: 5, type: "uint8" },
tagList: [
{ index: 0, tag: 0x88 },
{ index: 1, tag: 0x01 }
]
};
let appInfo = [
{ name: "土壤温度", field_name: "soil_temperature", unit: "℃", index: 6, type: "int16be", coefficient: 0.1, decimal: 1 },
{ name: "土壤湿度", field_name: "soil_moisture", unit: "%", index: 8, type: "uint16be", coefficient: 0.1, decimal: 1 },
{ name: "土壤EC", field_name: "soil_ec", unit: "μS/cm", index: 10, type: "uint16be", coefficient: 1, decimal: 0 },
{ name: "土壤盐度", field_name: "soil_salinity", unit: "mg/L", index: 12, type: "uint16be", coefficient: 1, decimal: 0 },
{ name: "土壤氮", field_name: "soil_nitrogen", unit: "mg/kg", index: 10, type: "uint16be", coefficient: 0.088, decimal: 3 },
{ name: "土壤磷", field_name: "soil_phosphorus", unit: "mg/kg", index: 10, type: "uint16be", coefficient: 0.044, decimal: 3 },
{ name: "土壤钾", field_name: "soil_potassium", unit: "mg/kg", index: 10, type: "uint16be", coefficient: 0.066, decimal: 3 },
{ name: "土壤pH", field_name: "soil_ph", unit: "pH", index: 20, type: "uint16be", coefficient: 0.01, decimal: 2 }
];
let payParser = new PayloadParser({
device: device,
msg: msg,
frameInfo: frameInfo,
appInfo: appInfo,
})
let tdata = payParser.telemetry()
if((tdata?.status & 0x02) === 0x02) {
const status = tdata.status
tdata = { ...(device.telemetry_data?.[thingModelId] ?? {}) }
tdata.status = status
}
return {
sub_device: tdata == undefined ? null : tdata.addr,
telemetry_data: tdata,
server_attrs: null,
shared_attrs: null
}8. 第三方平台数据订阅
8.1 MQTT Topic
/v32/{Organization Account}/tkl/up/telemetry/{eui}8.2 上报示例数据
{
"eui": "6353012af10a9331",
"active_time": "2026-05-03T07:36:00.000Z",
"thingModelId": "BGT-SMPS-25101",
"thingModelIdName": "bgt_smps_25101",
"telemetry_data": {
"snr": 13.5,
"rssi": -51,
"battery": 3.37,
"addr": 1,
"soil_temperature": 23.6,
"soil_moisture": 35.6,
"soil_ec": 1234,
"soil_salinity": 1356,
"soil_nitrogen": 108.592,
"soil_phosphorus": 54.296,
"soil_potassium": 81.444,
"soil_ph": 6.86,
"status": 0
}
}9. RPC
9.1 RPC 名称
| 类型 | 名称 |
|---|---|
| 参数设置 RPC | bgt_smps_set_25101 |
| 参数校验名称 | bgt_smps_25101_set |
说明:实际平台配置时,建议保持 RPC 名称和参数物模型校验名称一致,避免因命名不一致导致调用失败。
9.2 参数定义
| 参数名 | 字段名 | APP index | 类型 | 单位 | 说明 |
|---|---|---|---|---|---|
pwron_delay | pwron_delay | 38 | uint16le | ms | 外设上电延时 |
period1 | period1 | 70 | uint32LE | s | 第 1 路传感器采集周期 |
period2 | period2 | 74 | uint32LE | s | 第 2 路传感器采集周期 |
period3 | period3 | 78 | uint32LE | s | 第 3 路传感器采集周期 |
addr1 | addr1 | 150 | uint8 | - | 第 1 路传感器 485 地址 |
addr2 | addr2 | 151 | uint8 | - | 第 2 路传感器 485 地址 |
addr3 | addr3 | 152 | uint8 | - | 第 3 路传感器 485 地址 |
9.3 RPC 代码
9.3.1 设置参数
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
let intervalms = classMode === "ClassA" ? 0 : 2000;
const rpcName = "bgt_smps_set_25101"
let paraDef = {
app_38: { name: "pwron_delay", field_name: "pwron_delay", unit: "ms", index: 38, type: "uint16le" },
app_70: { name: "period1", field_name: "period1", unit: "s", type: "uint32LE" },
app_74: { name: "period2", field_name: "period2", unit: "s", type: "uint32LE" },
app_78: { name: "period3", field_name: "period3", unit: "s", type: "uint32LE" },
app_150: { name: "addr1", field_name: "addr1", unit: "", type: "uint8" },
app_151: { name: "addr2", field_name: "addr2", unit: "", type: "uint8" },
app_152: { name: "addr3", field_name: "addr3", unit: "", type: "uint8" },
}
let frames = RPCHelper.buildFrame({
paraDef: paraDef,
params: params
});
let redoBuffer = RPCHelper.redo()
let dnBuffer = Buffer.alloc(frames.writeBuffer.length + frames.readBuffer.length);
frames.writeBuffer.copy(dnBuffer, 0)
frames.readBuffer.copy(dnBuffer, frames.writeBuffer.length)
logger.info("set para")
let msgQue = Utils.makeParaSetMSG({
device: device,
classMode: classMode,
rpcName: rpcName,
params: params,
paraDownBuffer: dnBuffer,
extraAppBuffer: redoBuffer
})
if (msgQue.length == 0) return null
return msgQue9.3.2 读取参数
let classMode = (device && device.shared_attrs && device.shared_attrs.class_mode) || "ClassA";
let sleepMs = classMode === "ClassA" ? 500 : 5000;
let paraDef = {
app_38: { name: "pwron_delay", field_name: "pwron_delay", unit: "ms", index: 38, type: "uint16le" },
app_70: { name: "period1", field_name: "period1", unit: "s", type: "uint32LE" },
app_74: { name: "period2", field_name: "period2", unit: "s", type: "uint32LE" },
app_78: { name: "period3", field_name: "period3", unit: "s", type: "uint32LE" },
app_150: { name: "addr1", field_name: "addr1", unit: "", type: "uint8" },
app_151: { name: "addr2", field_name: "addr2", unit: "", type: "uint8" },
app_152: { name: "addr3", field_name: "addr3", unit: "", type: "uint8" },
}
let frames = RPCHelper.buildFrame({
paraDef: paraDef,
params: params
});
let msg = RPCHelper.makeMSG({
msgType: Utils.msgType.paras,
device: device,
dnBuffer: frames.readBuffer,
sleepTime: sleepMs,
})
return [msg]10. 模板选择
在 ThinkLink 平台中搜索模板:
BGT-SMPS-25101或按业务类型查找:
25101建议搜索关键词:
| 搜索方式 | 关键词 |
|---|---|
| 按模板名称 | BGT-SMPS-25101 |
| 按设备型号 | BGT-SMPS |
| 按业务代码 | 25101 |
| 按应用类型 | 土壤多参数传感器 |
| 按采集方式 | KC21 / RS-485 / Modbus / LoRaWAN |