Project_Detail
All_Projects

OpenPOCSAG

A HackRF POCSAG Pager Transmitter With APRS and DAPNET Support

View on GitHub
README.md

OpenPOCSAG

Native POCSAG paging transmitter for the HackRF, with a Qt desktop GUI. Compose one-off pages, drive transmissions from live feeds (CSV files, APRS-IS), and operate as a legitimate amateur station with automatic CW identification and band-plan awareness.

Licensed operators only. This software keys a radio transmitter. You are responsible for operating within your license privileges, on frequencies and at power levels you are authorized to use, and for identifying your station. POCSAG paging on amateur bands is regulated; know your local rules.

Features

  • Native libhackrf transmit path (no shelling out to external tools)
  • POCSAG encoder: alphanumeric, numeric (BCD), and tone-only; correct BCH(31,21) + parity; multi-message batching
  • FSK modulator with optional Gaussian (GFSK) pulse shaping, key-edge ramping, and PPM frequency correction
  • Qt6 GUI:
    • Transmit — frequency, baud (512/1200/2400), deviation, gain, amplitude, invert, capcode, function, content type, message
    • Feeds — CSV file feeds and APRS-IS with callsign → capcode mapping
    • Station — operator callsign, region/band-plan, automatic CW (MCW) ID
    • Arm gate + ON-AIR indicator; settings persist between sessions
  • CLI tools: pocsag_tx, pocsag_test, hello_hackrf

Hardware

  • HackRF One (or compatible)
  • A 70 cm band-pass filter and a small PA are strongly recommended — the HackRF outputs only ~ -10 dBm and produces wideband products; filter and amplify before any antenna.
  • On Windows the HackRF needs the WinUSB driver (install via Zadig).

Build (Windows / MSYS2)

From the MSYS2 MINGW64 shell:

pacman -S --needed \
  mingw-w64-x86_64-toolchain \
  mingw-w64-x86_64-cmake \
  mingw-w64-x86_64-ninja \
  mingw-w64-x86_64-hackrf \
  mingw-w64-x86_64-qt6-base \
  mingw-w64-x86_64-qt6-tools

cmake --preset windows-mingw
cmake --build --preset windows-mingw

Binaries land in build/bin/. To make the GUI self-contained for distribution:

windeployqt6 build/bin/openpocsag-gui.exe

then copy any remaining MinGW runtime DLLs reported by ldd build/bin/*.exe.

Build (Linux / macOS)

Install Qt6, libhackrf, CMake, Ninja and a C/C++ toolchain from your package manager, then:

cmake --preset linux      # or: macos
cmake --build --preset linux

CLI quick start

# transmit an alphanumeric page (default 439.9875 MHz, capcode 1139775)
pocsag_tx -m "HELLO"

# numeric page
pocsag_tx -N -m "12345"

# dump IQ to a file instead of transmitting
pocsag_tx -m "HELLO" -o page.cs8

# send a CW (MCW) identification
pocsag_tx -C "N0CALL" -W 20

Feeds

  • CSV — one page per line, capcode,message (blank lines and # comments ignored). Appended lines are transmitted live.
  • APRS-IS — connects to an APRS-IS server, maps callsigns to capcodes, and pages when a matching message arrives. Receive-only login uses passcode -1.

Feed definitions are stored as JSON in the app config directory and can be shared/imported.

Project layout

core/   libopenpocsag (POCSAG encode, FSK/CW modulation, HackRF TX) + C API
cli/    command-line tools
app/    Qt6 GUI

License

GPL-3.0-or-later. See LICENSE.

Contributing / support

Issues and pull requests are welcome. If OpenPOCSAG is useful to you, please consider supporting development.