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_temperature6int16be0.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.160.55 × 0.080.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