Doh. Yep, I bridge.py now. I am starting small to get at least one bridge working and will replicate from there once success is achieved. I am building the Moto stanzas in dmrlink.cfg as follows and then launching IPSC_Bridge.py to look for errors. Regardless of the port number I use in IPSC_Bridge.cfg, I get an error indicating it is already in use which is pretty odd, at least to me. Logic would tell me to leave the default IP alone as both systems home on the same machine. Am I missing something?
# Below not used for a Master
# MASTER_IP: 220.127.116.11
# MASTER_PORT: 50000
# Below not used for a Master
# MASTER_IP: 18.104.22.168
# MASTER_PORT: 50000
root@AI6BX-DMR:/opt/DMRlink# python IPSC_Bridge.py
INFO 2019-12-01 16:51:32,087 DMRlink 'IPSC_Bridge.py' (c) 2015 N0MJS & the K0USY Group - SYSTEM STARTING...
INFO 2019-12-01 16:51:32,087 Version 20170620
INFO 2019-12-01 16:51:32,088 ID ALIAS MAPPER: 'peer_ids.json' is current, not downloaded
INFO 2019-12-01 16:51:32,088 ID ALIAS MAPPER: 'subscriber_ids.json' is current, not downloaded
INFO 2019-12-01 16:51:32,240 ID ALIAS MAPPER: peer_ids dictionary is available
INFO 2019-12-01 16:51:34,477 ID ALIAS MAPPER: subscriber_ids dictionary is available
INFO 2019-12-01 16:51:34,481 (RIFF_PEER) IPSC Instance Created: 92374, 0.0.0.0:50001
INFO 2019-12-01 16:51:34,482 section = RIFF_PEER
INFO 2019-12-01 16:51:34,482 Section RIFF_PEER was not found, using DEFAULTS
INFO 2019-12-01 16:51:34,482 gateway = 127.0.0.1
INFO 2019-12-01 16:51:34,483 toGatewayPort = 31003
INFO 2019-12-01 16:51:34,483 fromGatewayPort = 62059
INFO 2019-12-01 16:51:34,483 DMRLink IPSC Bridge
INFO 2019-12-01 16:51:34,487 (RIFF_PEER) Registering with the Master: 22.214.171.124:7000
INFO 2019-12-01 16:51:34,488 (IBEX) IPSC Instance Created: 734379, 0.0.0.0:62055
INFO 2019-12-01 16:51:34,488 section = IBEX
INFO 2019-12-01 16:51:34,489 Section IBEX was not found, using DEFAULTS
INFO 2019-12-01 16:51:34,489 gateway = 127.0.0.1
INFO 2019-12-01 16:51:34,489 toGatewayPort = 31003
INFO 2019-12-01 16:51:34,489 fromGatewayPort = 62059
INFO 2019-12-01 16:51:34,489 DMRLink IPSC Bridge
Traceback (most recent call last):
File "IPSC_Bridge.py", line 308, in <module>
systems[system] = ambeIPSC(system, CONFIG, logger, report_server)
File "IPSC_Bridge.py", line 96, in __init__
self.ipsc_ambe = AMBE_IPSC(self, _name, _config, _logger, self._ambeRxPort)
File "/usr/local/lib/python2.7/dist-packages/dmr_utils/ambe_bridge.py", line 525, in __init__
AMBE_BASE.__init__(self, _parent, _name, _config, _logger, _port)
File "/usr/local/lib/python2.7/dist-packages/dmr_utils/ambe_bridge.py", line 187, in __init__
self.udp_port = reactor.listenUDP(self._ambeRxPort, UDP_IMPORT(self.import_datagramReceived))
File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 369, in listenUDP
File "/usr/lib/python2.7/dist-packages/twisted/internet/udp.py", line 178, in startListening
File "/usr/lib/python2.7/dist-packages/twisted/internet/udp.py", line 198, in _bindSocket
raise error.CannotListenError(self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on any:62059: [Errno 98] Address already in use.
From: <main@DVSwitch.groups.io> on behalf of "Cort N0MJS via Groups.Io" <n0mjs@...>
Date: Sunday, December 1, 2019 at 6:54 AM
To: "email@example.com" <main@DVSwitch.groups.io>
Subject: Re: [DVSwitch] Linking dmrlink and HBlink3 #dmrlink #hblink
I am not seeing bridge.py in my installs. I do have hb_bridge.py and hb_bridge_all.py. Are these interchangeable?
bridge.py is part of hblink3 – the Python 3 version of HBlink.
HB_Bridge.py and hb_bridge_all.py are completely different programs with completely different uses.
With IPSC_Bridge.py I am getting the following errors at start up.
twisted.internet.error.CannotListenError: Couldn't listen on any:31000: [Errno 98] Address already in use.
“Address already in use” Something else on your system is already listening on UDP port 31000.
You’re really going to have to think about your project goals and make a decision. I have run systems with confbridge.py running on one side and bridge.py on the other… There are a LOT of things that can get you in trouble. You’ll have to remember, you’re essentially running two separate multi-system “networks” that are cross-connected to each other.
If at all possible, I’d recommend handling all of your call routing in bridge.py and translating the Motorolas into home-brew. Why this way and not the other? I’ve sunset development on DMRlink – mostly because I don’t even have a Motorola repeater anymore and I need at least 2 to really do any development work with it. Time is another reason. But I also see home-brew protocol and MMDVM as the future of digital ham radio… for me at least, and since I’m not getting paid for this, I’ll be following the beat of my own drum :)
Because you’re so Motorola heavy, you should consider running the call routing in confbridge.py on the IPSC side and bring your MMDVMs in as the afterthought. Just remember that there will be no new development on DMRlink unless someone else does it. It is what it is.
For the KS-DMR network, when someone shows up with a Motorola repeater, we deploy an IPSC_Bridge.py and HB_bridge.py combo for each one. The idea is simply convert the Motorola to speak home-brew as fast and as close to the source as possible. Often times this is a small single board computer – usually with “Pi” in the name somewhere – right with the repeater itself. Other times, for folks who want to be a part of it it just can’t handle (or just don’t want to) running those services we provide them on our infrastructure.
Thank you for your timely and detailed response. With the links Steve sent, I think I am ready to have a go at it again. That said, I note in your response below that use of TGID and some repeater grouping would be desireable which is the other benefit that has drawn me to your work. Would I still use the confbridge.py or bridge.py after setting up IPSC? Would best practice be to remove my current installs of DMRlink and HBlink3 before installing the suggested branch versions?
Why not just connect the XPR8300s to the IPSC system with the SLR5700s? By the way, the “master” is inconsequential. The only purpose it serves is bootstrapping a new peer in the IPSC mesh – it doesn’t really matter who plays that role. When systems are meshed, they all operate as “peers” for the purpose of passing traffic. Master is only unique for link establishment. As for the hotspots, there’s no need to use bridge.py either.
My recommendation is to connect all Motorola repeaters in the same IPSC mesh (system, network – whatever you want to call it), and then use IPSC_Bridge.py and HB_Bridge.py to connect a single Homebrew server (master) over to the Motorolas. BTW: On the home-brew side, “master” does have significant meaning since the repeaters to not form a mesh like IPSC. All traffic has to traverse a central server, which just happens to be (unfortunately, because it really clouds the issue) a “master”.
IPSC_Bridge.py and HB_Bridge.py are found in the specific branches of DMRlink and HBlink (the original Python2 version) named for those programs. You’ll have to clone and switch the branch, or just clone the branch you want directly. Please don’t be temped to just use the versions of confbridge.py etc. with the “Bridge” branches. They’re based on quite old versions that are missing a lot of updates to other programs, but they are EXTREMELY stable and do the job they need to for protocol bridging quite well.
If you are struggling with how branches and stuff work with GitHub, the Internet us FULL of how-tos and tutorials on the topic.
I’m advising this setup because it appears you’re heavily invested in Motorola IPSC networking already, and the solution I’ve offered provides the most continuity for what you’re used to and already doing with the SLR5700s. There’s no need to run confbridge.py or bridge.py unless unless you’re wanting to segregated traffic between parts of your system – that is to say, have a TGID available on a group of repeaters not available on another group, etc.
If you reach the point where you have too many machines in a single IPSC mesh and you’re using too much bandwidth (n-1 stream count and all) you could look into proxy.py in DMRlink, which will transparently break up your IPSC mesh into smaller sub-groups.
- Currently I have an SLR5700 functioning as a master hosting six Motorola DMR repeaters. These all live on a public Internet address.
- I have two Moto XPR8300’s that I want to peer to DMRlink and bridge to the current SLR5700 Master. Ultimately, I wish to transition the six repeaters from the 5700 so they are all on DMR link.
- I am currently working with one MMDVM hotspot on the HBlink3 side of things with the goal of bridging the two sides together, something I can’t do with the SLR5700. Once working, hotspots will likely grow to about 15 or 20 devices.
- Down the road the total number of Moto repeaters will grow to about 15.
- This will be operated on a private network supported by ARDEN mesh networking operating in the 10.x.x.x domain and will have a gateway to the broader Internet via an AMPR.or 44.x.x.x address for hotspot connections when members travel.
- The system will be migrated to a Debian 9 Blade server once ready for production deployment. I am currently building on a Vultr Debian VM for test and learning purposes.
I need to understand what you’re attempting to do. Please fill in the gaps for me?
You have a number of Motorola repeaters and MMDVM devices. You’re trying to make them all talk together on a private network. You do not have any “upstream” connections to the “big networks” or laterals to other independent networks?
Is that right? The use case changes best practice. Also, which “side” has more devices – the Motorola repeaters or the MMDVM devices? Today? Expected in the future?
First, my apology as I am still new to the groups here and finding my way through these tools. DVSwitch is clearly a powerful set of programs and bridges that I am certain will do exactly what I am trying to accomplish Once I better understand the relationships between them and some of the pieces that make those links work. I am currently running:
Bridge.py and have also tried bridge_all.py
Following are my files:
Again, I sincerely appreciate any guidance possible and suspect I am missing something that will be blatantly obvious once pointed out.