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:2100x01 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 以接收实时上行数据:

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

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

设备 EUIffffff100004c88a 为示例设备 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

  1. 打开 Modbus Poll,连接 192.168.31.193:502,Slave ID 3
  2. 菜单 Setup → Read/Write Definition,功能码选 FC03,起始地址 6,长度 43
  3. 点击 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

  1. 打开 YABE,连接 192.168.31.193:47808
  2. 在设备树中展开设备 102
  3. 浏览 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:

  1. 连接网关(IP 192.168.31.193,端口 502,Slave ID 3
  2. 菜单 Functions → 16 Write Multiple Registers
  3. 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
  4. 点击 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:

  1. 连接网关(IP 192.168.31.193,端口 47808),展开设备 102
  2. 参照上方脚本输出中的 YABE write guide,找到对应对象
  3. 右键该对象 → 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:

  1. 连接网关(IP 192.168.31.193,端口 502,Slave ID 3
  2. 菜单 Functions → 16 Write Multiple Registers
  3. 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
  4. 点击 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:

  1. 连接网关(IP 192.168.31.193,端口 47808),展开设备 102
  2. 参照上方脚本输出中的 YABE write guide,找到对应对象
  3. 右键该对象 → 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:

  1. 连接网关(IP 192.168.31.193,端口 502,Slave ID 3
  2. 菜单 Functions → 16 Write Multiple Registers
  3. 参照上方脚本输出中的 Modbus Poll write guide,填写寄存器地址和数值
  4. 点击 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:

  1. 连接网关(IP 192.168.31.193,端口 47808),展开设备 102
  2. 参照上方脚本输出中的 YABE write guide,找到对应对象
  3. 右键该对象 → 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
  }
}