Skip to content

Releases

v1.1 — Production release

Choose a tag to compare

@n0mjs710 n0mjs710 released this 01 May 22:45

Stable, hardware-verified IPSC↔HBP translator. Tested against a Motorola MOTOTRBO XPR8400 repeater and HBLink4. The main branch at this tag is the recommended starting point for production deployments.

Bug fixes

  • Fix HBP→IPSC voice burst mis-classification — dtype convention mismatch (0-indexed vs HBLink4's 1-indexed) caused wrong packet lengths to be sent to the repeater, producing audio loss for some users
  • Fix IPSC→HBP outbound dtype — bursts B–F now correctly send dtype 1–5 per the HBP/HBLink standard; downstream clients were receiving subtly wrong burst labels
  • Fix dual-timeslot blocking — all call state is now isolated per timeslot; a call on TS1 no longer blocked translation on TS2
  • Add per-TS call timeout — recovers cleanly from a lost VOICE_TERM without manual intervention

Observability

  • Wire logging normalized: both IPSC and HBP emit PROTO RECV/SEND N hex lines, readable by a single log capture
  • New tools/decode_ipsc.py and tools/decode_hbp.py — decode wire logs into human-readable call analysis with LC decode, AMBE hex, RTP sequence gap detection, and burst counts
  • Known-but-unhandled IPSC opcodes now log at DEBUG ("received, not handled") rather than WARNING; genuinely unknown opcodes log at WARNING with the full raw payload

Resilience & hardening

  • IPSC registration hijack protection — only the first registered peer IP is accepted; configurable allowlist
  • Registration config simplified — registration_mode and id_match removed

Testing

  • 51-test suite covering per-timeslot isolation, call timeout, and roundtrip translation scenarios

v1.0b — First working release (beta)

Choose a tag to compare

@n0mjs710 n0mjs710 released this 25 Apr 01:26

ipsc2hbp v1.0b — Beta

A bidirectional, single-process Python 3 protocol translator that connects one Motorola MOTOTRBO repeater (IPSC peer) to one upstream DMR network server (HomeBrew Protocol master — BrandMeister, DMR+, HBlink4, etc.).

This replaces the legacy two-process Python 2 chain (DMRlink IPSC_Bridge + HBlink HB_Bridge communicating over a local UDP socket) with a single Python 3.11+ process that translates directly in memory.


Status

Minimally working. Both directions of voice have been tested live against a real Motorola MOTOTRBO repeater and a real HBP master. Audio is clear end-to-end. AMBE round-trip has been verified lossless (0 bit errors across 48 SLOT_VOICE bursts). The bridge has been running under systemd without incident.

This is a beta release. We believe it is solid, but it has not been tested across a wide range of repeater models, firmware versions, codeplug configurations, or network conditions. Please report bugs.


What works

  • IPSC master stack — registration, keepalive, watchdog, HMAC-SHA1 auth
  • HBP peer stack — full handshake (RPTL/RPTK/RPTC/RPTO), keepalive, reconnect on any disconnect
  • Outbound voice: IPSC GROUP_VOICE → HBP DMRD (VOICE_HEAD, SLOT_VOICE all burst types A–F, VOICE_TERM)
  • Inbound voice: HBP DMRD → IPSC GROUP_VOICE (VOICE_HEAD, SLOT_VOICE all burst types, VOICE_TERM)
  • TRACKING mode: HBP connects/disconnects with the IPSC peer
  • PERSISTENT mode: HBP stays connected regardless of IPSC peer state
  • --wire capture mode for AMBE round-trip diagnostics

Known limitations / out of scope

  • Group voice only — private calls are not translated
  • Single repeater, single network — one IPSC peer, one HBP master
  • No TGID or timeslot rewriting — translates what it receives
  • No data calls — GROUP_DATA and PVT_DATA are silently dropped
  • No burst timeout watchdog — if a call loses its VOICE_TERM, the bridge waits for the repeater to resolve it

See theory_of_operation.md in the repository for full protocol and architecture documentation.


Requirements

  • Python 3.11+
  • dmr-utils3 and bitarray (pip install -r requirements.txt)
  • See INSTALL.md for setup and systemd configuration

Bug reports

Please open an issue at https://github.com/n0mjs710/ipsc2hbp/issues and include:

  • Repeater model and firmware version
  • HBP master (BrandMeister, DMR+, HBlink4, other)
  • Log output at DEBUG level (--log-level DEBUG)
  • If audio-related: a --wire capture if possible