M0LTE.Pocsag
0.1.0
dotnet add package M0LTE.Pocsag --version 0.1.0
NuGet\Install-Package M0LTE.Pocsag -Version 0.1.0
<PackageReference Include="M0LTE.Pocsag" Version="0.1.0" />
<PackageVersion Include="M0LTE.Pocsag" Version="0.1.0" />
<PackageReference Include="M0LTE.Pocsag" />
paket add M0LTE.Pocsag --version 0.1.0
#r "nuget: M0LTE.Pocsag, 0.1.0"
#:package M0LTE.Pocsag@0.1.0
#addin nuget:?package=M0LTE.Pocsag&version=0.1.0
#tool nuget:?package=M0LTE.Pocsag&version=0.1.0
M0LTE.Pocsag
A dependency-light POCSAG paging codec for .NET — CCIR Radiopaging Code No. 1 (ITU-R M.584-2) — extracted from the pdn-soundmodem packet-radio modem. It both encodes pages to baseband 2-FSK audio for an FM radio's data port and decodes that audio back to pages, and is DAPNET-compatible (the amateur paging network's 1200 bd rate, function-bit and padding conventions).
| Type | What it is |
|---|---|
PocsagMessage |
A page to transmit: 21-bit RIC address, function bits, and Numeric / Alphanumeric / Tone content. |
PocsagEncoder |
Pages → preamble + BCH-protected codeword batches → shaped NRZ 2-FSK audio. BuildCodewords for the raw codeword stream, Modulate for audio. |
PocsagDecoder |
Baseband FSK audio → sliced bits → sync hunt → BCH-corrected codewords → PocsagPages, with polarity auto-detection. |
PocsagPage |
A received page: address, function, numeric/alphanumeric readings, BCH bit-errors corrected, polarity, truncation. |
PocsagCodeword |
The BCH(31,21) + parity codeword primitive: Encode, TryCorrect (≤2-bit correct, 3-bit detect), the frame-sync/idle constants. |
PocsagPolarity |
Baseband polarity (Normal is the spec convention: a '0' bit is the high frequency). |
- Targets
net10.0. Depends only onM0LTE.Dsp(the FIR/filter primitives the audio chain uses). - 512 / 1200 / 2400 bd, numeric and alphanumeric pages, tone-only ("beep") pages.
- Spec-first and cross-validated against multimon-ng, the de-facto POCSAG receiver.
- Public API is locked by a build-time test and the package follows
Semantic Versioning; see
docs/versioning.md.
Install
dotnet add package M0LTE.Pocsag
Quick start
using M0LTE.Pocsag;
// Encode a mixed transmission to 48 kHz baseband audio for an FM radio's data port.
var messages = new List<PocsagMessage>
{
PocsagMessage.Alphanumeric(133703, "Hello DAPNET!"),
PocsagMessage.Numeric(8, "555 0100"),
PocsagMessage.Tone(2007287, function: 1),
};
float[] audio = new PocsagEncoder(sampleRate: 48000, baud: 1200).Modulate(messages);
// ... feed `audio` to your radio's audio out and key PTT ...
// Decode audio back to pages (polarity auto-detected).
var pages = new List<PocsagPage>();
var decoder = new PocsagDecoder(sampleRate: 48000, pages.Add, baud: 1200);
decoder.Process(audio);
decoder.Flush();
foreach (PocsagPage page in pages)
{
Console.WriteLine($"RIC {page.Address} fn {page.Function}: {page.Text}");
}
(Exact constructor/method signatures are in the XML docs shipped with the package.)
Licence
AGPL-3.0-or-later (see LICENSE). POCSAG is implemented spec-first from
CCIR Radiopaging Code No. 1 (ITU-R M.584-2); GPL implementations were read only as
cross-checks and no code was transcribed, so the package is AGPL by choice (matching the
M0LTE.* family). See PROVENANCE.md.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- M0LTE.Dsp (>= 0.1.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on M0LTE.Pocsag:
| Package | Downloads |
|---|---|
|
pdn-soundmodem
Headless soundcard packet modem core: IL2P/AX.25 framing and FEC now; demodulators, KISS TCP and DCD to follow. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0 | 655 | 7/18/2026 |