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 以接收实时上行数据:
应用 ID —3ef9e6b9-ec54-4eda-86b8-a5fb46899f39是网关内置的出厂默认 ChirpStack 应用。
如果您创建了其他应用,请替换为实际的应用 ID。
网关 IP —192.168.31.205为示例网关 WAN 口 IP,
请替换为您实际的网关 IP 地址。
设备 EUI —ffffff100004e9c8为示例设备 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
- 打开 Modbus Poll,连接
192.168.31.205:502,Slave ID10 - 菜单 Setup → Read/Write Definition,功能码选 FC03,起始地址
6,长度64 - 点击 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
- 打开 YABE,连接
192.168.31.205:47808 - 在设备树中展开设备 109
- 浏览 AI/BI/AV/BV/CV 对象,查看实时数值