AN-307 LoRaWAN 声光报警器用户手册
设备信息:型号 AN-307,devEui ffffff100004c88a,网关 IP 192.168.31.193,Modbus Slave ID 3,BACnet Device ID 102
1 协议概览
AN-307 在 Fport 210 上报报警状态、报警持续时长及信号质量。
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 | — | — | 型号码 = 0x2A |
0x3A |
1 | alarmStatus |
uint8 | — | — | 0=报警关 1=报警开 |
JavaScript 解码示例:
// AN-307 Audible/Visual Alarm — Fport 210 uplink decoder
function decodeUplink(bytes) {
var i = 1, r = {};
while (i < bytes.length) {
var t = bytes[i++];
switch (t) {
case 0x01: r.model = bytes[i++]; break;
case 0x3A: r.alarmStatus = bytes[i++]; break; // 0=OFF 1=ON
default: i++; break;
}
}
return r;
}
// Example payload (hex): 00 01 2A 3A 01
// → { model:42, alarmStatus:1 }
脚本下载:LPP.zip
版本说明: LPP.js 基于 ChirpStack v4.17.0 开发和测试。不同版本的 ChirpStack JavaScript 编解码器 API 可能存在差异——如果您使用的是其他版本,请在部署前检查并根据需要调整脚本。
1.2 下行控制协议
AN-307 支持定时报警、持续报警和解除报警,下行使用 Fport 210。
Fport:210 — 0x01 0x2A(设备型号标识头,Fport 210)
载荷格式:01 2A [CtrlByte] [D1? D0?] 持续时长 D = 报警持续秒数(uint16 BE,可选)。 Fport:210(与上行相同端口,不同于其他设备使用 Fport 2)。
| 命令码 | 载荷字节 | 说明 |
|---|---|---|
OFF |
01 2A 00 |
关闭报警 |
ON |
01 2A 01 |
持续报警(不超时) |
TIMED |
01 2A 01 D1 D0 |
报警持续 D 秒(uint16 BE;如 0x003C=60 秒) |
JavaScript 编码器示例:
// AN-307 Alarm — Fport 210 downlink encoder
function encodeDownlink(data) {
// data.alarmState : 0=off 1=on
// data.durationSeconds : uint16 (1–65535), optional; omit for indefinite alarm
var H = [0x01, 0x2A];
if (!data.alarmState && data.alarmState !== 1) { return []; }
var on = Number(data.alarmState) ? 1 : 0;
if (!on) { return H.concat([0x00]); }
var d = Number(data.durationSeconds);
if (d > 0 && d <= 65535) {
return H.concat([0x01, (d >> 8) & 0xFF, d & 0xFF]);
}
return H.concat([0x01]);
}
// Examples:
// encodeDownlink({alarmState:1}) → [0x01,0x2A,0x01]
// encodeDownlink({alarmState:1, durationSeconds:60})→ [0x01,0x2A,0x01,0x00,0x3C]
// encodeDownlink({alarmState:0}) → [0x01,0x2A,0x00]
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.193为示例网关 WAN 口 IP,
请替换为您实际的网关 IP 地址。
设备 EUI —ffffff100004c88a为示例设备 EUI,
请替换为网关设备列表中显示的实际 EUI;
也可用+通配符一次订阅所有设备的数据。
# 订阅指定设备
mosquitto_sub -h 192.168.31.193 -p 1883 \
-u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004c88a/event/up"
# 订阅所有应用下所有设备(通配符)
mosquitto_sub -h 192.168.31.193 -p 1883 \
-u gateway -P mqtt88888888 \
-t "application/+/device/+/event/up"
上行数据载荷示例(JSON):
{
"devEui": "ffffff100004c88a",
"fPort": 210,
"object": {
... (已解码的 LPP 字段)
}
}
2.2 IoT Hub HTTP API
发送 GET 请求获取设备最新状态:
curl -s "http://192.168.31.193:8070/api/getStatus?devEui=ffffff100004c88a"
{
"success": true,
"result": {
"alarmStatus": false,
"model": "AN-307"
}
}
2.3 IoT Hub Modbus TCP — Python 脚本
脚本下载:modbus_tcp_read.py
使用 modbus_tcp_read.py 一次性读取所有寄存器:
python3 modbus_tcp_read.py --ip 192.168.31.193 --port 502 \
--slaveId 3 --sensorType AN-307
Target: 192.168.31.193:502 | Slave ID: 3 | Sensor: AN-307
================================================================================================================================================================
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 C0E8 | 1775026408 | second
alarmStatus | 9 | 03 | Bit/Bool | Big(ABCD) | 1 | x1 | 0000 | false | none
alarmDurationSeconds | 10 | 03 | Int16 | Big(ABCD) | 1 | x1 | 0000 | 0.0 | seconds
model | 35 | 03 | String(24B) | ASCII | 12 | x1 | 414E 2D33 3037 0000 ... | AN-307 | none
rssi | 47 | 03 | Int16 | Big(ABCD) | 1 | x1 | FF94 | -108.0 | none
snr | 48 | 03 | Int16 | Big(ABCD) | 1 | x1 | FFF7 | -9.0 | none
2.4 IoT Hub Modbus TCP — Modbus Poll
工具下载:Modbus Poll 9.5.0.1507.zip
- 打开 Modbus Poll,连接
192.168.31.193:502,Slave ID3 - 菜单 Setup → Read/Write Definition,功能码选 FC03,起始地址
6,长度43 - 点击 OK — 数值实时刷新
2.5 IoT Hub BACnet BIP — Python 脚本
脚本下载:bacnet_read.py
使用 bacnet_read.py 读取所有 BACnet 对象:
python3 bacnet_read.py --ip 192.168.31.193 --port 47808 --id 102
Target: 192.168.31.193:47808 | BACnet ID: 102 | Scan: 10200-10299
------------------------------------------------------------
Type | Instance | Offset | Value | Object Name
------------------------------------------------------------
BI | 10202 | 2 | active | ffffff100004c88a.online
AI | 10203 | 3 | 1775026432.00 | ffffff100004c88a.lastOnlineTime
BV | 10204 | 4 | inactive | ffffff100004c88a.alarmStatus
AV | 10205 | 5 | 0.00 | ffffff100004c88a.alarmDurationSeconds
CV | 10209 | 9 | AN-307 | ffffff100004c88a.model
AI | 10210 | 10 | -108.00 | ffffff100004c88a.rssi
AI | 10211 | 11 | -9.00 | ffffff100004c88a.snr
2.6 IoT Hub BACnet BIP — YABE
工具下载:SetupYabe_v2.1.0.exe
- 打开 YABE,连接
192.168.31.193:47808 - 在设备树中展开设备 102
- 浏览 AI/BI/AV/BV/CV 对象,查看实时数值
3 发送控制指令
AN-307 支持定时报警、持续报警和解除报警,下行使用 Fport 210。
⚠️ 以下示例中的 IP 地址(192.168.31.205/192.168.31.193)、ChirpStack API token、Slave ID、BACnet Device ID 及 devEui 均为演示示例,请替换为实际网关 IP、ChirpStack API token 及设备参数。
脚本下载:modbus_tcp_write.py · bacnet_write.py
示例 1:定时报警(持续 60 秒)
Modbus TCP:
python3 modbus_tcp_write.py --ip 192.168.31.193 --port 502 --slaveId 3 --sensorType AN-307 alarm --value 1 --durationSeconds 60
Target: 192.168.31.193:502 | Slave ID: 3 | Sensor: AN-307
Expected values:
alarmStatus: 1
alarmDurationSeconds: 60
Expected confirmed state:
alarmStatus: 1
Attempt 1/1: writing control values (default)...
Modbus Poll write guide:
Batch 1: FC16 Write Multiple Registers | Start register: 9 (4x40010) | Count: 2
alarmStatus -> register 9 (4x40010) raw=1 signed=1
alarmDurationSeconds -> register 10 (4x40011) raw=60 signed=60
Observed values:
alarmStatus: 1
Link confirmation time: 1.138s
Control completed in: 1.149s
脚本自动写入寄存器并回读验证。输出中的 Modbus Poll write guide 部分可直接用于 Modbus Poll 手动写入的参考。
Modbus Poll:
- 连接网关(IP
192.168.31.193,端口502,Slave ID3) - 菜单 Functions → 16 Write Multiple Registers
- 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
- 点击 Send 发送写入指令
BACnet BIP:
python3 bacnet_write.py --ip 192.168.31.193 --port 47808 --id 102 --sensorType AN-307 alarm --value 1 --durationSeconds 60
Target: 192.168.31.193:47808 | BACnet ID: 102 | Sensor: AN-307
Expected values:
alarmStatus: 1
alarmDurationSeconds: 60
Expected confirmed state:
alarmStatus: 1
Attempt 1/1: writing control values (default)...
YABE write guide:
alarmStatus -> object binary-value,10204 | property present-value | type=binary-value | write=active
alarmDurationSeconds -> object analog-value,10205 | property present-value | type=analog-value | write=60
Observed values:
alarmStatus: 1
Link confirmation time: 0.010s
Control completed in: 0.044s
脚本自动写入并回读验证。输出中的 YABE write guide 部分可直接用于 YABE 手动写入的参考。
YABE:
- 连接网关(IP
192.168.31.193,端口47808),展开设备 102 - 参照上方脚本输出中的 YABE write guide,找到对应对象
- 右键该对象 → Write Property,属性选
present-value,填入目标值后点击 Write
IoT Hub HTTP:
接口路径:POST http://192.168.31.193:8070/api/sendCommand
curl -s -X POST "http://192.168.31.193:8070/api/sendCommand" \
-H "Content-Type: application/json" \
-d '{"devEui":"ffffff100004c88a","params":{"alarmStatus":true,"alarmDurationSeconds":60}}'
{
"success": true,
"result": {
"devEui": "ffffff100004c88a",
"status": "buffered"
}
}
ChirpStack REST API:
接口路径:POST http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue
curl -s -X POST 'http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue' \
-H 'accept: application/json' \
-H 'Grpc-Metadata-Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"flushQueue":true,"queueItem":{"confirmed":false,"isPending":false,"object":{"model":"AN-307","alarmStatus":true,"alarmDurationSeconds":60}}}'
{
"id": "4e8b2c17-5f93-4a01-b8d0-2c91ef345678"
}
格式化后的 JSON 内容:
{
"flushQueue": true,
"queueItem": {
"confirmed": false,
"isPending": false,
"object": {
"model": "AN-307",
"alarmStatus": true,
"alarmDurationSeconds": 60
}
}
}
ChirpStack MQTT:
mosquitto_pub -h 192.168.31.193 -p 1883 -u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004c88a/command/down" \
-m '{"flushQueue":true,"devEui":"ffffff100004c88a","confirmed":false,"object":{"model":"AN-307","alarmStatus":true,"alarmDurationSeconds":60}}'
格式化后的 JSON 内容:
{
"flushQueue": true,
"devEui": "ffffff100004c88a",
"confirmed": false,
"object": {
"model": "AN-307",
"alarmStatus": true,
"alarmDurationSeconds": 60
}
}
示例 2:不定时报警(持续报警直到手动解除)
未指定 alarmDurationSeconds 时,声光报警器将持续报警,直到下发 alarmStatus=false 解除报警指令。
Modbus TCP:
python3 modbus_tcp_write.py --ip 192.168.31.193 --port 502 --slaveId 3 --sensorType AN-307 alarm --value 1
Target: 192.168.31.193:502 | Slave ID: 3 | Sensor: AN-307
Expected values:
alarmStatus: 1
Attempt 1/1: writing control values (default)...
Modbus Poll write guide:
Batch 1: FC06 Write Single Register | Start register: 9 (4x40010) | Count: 1
alarmStatus -> register 9 (4x40010) raw=1 signed=1
Observed values:
alarmStatus: 1
Link confirmation time: 1.138s
Control completed in: 1.149s
脚本自动写入寄存器并回读验证。输出中的 Modbus Poll write guide 部分可直接用于 Modbus Poll 手动写入的参考。
Modbus Poll:
- 连接网关(IP
192.168.31.193,端口502,Slave ID3) - 菜单 Functions → 16 Write Multiple Registers
- 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
- 点击 Send 发送写入指令
BACnet BIP:
python3 bacnet_write.py --ip 192.168.31.193 --port 47808 --id 102 --sensorType AN-307 alarm --value 1
Target: 192.168.31.193:47808 | BACnet ID: 102 | Sensor: AN-307
Expected values:
alarmStatus: 1
Attempt 1/1: writing control values (default)...
YABE write guide:
alarmStatus -> object binary-value,10204 | property present-value | type=binary-value | write=active
Observed values:
alarmStatus: 1
Link confirmation time: 0.010s
Control completed in: 0.044s
脚本自动写入并回读验证。输出中的 YABE write guide 部分可直接用于 YABE 手动写入的参考。
YABE:
- 连接网关(IP
192.168.31.193,端口47808),展开设备 102 - 参照上方脚本输出中的 YABE write guide,找到对应对象
- 右键该对象 → Write Property,属性选
present-value,填入目标值后点击 Write
IoT Hub HTTP:
接口路径:POST http://192.168.31.193:8070/api/sendCommand
curl -s -X POST "http://192.168.31.193:8070/api/sendCommand" \
-H "Content-Type: application/json" \
-d '{"devEui":"ffffff100004c88a","params":{"alarmStatus":true}}'
{
"success": true,
"result": {
"devEui": "ffffff100004c88a",
"status": "buffered"
}
}
ChirpStack REST API:
接口路径:POST http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue
curl -s -X POST 'http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue' \
-H 'accept: application/json' \
-H 'Grpc-Metadata-Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"flushQueue":true,"queueItem":{"confirmed":false,"isPending":false,"object":{"model":"AN-307","alarmStatus":true}}}'
{
"id": "4e8b2c17-5f93-4a01-b8d0-2c91ef345678"
}
格式化后的 JSON 内容:
{
"flushQueue": true,
"queueItem": {
"confirmed": false,
"isPending": false,
"object": {
"model": "AN-307",
"alarmStatus": true
}
}
}
ChirpStack MQTT:
mosquitto_pub -h 192.168.31.193 -p 1883 -u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004c88a/command/down" \
-m '{"flushQueue":true,"devEui":"ffffff100004c88a","confirmed":false,"object":{"model":"AN-307","alarmStatus":true}}'
格式化后的 JSON 内容:
{
"flushQueue": true,
"devEui": "ffffff100004c88a",
"confirmed": false,
"object": {
"model": "AN-307",
"alarmStatus": true
}
}
示例 3:解除报警
Modbus TCP:
python3 modbus_tcp_write.py --ip 192.168.31.193 --port 502 --slaveId 3 --sensorType AN-307 alarm --value 0
Target: 192.168.31.193:502 | Slave ID: 3 | Sensor: AN-307
Expected values:
alarmStatus: 0
Attempt 1/1: writing control values (default)...
Modbus Poll write guide:
Batch 1: FC06 Write Single Register | Start register: 9 (4x40010) | Count: 1
alarmStatus -> register 9 (4x40010) raw=0 signed=0
Observed values:
alarmStatus: 0
Link confirmation time: 1.138s
Control completed in: 1.149s
脚本自动写入寄存器并回读验证。输出中的 Modbus Poll write guide 部分可直接用于 Modbus Poll 手动写入的参考。
Modbus Poll:
- 连接网关(IP
192.168.31.193,端口502,Slave ID3) - 菜单 Functions → 16 Write Multiple Registers
- 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
- 点击 Send 发送写入指令
BACnet BIP:
python3 bacnet_write.py --ip 192.168.31.193 --port 47808 --id 102 --sensorType AN-307 alarm --value 0
Target: 192.168.31.193:47808 | BACnet ID: 102 | Sensor: AN-307
Expected values:
alarmStatus: 0
Attempt 1/1: writing control values (default)...
YABE write guide:
alarmStatus -> object binary-value,10204 | property present-value | type=binary-value | write=inactive
Observed values:
alarmStatus: 0
Link confirmation time: 0.010s
Control completed in: 0.044s
脚本自动写入并回读验证。输出中的 YABE write guide 部分可直接用于 YABE 手动写入的参考。
YABE:
- 连接网关(IP
192.168.31.193,端口47808),展开设备 102 - 参照上方脚本输出中的 YABE write guide,找到对应对象
- 右键该对象 → Write Property,属性选
present-value,填入目标值后点击 Write
IoT Hub HTTP:
接口路径:POST http://192.168.31.193:8070/api/sendCommand
curl -s -X POST "http://192.168.31.193:8070/api/sendCommand" \
-H "Content-Type: application/json" \
-d '{"devEui":"ffffff100004c88a","params":{"alarmStatus":false}}'
{
"success": true,
"result": {
"devEui": "ffffff100004c88a",
"status": "buffered"
}
}
ChirpStack REST API:
接口路径:POST http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue
curl -s -X POST 'http://192.168.31.193:8090/api/devices/ffffff100004c88a/queue' \
-H 'accept: application/json' \
-H 'Grpc-Metadata-Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{"flushQueue":true,"queueItem":{"confirmed":false,"isPending":false,"object":{"model":"AN-307","alarmStatus":false}}}'
{
"id": "4e8b2c17-5f93-4a01-b8d0-2c91ef345678"
}
格式化后的 JSON 内容:
{
"flushQueue": true,
"queueItem": {
"confirmed": false,
"isPending": false,
"object": {
"model": "AN-307",
"alarmStatus": false
}
}
}
ChirpStack MQTT:
mosquitto_pub -h 192.168.31.193 -p 1883 -u gateway -P mqtt88888888 \
-t "application/3ef9e6b9-ec54-4eda-86b8-a5fb46899f39/device/ffffff100004c88a/command/down" \
-m '{"flushQueue":true,"devEui":"ffffff100004c88a","confirmed":false,"object":{"model":"AN-307","alarmStatus":false}}'
格式化后的 JSON 内容:
{
"flushQueue": true,
"devEui": "ffffff100004c88a",
"confirmed": false,
"object": {
"model": "AN-307",
"alarmStatus": false
}
}