OP25 OP25MCH | OP25 Mobile Control Head

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
This is a project that I've been working on for a long time now on and off. It's nowhere near done and I have a lot left to re-implement but here it goes.

The OP25MCH or OP25 Mobile Control Head is an Android app that is written in Python with Kivy that allows you to remotely control an instance of BoatBod's OP25 Fork. This means that with a raspberry pi, a and an Android device you could have a configurable and mobile display and control application for monitoring P25 radio systems.


Currently we're starting and killing the OP25 instance using modified configuration files to provide various options and features. The old application for example support automatic site switching using an external GPS, my intention being to use the GPS in the phone or tablet to do this instead.

Right now it's a nice little display with a way to remotely add a control channel and site name for the trunk.tsv and then start the op25 instance.
I provide an installation script that includes the install of OP25 and a rapsberry pi image so you have options for installation.

Here is how it went:
GitHub: GitHub - SarahRoseLives/OP25MCH: A Mobile Control Head for OP25
If you're interested, have suggestions or concerns with this application and it's future, feel free to let me know.
 

Attachments

  • large_display.jpg
    large_display.jpg
    47 KB · Views: 8

hazrat8990

Member
Premium Subscriber
Joined
Apr 12, 2013
Messages
263
Location
Wyoming
Found your video posted in another thread yesterday. After checking out your channel, I subscribed right away! I'm pretty new to SDR, and I don't currently have a raspberry pi, but I've been thinking it over a bit more since obtaining a few RTL-SDR's, and an Airspy R2. Also, I'm no expert at Linux, but have messed around with Mint, Ubuntu, and Kali enough to totally frustrate myself! I definitely have some learning to do.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
Nice work. Which RPi is the linked .img file made for?
It was done on a Pi 3 but I used the official raspbian lite bookworm image so it should also work on the 4 and 5.

Found your video posted in another thread yesterday. After checking out your channel, I subscribed right away! I'm pretty new to SDR, and I don't currently have a raspberry pi, but I've been thinking it over a bit more since obtaining a few RTL-SDR's, and an Airspy R2. Also, I'm no expert at Linux, but have messed around with Mint, Ubuntu, and Kali enough to totally frustrate myself! I definitely have some learning to do.
I hadn't realized someone had already posted in, I'll have to look for that.
I've been away from YouTube and wanted to get back at it.
Linux based stuff is something I've always wanted to cover but wasn't able to at the time, maybe I can finally do some more linux stuff on the channel.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
I'm still working on this to try and get it up to speed.
Fixed configuration options for multiple control channels, built the UI for config for radio reference although import is still a work in progress in the app.

Externally I generated a talk group list using some old import code I wrote for OP25 and manually put it on the pi.
Updated the system to check for a talkgroup tsv to be added to the config and if it is it'll grab tags instead of ids.




Screenshot_20240603-221923.jpgScreenshot_20240603-221939.jpgimage.png
 

BinaryMode

Member
Joined
Jul 3, 2023
Messages
487
Location
USA
Very cool. I just responded in another thread and didn't see this one.

This creates tsv files? Do I need to have one setup straight away in OP25 prior to using the App?

It's funny it's called "bookworm" as that was a name of Puppy Linux I recently downloaded.

Edit-

Ah, I see now. It's the code name for Debian 12.
 
Last edited:

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
Still working on radio reference importing but yes this will create all the trunk.tsv files and associated taglist.tsv for every site on a given system.

It'll then use this and a location database to allow us to switch between sites by loading up different trunk.tsv files in OP25.
The current public release does run the default trunk.tsv however you can edit it directly in the app.
 

Attachments

  • 2.png
    2.png
    82.7 KB · Views: 6
  • 1.png
    1.png
    11 KB · Views: 6
  • Screenshot_20240610_192913.png
    Screenshot_20240610_192913.png
    30.7 KB · Views: 6

boatbod

Member
Joined
Mar 3, 2007
Messages
3,371
Location
Talbot Co, MD
Still working on radio reference importing but yes this will create all the trunk.tsv files and associated taglist.tsv for every site on a given system.

It'll then use this and a location database to allow us to switch between sites by loading up different trunk.tsv files in OP25.
The current public release does run the default trunk.tsv however you can edit it directly in the app.
Just a word of caution - rx.py is a legacy component of op25 and will, in the not so distant future, be eliminated in favor of multi_rx.py. I would suggest not putting too much effort into tools that create trunk.tsv, and instead direct your efforts on tools than can build cfg.json. That said, op25 is open source, so have fun!
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
Just a word of caution - rx.py is a legacy component of op25 and will, in the not so distant future, be eliminated in favor of multi_rx.py. I would suggest not putting too much effort into tools that create trunk.tsv, and instead direct your efforts on tools than can build cfg.json. That said, op25 is open source, so have fun!

That is a concern I've been considering, I've been using rx.py because I know it supports single SDR operation and because I have the most experience with it.

However, I'm interested in the idea that I could potentially modify a json file and have it re-load on the fly without manually stopping and re-starting the op25 software.

I'll have to play with it a bit to figure out exactly how to handle multi_rx.py so that I can integrate it with the control head application.
Right now I'm using the gr310 branch that I've forked to ensure that things keep working but realistically I'd like to pull from a current branch that stays properly updated.

I'll look into multi_rx.py some more, thank you.
 

BinaryMode

Member
Joined
Jul 3, 2023
Messages
487
Location
USA
Still working on radio reference importing but yes this will create all the trunk.tsv files and associated taglist.tsv for every site on a given system.

It'll then use this and a location database to allow us to switch between sites by loading up different trunk.tsv files in OP25.
The current public release does run the default trunk.tsv however you can edit it directly in the app.

Cool, thanks!
 

boatbod

Member
Joined
Mar 3, 2007
Messages
3,371
Location
Talbot Co, MD
That is a concern I've been considering, I've been using rx.py because I know it supports single SDR operation and because I have the most experience with it.

However, I'm interested in the idea that I could potentially modify a json file and have it re-load on the fly without manually stopping and re-starting the op25 software.

I'll have to play with it a bit to figure out exactly how to handle multi_rx.py so that I can integrate it with the control head application.
Right now I'm using the gr310 branch that I've forked to ensure that things keep working but realistically I'd like to pull from a current branch that stays properly updated.

I'll look into multi_rx.py some more, thank you.
Both variants support single device operation, but the key difference is that multi_rx.py does not support the (truly horrible) round-robin system skipping capability found in rx.py (i.e. multiple lines in trunk.tsv). Both you and I need to figure out a graceful way to reload a cfg.json - I don't think it's particularly difficult, but I've not made the time to sit down and consider what needs to be done and the implications of doing it.

We should probably take the discussion to PM since the majority here aren't going to be too concerned with the "how" things work under the hood, but clearly that matters to both of us.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
Both variants support single device operation, but the key difference is that multi_rx.py does not support the (truly horrible) round-robin system skipping capability found in rx.py (i.e. multiple lines in trunk.tsv). Both you and I need to figure out a graceful way to reload a cfg.json - I don't think it's particularly difficult, but I've not made the time to sit down and consider what needs to be done and the implications of doing it.

We should probably take the discussion to PM since the majority here aren't going to be too concerned with the "how" things work under the hood, but clearly that matters to both of us.

Sounds like a plan, I'm interested.
Haven't dug into it too much but have been wanting to poke at it.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
I was loosing momentum focusing on switching to multi_rx.py so I decided to finish my TSV creation method for site switching and would then focus on mult_rx.py after that.

I'm excited to share I have rudimentary automatic site switching working.
We create a TSV for every site in the system (this takes only seconds) and then we re-start OP25 with the correct TSV file each time our station moves closer to another site.

I've also implemented manual site lock for situations where you're stationary, using radio reference but also don't like the site closest to you.
image.png
Screenshot_20240624-162329.jpg
Screenshot_20240624-162318.jpg


I also need to take some time to focus on making the raspberry pi side easier to use.
It's possible to run OP25 on the phone directly but we'd have to use RTL_TCP for communication and Icecast for audio which I fear could cause some delays in text updates.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
I can't edit and my image links died, just re-posting the screenshots

Screenshot_20240624-162329.jpgScreenshot_20240624-162323.jpgScreenshot_20240624-162318.jpg
 

BinaryMode

Member
Joined
Jul 3, 2023
Messages
487
Location
USA
Yeah, that would be really cool to do this all via phone.

I kick myself for selling my Pi some years ago when the market was hot. I was going to use it as a wardriving rig, but nixed that idea when I saw Pi's going for good money on eBay. LOL

I do have five, count them 5 small Intel NUC type computers I can use though. The only problem with that is unlike a Pi that can use a 5 Volt power source, these NUC type computers don't.

I'm thinking about now buying a Pi just for this project.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
Yeah, that would be really cool to do this all via phone.

I kick myself for selling my Pi some years ago when the market was hot. I was going to use it as a wardriving rig, but nixed that idea when I saw Pi's going for good money on eBay. LOL

I do have five, count them 5 small Intel NUC type computers I can use though. The only problem with that is unlike a Pi that can use a 5 Volt power source, these NUC type computers don't.

I'm thinking about now buying a Pi just for this project.
It is technically possible to run it on the phone directly in a chroot linux, problem is audio... I could stream out via icecast but then we have to worry about sync for the talkgroup data as well as how to pull the audio.
There's still some tricks up my sleeve so maybe we'll get there.
 

at0m

Newbie
Premium Subscriber
Joined
Dec 24, 2021
Messages
2
I love this project and hit my own technical limits in trying to do something similar. My bit of an addition to the discussion would be to suggest basically building a database with the needed information to dynamically create the tsv and tgid files. So basically, as you are driving an attached GPS gets your location, checks it against a database, and can create the needed tsv/tgid files, stop the system and then restart with the new files. Maybe include a range option for jurisdictions within XX miles?

Would it be possible to dynamically fill in the push buttons with the systems that are present and people could select them or a type of system? For example it could pull up both city and county police/fire/etc and a user could select that they only want police and it would deselect the fire/etc. Similarly they could select that they want to listen to the city and not the county.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
I love this project and hit my own technical limits in trying to do something similar. My bit of an addition to the discussion would be to suggest basically building a database with the needed information to dynamically create the tsv and tgid files. So basically, as you are driving an attached GPS gets your location, checks it against a database, and can create the needed tsv/tgid files, stop the system and then restart with the new files. Maybe include a range option for jurisdictions within XX miles?

Would it be possible to dynamically fill in the push buttons with the systems that are present and people could select them or a type of system? For example it could pull up both city and county police/fire/etc and a user could select that they only want police and it would deselect the fire/etc. Similarly they could select that they want to listen to the city and not the county.
Database creation is already done, we're able to create a TSV for each site in the system so that while we drive around sites are switched out based on GPS position. That part is working :)

A range option is an interesting idea which I think may work better than my static way of doing it.

The scan grid isn't done yet but would let users create custom scan lists, however doing that on mobile may be difficult.
I'm interested in this idea of yours to load fire/ems/etc though. Perhaps I can setup scangrid to be set from the get-go when a system is created?

There's definitely somewhere to go with that one!
 

at0m

Newbie
Premium Subscriber
Joined
Dec 24, 2021
Messages
2
One other question/idea? Any idea for linking in non-trunked systems? Example in heavy traffic and want to scan cb frequencies or for including older systems that are non-trunked? With the multi-rx.py I wasn't sure how there could be a list, with rx.py I could see attaching one tuner to scan the list of systems in the tsv and attach another tuner to something like SDRUno and scanning a set of frequencies?

The other thing I've thought about is how to install this on something like picore so it is always a fresh install every time it starts up and I don't have to worry about corruption of the sd card.

As you can see, I probably have much grander ideas than my technical abilities allow me to do. Thank you again for moving this forward.
 

AD8NT

Sarah Rose (Formerly KR0SIV)
Premium Subscriber
Joined
Jun 24, 2012
Messages
151
One other question/idea? Any idea for linking in non-trunked systems? Example in heavy traffic and want to scan cb frequencies or for including older systems that are non-trunked? With the multi-rx.py I wasn't sure how there could be a list, with rx.py I could see attaching one tuner to scan the list of systems in the tsv and attach another tuner to something like SDRUno and scanning a set of frequencies?

The other thing I've thought about is how to install this on something like picore so it is always a fresh install every time it starts up and I don't have to worry about corruption of the sd card.

As you can see, I probably have much grander ideas than my technical abilities allow me to do. Thank you again for moving this forward.
I'm still trying to figure out how I want to handle everything.
There are a lot of SDR apps out there with a lot of different functionality that could potentially be added.
I've considered doing things like using RTL_FM and other applications and piping data over.

That then becomes less of a control head for OP25 and more of a control head in general.
That's not a bad thing, just complicates an application that is quickly growing in size.
I've already started working on other apps to display other applications, in some cases running everything from the phone or android device itself.
It would be nice to have something with more adept and wide-spread functionality.

I think moving past OP25 would mean maintaining a separate project at this time.
Regarding the SD card, that seems to be a big issue on my end. I cannot consistently image it and additional features end with a more complex server side setup with the pi. Making it harder for some users to run.

I want to keep installation and use simple but that's proving difficult.
New video on this project and others soon.
 
Top