Skip to content

Feature Request: Call Alert Decoding #1114

Description

@hoosierscanner

P25 trunked systems use the Call Alert TSBK (opcode 0x1F) as an individual radio paging mechanism. Unlike a conventional voice grant, a Call Alert is a short control channel message directed at a specific radio unit ID — it carries no audio and no voice channel is ever granted. The addressed radio responds by alerting the subscriber via vibrate, audible tone, or in specialized equipment, a relay closure.
This is actively used by fire departments for firehouse alerting. A dispatch console sends a Call Alert targeting a specific unit ID installed at the fire station. That radio's relay output triggers the station alerting system — bay doors, lights, tones — without any voice traffic. Because no channel grant occurs, there is no associated tsbk00 and no audio recording. These are intentionally control-channel-only events.

Current Behavour

trunk-recorder recognizes the 0x1F opcode and logs it, but decodes nothing from the payload:
[debug] tsbk1f: Call Alert
The destination unit ID (the station radio being paged), the source unit ID (the initiating console), and the MFID are all silently discarded. No data reaches the plugin layer — meaning plugins such as tr-plugin-mqtt or trunk-recorder-mqtt-status have no opportunity to act on these events regardless of their configuration.

P25 Standard Reference
Per TIA-102.AABC §7.3.31, the Call Alert TSBK is a fixed-length 96-bit packet:

Opcode 8bit 0x1F
MFID 8bit Manufature ID
Reserved 8bit
Destination UID 24bit
Source UID 24bit
CRC-CCITT 16 bit

The Destination Unit ID is the operationally significant field — it identifies which specific station radio (and therefore which firehouse) is being alerted.

Attached is a debug log excerpt. Unit 4810011 is the dispatch console originating the Call Alerts 4810184 is a known station alerting radio.
The tsbk20 Acknowledge Response traffic confirms these are real events and the radio infrastructure is responding to them — but because tsbk1f emits no decoded fields, there is no reliable way to identify the destination unit from the log or plugin stream:

[debug]   tsbk20   Acknowledge Response    ga 65533        sa 4810184      Reserved: 255
[debug]   tsbk1f: Call Alert
[debug]   tsbk20   Acknowledge Response    ga 65533        sa 4810184      Reserved: 255
[debug]   tsbk1f: Call Alert
[debug]   tsbk20   Acknowledge Response    ga 27160        sa 4810011      Reserved: 106

Requested Changes

Decode the tsbk1f payload in the core P25 decoder — extract and log dst (destination unit ID) and src (source unit ID):

tsbk1f: Call Alert src: 4810011 dst: 4810184

Expose the decoded fields via the plugin callback interface — Call Alert should either get its own callback or be included in the existing trunking message callback with its fields populated, so that downstream plugins can act on the event. The current behavior swallows the packet entirely before it reaches plugin space.
With the fields exposed at the plugin layer, consumers like tr-plugin-mqtt could emit Call Alert events with no further changes to TR core beyond the decoder and callback wiring.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions