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.
How it works
Section titled “How it works”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-talkgroupon the Vexillum side,-bm-talkgroupon the Brandmeister side.
The source ID, frame type, and burst content pass through unchanged.
Before you start
Section titled “Before you start”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.
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.
Brandmeister side
Section titled “Brandmeister side”| 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. |
Vexillum side
Section titled “Vexillum side”| 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 |
Status
Section titled “Status”GET /status reports both sides:
Background
Section titled “Background”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.