LBJ Receiver - 列车接近预警接收设备
基于 ESP32 的 TB/T 3504-2018 POCSAG 接收机
LBJ Receiver 是一个嵌入式 POCSAG 信号接收设备, 用于接收和解码中国铁路列车接近预警(LBJ)信息.
设备通过 SX1278 射频模块在 821.2375 MHz 频率上接收 FSK 调制的 POCSAG 信号,
解码列车车次、速度、公里标、机车类型、线路名称、GPS 坐标等信息,
并通过 OLED 显示屏、BLE、WiFi Web 界面和 SD 卡日志等多渠道输出.
POCSAG 信号接收 - SX1278 FSK 直接模式, 1200bps, 4.5kHz 频偏
BCH 纠错 - BCH(31,21) + 偶校验, 可纠正 2 位错误
LBJ 消息解码 - 基本预警(地址 1234000), 扩展信息(地址 1234002), 时钟校准(地址 1234008)
FFSK 报警解码 - 道口报警/解除, 施工防护/解除 (TB/T 3504-2018 第 9.2 节)
自动频率校正(AFC) - 基于 SX1278 FEI 寄存器的实时频率跟踪
OLED 显示 - SSD1306 128x64 I2C, 显示列车信息、信号质量、连接状态
BLE 推送 - GATT 服务器实时推送 JSON 数据到移动设备
WiFi 配置界面 - 暗色主题响应式单页应用, 支持所有参数在线配置
SD 卡日志 - NDJSON 格式, 支持 LBJ 数据和 FFSK 报警
GBK 编码转换 - 铁路常用汉字查找表, 二分搜索
机车类型查询 - 200+ 条目覆盖蒸汽/内燃/电力/动车
组件
型号
说明
MCU
ESP32 (TTGO LoRa32 V1)
内置 WiFi/BLE
射频模块
SX1278
LoRa 芯片, FSK 模式运行
显示屏
SSD1306 128x64 OLED
I2C 接口
存储
MicroSD 卡
SPI 模式 (可选)
功能
GPIO
说明
RADIO_SCK
5
SPI 时钟
RADIO_MISO
19
SPI 主入从出
RADIO_MOSI
27
SPI 主出从入
RADIO_CS
18
SPI 片选
RADIO_DIO0
26
射频中断
RADIO_RST
14
射频复位
RADIO_DIO2
32
FSK 直接模式数据输出
I2C_SDA
4
OLED I2C 数据
I2C_SCL
15
OLED I2C 时钟
SD_CS
13
SD 卡片选
LED_PIN
25
板载 LED
库
版本
用途
RadioLib
^6.3.0
SX1278 射频驱动 (实际安装 6.6.0)
U8g2
^2.35.6
OLED 显示驱动
ArduinoJson
^7.0.4
JSON 序列化/反序列化
ESPAsyncWebServer
^1.2.4
异步 Web 服务器
AsyncTCP
^1.1.1
异步 TCP 库
NimBLE-Arduino
^2.2.0
BLE GATT 服务器 (实际安装 2.5.0, 使用 NimBLE API)
ESP32AnalogRead
^0.2.1
模拟量读取
# 编译
pio run -e ttgo-lora32-v1
# 编译并烧录
pio run -t upload
# 串口监视器 (115200 baud)
pio device monitor
# 上传 SPIFFS 文件系统
pio run -t uploadfs
设备启动后, 通过以下地址访问配置界面:
STA 模式: http://<设备IP>
AP 模式: http://192.168.4.1 (热点名: LBJ-Config-XXXX)
参数
默认值
说明
target_frequency
821.2375 MHz
接收频率 (821-832 或 400-470 MHz)
initial_ppm
6.0
初始频率偏差 (PPM)
afc_enabled
true
自动频率校正开关
bch_enabled
true
BCH 纠错开关
ble_enabled
true
BLE 功能开关
ntp_server
ntp.ntsc.ac.cn
NTP 时间同步服务器
wifi_networks
[]
WiFi 网络列表 (最多 5 个, 按优先级排序)
POCSAG (TB/T 3504-2018 第 9.1 节)
同步码字: 0x7CD215D8
空闲码字: 0x7A89C197
每批 8 帧, 每帧 2 个码字
地址 = 码字 bit[30:13] << 3 | 帧号 (0-7)
消息编码: BCD (4 位/符号, 含 bit-reflection)
FEC: BCH(31,21) + 偶校验
地址
类型
内容
1234000
列车接近预警
车次、速度、公里标
1234002
扩展信息
机车类型、线路名称、GPS 坐标
1234008
时钟校准
HHMM 时间
FFSK 报警 (TB/T 3504-2018 第 9.2 节)
调制: FFSK, 1200Hz=1, 1800Hz=0, 1200bps
FEC: 缩短循环码 (26,16)
校验: CRC-16 (CCITT)
类型: 0x03=道口报警, 0x04=道口解除, 0x05=施工防护, 0x06=施工解除
├── src/ # 应用源码
│ ├── main.cpp # 入口, 主循环
│ ├── hal.hpp # 硬件抽象接口
│ ├── hal_esp32.hpp/cpp # ESP32 射频驱动 (SX1278 FSK 直接模式)
│ ├── config.hpp/cpp # 配置管理 (SPIFFS + JSON)
│ ├── data_types.hpp # 协议常量和数据结构
│ ├── bch_correction.hpp/cpp # BCH(31,21) 纠错封装
│ ├── pocsag_framer.hpp/cpp # POCSAG 帧解析状态机
│ ├── pocsag_decoder.hpp/cpp # POCSAG 码字流解码器
│ ├── lbj_decoder.hpp/cpp # LBJ 消息解码器
│ ├── ffsk_decoder.hpp/cpp # FFSK 报警信道解码器
│ ├── afc_controller.hpp/cpp # 自动频率校正
│ ├── display_service.hpp/cpp # OLED 显示管理
│ ├── network_service.hpp/cpp # WiFi 网络管理
│ ├── ble_service.hpp/cpp # BLE GATT 服务器
│ ├── web_config_service.hpp/cpp # WiFi Web 配置界面
│ ├── sd_logger.hpp/cpp # SD 卡 NDJSON 日志
│ ├── output_manager.hpp/cpp # 输出调度 (串口, SD)
│ ├── gbk_converter.hpp/cpp # GBK 到 UTF-8 转换
│ ├── loco_table.hpp # 机车类型查找表
│ └── time_utils.hpp/cpp # NTP 和时间格式化
├── lib/
│ └── libbch_pocsag/ # BCH(31,21) C 语言库
│ ├── bch.h
│ └── bch.c
├── platformio.ini # PlatformIO 构建配置
├── ARCHITECTURE.md # 系统架构文档
└── README.md # 本文件
射频信号 → SX1278 → DIO2 ISR → 码字队列 → BCH纠错 → POCSAG帧解析 → LBJ解码 → 输出分发
↘ FFSK解码 → 输出分发
输出通道: 串口 | SD卡日志 | OLED显示 | BLE推送 | WiFi WebUI(SSE)
详细架构设计请参考 ARCHITECTURE.md .
TB/T 3504-2018 列车接近预警系统技术条件
POCSAG 协议 (CCIR 推荐书 584)
BCH(31,21) 实现: Phil Pemberton 的 Meggitt 译码器