Skip to content

Brandmeister OpenBridge

vex-openbridge-bridge links a Vexillum DMR instance to a Brandmeister talkgroup using OpenBridge, Brandmeister’s protocol for linking DMR servers to each other.

Use it when you have an OpenBridge peering agreement with Brandmeister. If you only need to connect as a hotspot, vex-dmr-bridge is simpler and needs no approval.

OpenBridge has no login or repeater registration. Each packet carries the same DMRD core as the Homebrew repeater protocol, signed with an HMAC-SHA1 of a shared passphrase. The HBlink3 reference implementation was used to confirm the format.

Both sides carry identical DMR AMBE+2 bursts, so the bridge doesn’t change the audio or rebuild any framing. It only translates two things:

  • Timeslot: slot 2 on the Vexillum side, slot 1 on the Brandmeister side. Brandmeister and DMR+ require all OpenBridge traffic on slot 1.
  • Talkgroup: -vex-talkgroup on the Vexillum side, -bm-talkgroup on the Brandmeister side.

The source ID, frame type, and burst content pass through unchanged.

You can’t set up an OpenBridge peer yourself. Open a support ticket with Brandmeister (see their bridging documentation) explaining which talkgroups you want and why. If they approve it, Brandmeister gives you:

  • the peer address,
  • a network ID,
  • the shared passphrase.

On the Vexillum side, note the DMR instance’s Talk TG and password from the admin interface.

git clone https://repo.kc1awv.net/Vexillum/vex-openbridge-bridge.git
cd vex-openbridge-bridge
go build ./cmd/vex-openbridge-bridge
export VEX_DMR_PASSWORD='...'
export BM_OPENBRIDGE_PASSPHRASE='...'

./vex-openbridge-bridge \
  -bm-peer-address bm-master.example.net:62031 \
  -bm-network-id 9990001 \
  -bm-talkgroup 3170603 \
  -vex-master 127.0.0.1:62031 \
  -vex-id 9990001 \
  -vex-callsign N0CALL \
  -vex-talkgroup 91 \
  -status-addr 127.0.0.1:8098

Once it’s running, designate the bridge on the DMR instance, matching its -vex-id repeater ID, so Brandmeister calls are reported as bridged rather than as local talkers.

Flag Default Description
-bm-peer-address (required) Brandmeister OpenBridge master, host:port (usually port 62031)
-bm-talkgroup (required) Brandmeister talkgroup to relay
-bm-network-id 0 This bridge’s network ID, as issued by Brandmeister. Sent in the repeater ID field. Brandmeister uses it only for logging.
-bm-passphrase-env BM_OPENBRIDGE_PASSPHRASE Environment variable holding the shared passphrase
-bm-local-addr (OS picks) Local UDP address to bind for the Brandmeister side, if Brandmeister expects traffic from a specific port
-bm-both-slots false Accept and relay both slots instead of requiring slot 1. For non-Brandmeister OpenBridge peers only.
Flag Default Description
-vex-master (required) Vexillum DMR instance, host:port
-vex-id (required) Repeater ID the bridge presents to Vexillum
-vex-callsign (required) Callsign the bridge presents to Vexillum
-vex-talkgroup (required) Must exactly match the DMR instance’s Talk TG
-vex-password-env VEX_DMR_PASSWORD Environment variable holding the instance password
-vex-power 1 Power in watts reported to Vexillum
-vex-location (empty) Location reported to Vexillum
-vex-description Brandmeister OpenBridge link Description reported to Vexillum (max 19 bytes)
-color-code 1 Color code reported to Vexillum
-status-addr :8098 Address for the /status endpoint

GET /status reports both sides:

{
  "vex": {"state": "running", "last_event": "connected", "updated_at": "..."},
  "brandmeister": {"state": "running", "last_event": "connected", "updated_at": "..."}
}

An earlier version tried to reach Brandmeister through its D-Star-shaped “XLX Bridge” feature instead. Several framing bugs were found and fixed during live testing, but traffic that reached Brandmeister still wasn’t reliably delivered to listeners, and the cause was on Brandmeister’s side. That approach was dropped in favor of OpenBridge. The old code remains in the vex-xlx-bridge git history.