OP25 is a program that decodes P25 Phase 1 and Phase 2 digital radio. Some municipal areas are upgrading to P25 Phase 2 so almost gone are the days that you can track them with a police scanner since P25 is a Trunked Radio system and not just a lone frequency to monitor. The only things that do Phase 2 are hardware scanners and hardware radios and OP25 for software radios. Bear in mind Phase 2 could be encrypted and nothing you can do will decode it.
OP25 is HARD. I’m a geek and I messed with it on and off for a year or more and it whipped me more than once. Now that I have it working I find that it is REMARKABLY easy and I’m mad at all the geeks out there who never made a simple tutorial. There are tutorials out there, some good but everybody leaves out the good stuff or the stuff they took for granted.
I’m kind of working on the assumption that you have Linux installed and have your SDR device working. In a pinch I guess the first thing you could do is to install gqrx which would pull in all the necessary RTL stuff you need. Follow the directions here if you need to. Yeah that’s a weird way of doing it but it’ll work and probably the easiest thing to do for a newbie.
Installing OP25 is a SNAP. Download from the repository using this command. I’m doing this on Ubuntu 18.04
git clone https://github.com/boatbod/op25.git
It will make a folder called op25
It will instruct you to install GNUPLOT following the build and install process
sudo apt-get install gnuplot-x11
Wait a bit for it to install. It should take care of everything.
Now it is installed but there are three obstacles to overcome.
- How to launch the program with what command to use
- How to set up the file trunk.tsv
- How to set up the file yourcity.tsv
That’s basically it. Now my assumption here is that you are using a generic RTL-SDR device. I’m using a V3.
These will set you back about $30 or so. But you only need one of these to track a trunked radio system.
So plug in your RTL-SDR device and let’s get ready to do this thing.
I’m going to demonstrate using my home town of New Bern NC. Lets find the trunked system to follow.
Go to this page to list the frequencies.
This page will not always be spot on. The actual control channel at the moment (they change it sometimes) is 857.2625.
To find the control channel if you don’t know which one it is just open a program like GQRX and look and listen for the control channel. It will sound like digital noise. And the signal will be a constant spike. As you can see I found my Control Channel at 857.2625 as stated above.
Now go back to your system and get in the correct directory. Check your path for accuracy.
Now try this command IF YOU ARE SETTING UP A DIFFERENT FREQUENCY FOR YOUR TOWN MAKE SURE TO ADJUST THE FREQUENCY IN THE COMMAND. I ALSO FOUND I CAN DO THIS WITH AN ADALM-PLUTOSDR BY CHANGING THE –ARGS TO ‘plutosdr’.
./rx.py --args 'rtl' -N 'LNA:47' -S 2400000 -f 857.2625e6 -o 25000 -q -2
If you get a bunch of errors remove the last part of the command (-q -2) It works as above on my V3 SDR but not on my NESDR Smart. You may also have to adjust the -2 number depending on your individual SDR. Have fun with that. To further illustrate my SDR v3 works at -2, my NESDR Smart works with the -q -2 removed (0), and my Adalm-Pluto works at -q 5 (positive 5). You just have to play around until you get your signal centered on the plot.
As per the pic below ………If where it says 857.262500/812.262500 is all zeros then you need to keep adjusting the -q number. On that screen you can start GNUPLOT by pressing the number 1 key. Keep messing with the q number until the signal is centered on the plot.
Something like the box above should pop up. There won’t be any sound but take note of the NAC. In my case it is 0xfc We’re going to need that. Copy your NAC for your frequency. YOU WILL ONLY GET THE CORRECT NAC IF YOU ARE TUNED TO THE CONTROL CHANNEL YOU WANT TO MONITOR.
Now you should still be in the apps directory. Double click on the file named trunk.tsv and open it with LibreOffice. Make sure the file looks like this and has these settings. (I’ve already modified my file, so ignore the difference.)
Now take note of the way I changed the file. I made the SysName = NewBern, then put my control channel frequency in, put the NAC I copied earlier in, and then told it the tag file was named newbern.tsv Under modulation there are only two types, CQPSK or C4FM. If one doesn’t work, try the other. Save this and exit. Save it as the “Use Text CSV Format”
Now open the file tompkins.tsv It looks like this. Make sure the settings are the same as depicted above.
Delete all the filled in fields in here and go back to the radio reference.com page where all the New Bern frequencies were.
NOTE: TO EASILY INPUT TALK GROUP DATA GET A PREMIUM MEMBERSHIP AT RADIOREFERENCE.COM ($30 per year) AND YOU CAN DOWNLOAD SPREADSHEETS AND JUST CUT AND PASTE THEM INTO YOUR TSV FILES BELOW. I MERGED TWO TAG CELLS TOGETHER TO GET MORE DESCRIPTIVE INFORMATION, ESPECIALLY ON THE VIPER SYSTEM THAT HAS OVER 2000 ENTRIES. HOW’D YOU LIKE TO HAND ADD 2000 ENTRIES?
Now go to the tompkins.tsv file that you cleared and type in column A the numbers in the DEC column (i.e. 100, 101, 102, etc.) Then in column B insert in the tag (i.e. Law Dispatch, Public Works, etc.).
Sorry mine are not in order. Sue me.
Do a “Save As” and name the file newbern.tsv (remember that field in the other file you named newbern.tsv). Make sure this file is also saved in the same format as above and also in the apps directory where the tompkins.tsv file was.
Okay open your terminal. cd to the apps directory /op25/op25/gr-op25_repeater/apps and do this command:
./rx.py --args 'rtl' -N 'LNA:47' -S 2400000 -f 857.2625e6 -o 25000 -q -2 -T trunk.tsv -V -2 -U 2> stderr.2
Again you may have to remove the -q -2 or adjust it depending on your SDR
When OP25 launches hit the number “1” on your keyboard to open GNUPLOT
And now when there is a transmission on the Control Channel, OP25 will track it to the correct frequency and even display the talk group that is currently active.
Now lets make a little script file so we aren’t forever typing long commands.
sudo nano op25.sh
Paste in the following data in the file (MAKE SURE YOUR PATH IS CORRECT AND DON’T FORGET ABOUT THE -q -2 part if you have problems):
./rx.py –args ‘rtl’ -N ‘LNA:47’ -S 2400000 -f 857.2625e6 -o 25000 -q -2 -T trunk.tsv -V -2 -U 2> stderr.2
Hit CTL + the X key then Y to save the file. Now make it executable.
sudo chmod +x op25.sh
Now to launch the file simply be in the directory that script file is in and type:
It will cd to to the right directory and run the command to start OP25.
In the comments below Mr. Alex Bowman found an easier way to launch the program. Create an alias in Linux so that you just type “op25” (without the quotes) into the terminal from any directory.
sudo nano .bashrc
Then paste in the following lines.
alias op25=’bash /home/john/op25/op25.sh’
Be sure your path is right about. Note my path of /home/john. Yours is different unless your name is John, of course.
Now hit Ctl key plus X, then hit Y to save. Restart the terminal and you should now be able to launch OP25 just by typing OP25. It works like a champ. I tried it.
That’s it. I hope I made this easier for someone.
Here’s OP25 in action:
And lastly here is a video of me using OP25 to track 2 Control Channels simultaneously. You’ll hear the transmissions echo in the video. That is my screencast software recording both from the microphone and speakers and not the way OP25 sounds.
On a final note just for fun I installed OP25 on a Raspberry Pi 3 B+. It works like a champ. I installed GQRX first which pulled in most everything OP25 needs and plus I use GQRX a lot anyway. OP25 takes a while to build on a Pi but it does build. If you look at the pic below the CPU usage is 40% however to get this picture I was running a VNC server as well so some of that usage is almost certainly the VNC session.
This is a living document (for a while). If you find something I should add feel free to go to my contact page and email me.