Skip to content

BGT-SMPS 多合一土壤传感器对接文档 ​

模型清单 ​

可使用下列名称或 ID 在 ThinkLink 中搜索对应模型。

模型类型名称id_name平台模型 ID
RPC[BGT-SMPS GET] parabgt_smps_get_25101102256370513874949
RPC[BGT-SMPS SET] parabgt_smps_set_25101102256081450831877
TemplateBGT-SMPS-25101102256727507865605
Thing Model[BGT-SMPS]bgt_smps_25101102254589725642757
Thing Model[BGT-25101-BGT-SMPS资产] 区域聚合bgt_smps_asset_25101119677174411063296
Parameter Thing Model[BGT-SMPS-PARA]bgt_smps_para_25101102255300635004933

设备型号: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_ARS-485 A
绿色RS485_BRS-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 地址数据类型说明
土壤温度0x000040001int161 位小数,负数采用补码
土壤湿度0x000140002uint161 位小数,0–100%
土壤 EC0x000240003uint16无小数,单位 μS/cm
土壤盐度0x000340004uint16无小数,单位 mg/L
土壤氮0x000440005uint16无小数,单位 mg/kg
土壤磷0x000540006uint16无小数,单位 mg/kg
土壤钾0x000640007uint16无小数,单位 mg/kg
土壤 pH0x000740008uint162 位小数

传感器读取命令示例:

latex
01 03 00 00 00 08 44 0C

含义:

字节内容说明
01从站地址默认地址 1
03功能码读保持寄存器
00 00起始寄存器从 0x0000 开始
00 08寄存器数量连续读取 8 个寄存器
44 0CCRC16Modbus CRC 校验

5.1 寄存器定义 ​

序号参数名称字段名单位索引类型系数小数位
1土壤温度soil_temperature℃6int16be0.11
2土壤湿度soil_moisture%8uint16be0.11
3土壤 ECsoil_ecμS/cm10uint16be10
4土壤盐度soil_salinitymg/L12uint16be10
5土壤氮soil_nitrogenmg/kg10uint16be0.0883
6土壤磷soil_phosphorusmg/kg10uint16be0.0443
7土壤钾soil_potassiummg/kg10uint16be0.0663
8土壤 pHsoil_phpH20uint16be0.012

说明:本项目物模型中,土壤氮、磷、钾字段使用 EC 数据位置 index: 10 并通过系数换算得到,分别为 0.55 × 0.16、0.55 × 0.08、0.55 × 0.12。


5.2 状态位定义 ​

本方案未单独定义传感器状态位。

物模型脚本中对采集超时状态进行了处理:

javascript
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 路70150
第 2 路74151
第 3 路78152

6.1 EB 配置参数 ​

参数值
SwVersion31
BaudRate9600
StopBits1
DataBits8
CheckbitNONE
Batterytrue
ConfirmDuty60
BzType25101
BzVersion11
LoRaWAN Port22
version0x88
dataType0x01
协议Modbus
Modbus 功能码0x03
默认传感器地址从 APP 参数区读取
APP 地址参数150、151、152
查询周期参数70、74、78

6.2 EB 代码 ​

typescript
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 逻辑说明:

  1. KC21 通过 RS-485 接入 BGT-SMPS 土壤多参数传感器。
  2. EdgeBus 使用 Modbus-RTU 协议读取传感器数据。
  3. 默认生成 3 个采集事件,对应 3 路传感器。
  4. 每一路传感器的 485 地址从 APP 参数区读取:
    • 第 1 路:app_150
    • 第 2 路:app_151
    • 第 3 路:app_152
  5. 每一路传感器的采集周期分别由以下参数控制:
    • 第 1 路:app_70
    • 第 2 路:app_74
    • 第 3 路:app_78
  6. 每次采集使用 Modbus 0x03 功能码读取连续 8 个寄存器。
  7. 上行使用 LoRaWAN port 22,帧头 tag 为:
    • 0x88
    • 0x01
  8. 上行数据中通过 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 上行帧结构 ​

字节索引内容说明
00x88业务版本 / 帧标识
10x01数据类型
4battery电池电压字段
5subDevice子设备编号
6–7soil_temperature土壤温度
8–9soil_moisture土壤湿度
10–11soil_ec土壤 EC
12–13soil_salinity土壤盐度
20–21soil_ph土壤 pH

注:根据提供的物模型脚本,土壤氮、磷、钾字段均基于 index: 10 数据并通过不同换算系数计算得到。


7.3 物模型脚本 ​

javascript
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 ​

latex
/v32/{Organization Account}/tkl/up/telemetry/{eui}

8.2 上报示例数据 ​

json
{
    "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 名称 ​

类型名称
参数设置 RPCbgt_smps_set_25101
参数校验名称bgt_smps_25101_set

说明:实际平台配置时,建议保持 RPC 名称和参数物模型校验名称一致,避免因命名不一致导致调用失败。


9.2 参数定义 ​

参数名字段名APP index类型单位说明
pwron_delaypwron_delay38uint16lems外设上电延时
period1period170uint32LEs第 1 路传感器采集周期
period2period274uint32LEs第 2 路传感器采集周期
period3period378uint32LEs第 3 路传感器采集周期
addr1addr1150uint8-第 1 路传感器 485 地址
addr2addr2151uint8-第 2 路传感器 485 地址
addr3addr3152uint8-第 3 路传感器 485 地址

9.3 RPC 代码 ​

9.3.1 设置参数 ​

javascript
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 msgQue

9.3.2 读取参数 ​

javascript
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 平台中搜索模板:

latex
BGT-SMPS-25101

或按业务类型查找:

latex
25101

建议搜索关键词:

搜索方式关键词
按模板名称BGT-SMPS-25101
按设备型号BGT-SMPS
按业务代码25101
按应用类型土壤多参数传感器
按采集方式KC21 / RS-485 / Modbus / LoRaWAN