AN-201G LoRaWAN 应变传感器用户手册

设备信息:型号 AN-201G,devEui ffffff100004e9c8,网关 IP 192.168.31.205,Modbus Slave ID 10,BACnet Device ID 109

1 协议概览

AN-201G 在 Fport 210 上报 RS485 Modbus 寄存器数据、电池电压及信号质量。

1.1 上行数据协议(Fport 210)

载荷格式(Fport 210):

字节位置 字段 说明
0 保留 固定 0x00(协议版本)
1 … N TLV 对 [Type(1 B)][Value(N B)] … 循环至结束

每个 Type 字节决定字段名称和后续 value 字节数:

Type Value字节数 字段名称 编码方式 换算 单位 说明
0x01 1 model uint8 型号码 = 0x62
0x04 2 batteryVoltage uint16 BE ÷1000 V mV 原始值 ÷1000 = V
0x7D 1 batteryVoltageState uint8 0=正常 1=低电压
0x6D 1 packetType uint8 0x00=心跳 0x01=数据上报
0x79 4 timestamp uint32 BE s 设备本地 Unix 时间戳
0xDD 1 vibratingWireSensorModel uint8 振弦传感器公式型号码(用于应变计算)
0xDC 4 frequency uint32 BE ÷100 Hz 第1次出现 = 当前频率;第2次出现 = 初始基准频率(可选)
0xAA 2 temperature int16 BE ÷10 °C 第1次出现 = 当前温度;第2次出现 = 初始基准温度(可选)
0x05 1 batteryLowEvent uint8 0=正常 1=低电压事件(可选)

JavaScript 解码示例:

// AN-201G Vibrating-Wire Strain Gauge — Fport 210 uplink decoder
function decodeUplink(bytes) {
  var i = 1, r = {}, freqCount = 0, tempCount = 0;
  function u16(b,o){ return (b[o]<<8)|b[o+1]; }
  function i16(b,o){ var v=u16(b,o); return v>32767?v-65536:v; }
  function u32(b,o){ return ((b[o]<<24)|(b[o+1]<<16)|(b[o+2]<<8)|b[o+3])>>>0; }
  while (i < bytes.length) {
    var t = bytes[i++];
    switch (t) {
      case 0x01: r.model     = bytes[i++]; break;
      case 0x94: r.rs485Addr = bytes[i++]; break;
      case 0x04: r.batteryVoltage = u16(bytes,i)/1000; i+=2; break; // V
      case 0x05: r.batteryLowEvent= bytes[i++]; break;
      case 0xDC: {
        // 4-byte uint32 ÷100 = Hz; first = current, second = initial
        var hz = u32(bytes,i)/100; i+=4;
        if(freqCount===0){ r.frequency=hz; } else { r.initialFrequency=hz; }
        freqCount++; break;
      }
      case 0xAA: {
        // int16 ÷10 = °C; first = current, second = initial
        var tc = i16(bytes,i)/10; i+=2;
        if(tempCount===0){ r.temperature=tc; } else { r.initialTemperature=tc; }
        tempCount++; break;
      }
      case 0xDD: r.vibratingWireSensorModel = bytes[i++]; break;
      case 0x95: { var len=bytes[i++]; i+=len; break; } // Modbus block (optional)
      default:   i++; break;
    }
  }
  return r;
}
// → { model:98, rs485Addr:1, frequency:1234.56, temperature:25.3,
//     initialFrequency:1200.0, initialTemperature:20.0, ... }

脚本下载:LPP.zip

版本说明: LPP.js 基于 ChirpStack v4.17.0 开发和测试。不同版本的 ChirpStack JavaScript 编解码器 API 可能存在差异——如果您使用的是其他版本,请在部署前检查并根据需要调整脚本。

网关计算的应变输出字段(不在原始 payload 中)

AN-201G 不直接上报应力/应变值。网关的 LPP.js 解码器根据原始频率和温度数据, 使用振弦式表面应变公式推导出应变值,结果通过 IoT Hub 的所有接口对外提供。

计算公式(传感器机型码 0x01 — 混凝土/钢结构表面应变):

F  = f² / 1000          (频率数值,f 单位为 Hz)
steelStructureStrain(钢结构应变)   = G × C × (F₁ − F₀)                  [µε]
concreteStructureStrain(混凝土应变)= 钢结构应变 + (Y₁ − Y₂) × (T₁ − T₀)  [µε]
符号 取值 说明
G 3.7 仪器系数(µε/digit)
C 1.0 平均修正系数(来自出厂标定表)
Y₁ 12.2 钢材线膨胀系数(µε/°C)
Y₂ 10.4 混凝土线膨胀系数(µε/°C)
f, F₁ 当前 当前频率(Hz)/ 频率数值
f₀, F₀ 初始 基准频率(Hz)/ 频率数值(安装时录入)
T₁ 当前 当前温度(°C),来自 Type 0xAA 第1次出现
T₀ 初始 基准温度(°C),来自 Type 0xAA 第2次出现

获取应变计算结果:

接口 字段 地址 / 实例 单位 说明
MQTT JSON steelStructureStrain JSON 键 µε 网关 decoder 追加到解析结果
MQTT JSON concreteStructureStrain JSON 键 µε 网关 decoder 追加到解析结果
HTTP JSON steelStructureStrain JSON 键 µε /api/getStatus 响应
HTTP JSON concreteStructureStrain JSON 键 µε /api/getStatus 响应
Modbus TCP steelStructureStrain 保持寄存器 26(FC03, Float32 BE, ×100) µε 占 2 个寄存器
Modbus TCP concreteStructureStrain 保持寄存器 28(FC03, Float32 BE, ×100) µε 占 2 个寄存器
BACnet BIP steelStructureStrain AI 10915(Device ID=109, Offset 15) µε Analog Input
BACnet BIP concreteStructureStrain AI 10916(Device ID=109, Offset 16) µε Analog Input
frequencyDigit(寄存器 16,AI 10909)和 initialFrequencyDigit(寄存器 23,AI 10913)
也对外开放,供参考验算。

2 获取上行数据

⚠️ 以下示例中的 IP 地址(192.168.31.205 / 192.168.31.193)、ChirpStack API token、Slave ID、BACnet Device ID 及 devEui 均为演示示例,请替换为实际网关 IP、ChirpStack API token 及设备参数。

2.1 ChirpStack MQTT 订阅

订阅 MQTT topic 以接收实时上行数据:

应用 ID3ef9e6b9-ec54-4eda-86b8-a5fb46899f39 是网关内置的出厂默认 ChirpStack 应用。
如果您创建了其他应用,请替换为实际的应用 ID。

网关 IP192.168.31.205 为示例网关 WAN 口 IP,
请替换为您实际的网关 IP 地址。

设备 EUIffffff100004e9c8 为示例设备 EUI,
请替换为网关设备列表中显示的实际 EUI;
也可用 + 通配符一次订阅所有设备的数据。
# 订阅指定设备
mosquitto_sub -h 192.168.31.205 -p 1883 \
  -u gateway -P mqtt88888888 \
  -t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004e9c8/event/up"

# 订阅所有应用下所有设备(通配符)
mosquitto_sub -h 192.168.31.205 -p 1883 \
  -u gateway -P mqtt88888888 \
  -t "application/+/device/+/event/up"

上行数据载荷示例(JSON):

{
  "devEui": "ffffff100004e9c8",
  "fPort": 210,
  "object": {
    ...  (已解码的 LPP 字段)
  }
}

2.2 IoT Hub HTTP API

发送 GET 请求获取设备最新状态:

curl -s "http://192.168.31.205:8070/api/getStatus?devEui=ffffff100004e9c8"
{
  "success": true,
  "result": {
    "batteryVoltage": 3.53,
    "batteryVoltageState": 0,
    "timestamp": 1775015242,
    "vibratingWireSensorModel": 1,
    "frequency": 859.92,
    "frequencyDigit": 739.46,
    "temperature": 26.8,
    "correctionFactor": 1,
    "initialFrequency": 856.61,
    "initialFrequencyDigit": 733.78,
    "initialTemperature": 27.6,
    "steelStructureStrain": 21.02,
    "concreteStructureStrain": 19.58,
    "batteryLowAlarm": false,
    "isHeartbeat": true,
    "model": "AN-201G"
  }
}

2.3 IoT Hub Modbus TCP — Python 脚本

脚本下载:modbus_tcp_read.py

使用 modbus_tcp_read.py 一次性读取所有寄存器:

python3 modbus_tcp_read.py --ip 192.168.31.205 --port 502 \
    --slaveId 10 --sensorType AN-201G
Target: 192.168.31.205:502 | Slave ID: 10 | Sensor: AN-201G
================================================================================================================================================================
Attribute                | Addr   | FC  | Format     | Order        | Cnt | Scale    | Raw(Hex)            | Value              | Unit
----------------------------------------------------------------------------------------------------------------------------------------------------------------
online                   | 6      | 03  | Bit/Bool   | Big(ABCD)    | 1   | x1       | 0001                | true               | none
lastOnlineTime           | 7      | 03  | UnixTime   | Big(ABCD)    | 2   | x1       | 69CC 9537           | 1775015223         | second
batteryVoltage           | 9      | 03  | Int16(S)   | Big(ABCD)    | 1   | /100     | 0161                | 3.53               | volt
batteryVoltageState      | 10     | 03  | Int16      | Big(ABCD)    | 1   | x1       | 0000                | 0.0                | none
timestamp                | 11     | 03  | Int32      | Big(ABCD)    | 2   | x1       | 69CC 954A           | 1775015242.0       | seconds
vibratingWireSensorModel | 13     | 03  | Int16      | Big(ABCD)    | 1   | x1       | 0001                | 1.0                | none
frequency                | 14     | 03  | Float32    | Big(ABCD)    | 2   | /100     | 47A7 F400           | 859.92             | Hz
frequencyDigit           | 16     | 03  | Float32    | Big(ABCD)    | 2   | /100     | 4790 6D00           | 739.46             | digit
temperature              | 18     | 03  | Int16(S)   | Big(ABCD)    | 1   | /100     | 0A78                | 26.8               | celsius
correctionFactor         | 19     | 03  | Float32    | Big(ABCD)    | 2   | /10000   | 461C 4000           | 1.0000             | none
initialFrequency         | 21     | 03  | Float32    | Big(ABCD)    | 2   | /100     | 47A7 4E80           | 856.61             | Hz
initialFrequencyDigit    | 23     | 03  | Float32    | Big(ABCD)    | 2   | /100     | 478F 5100           | 733.78             | digit
... (20 fields total)

2.4 IoT Hub Modbus TCP — Modbus Poll

工具下载:Modbus Poll 9.5.0.1507.zip

  1. 打开 Modbus Poll,连接 192.168.31.205:502,Slave ID 10
  2. 菜单 Setup → Read/Write Definition,功能码选 FC03,起始地址 6,长度 64
  3. 点击 OK — 数值实时刷新

2.5 IoT Hub BACnet BIP — Python 脚本

脚本下载:bacnet_read.py

使用 bacnet_read.py 读取所有 BACnet 对象:

python3 bacnet_read.py --ip 192.168.31.205 --port 47808 --id 109
Target: 192.168.31.205:47808 | BACnet ID: 109 | Scan: 10900-10999
------------------------------------------------------------
Type | Instance | Offset | Value                    | Object Name
------------------------------------------------------------
BI   | 10902    | 2      | active                   | ffffff100004e9c8.online
AI   | 10903    | 3      | 1775015168.00            | ffffff100004e9c8.lastOnlineTime
AI   | 10904    | 4      | 3.53                     | ffffff100004e9c8.batteryVoltage
AI   | 10905    | 5      | 0.00                     | ffffff100004e9c8.batteryVoltageState
AI   | 10906    | 6      | 1775015296.00            | ffffff100004e9c8.timestamp
AI   | 10907    | 7      | 1.00                     | ffffff100004e9c8.vibratingWireSensorModel
AI   | 10908    | 8      | 859.92                   | ffffff100004e9c8.frequency
AI   | 10909    | 9      | 739.46                   | ffffff100004e9c8.frequencyDigit
AI   | 10910    | 10     | 26.80                    | ffffff100004e9c8.temperature
AI   | 10911    | 11     | 1.00                     | ffffff100004e9c8.correctionFactor
AI   | 10912    | 12     | 856.61                   | ffffff100004e9c8.initialFrequency
AI   | 10913    | 13     | 733.78                   | ffffff100004e9c8.initialFrequencyDigit
... (20 objects total)

2.6 IoT Hub BACnet BIP — YABE

工具下载:SetupYabe_v2.1.0.exe

  1. 打开 YABE,连接 192.168.31.205:47808
  2. 在设备树中展开设备 109
  3. 浏览 AI/BI/AV/BV/CV 对象,查看实时数值