op25 is basically an SDR based radio scanner that can decode and manage trunked radio communication. For more information, see http://osmocom.org/projects/op25/wiki.
This procedure will install the boatbod fork. It must be installed after the gr-osmosdr step on Part 1 of these procedures.
APCO Project 25 is the digital communications standard used by many police and emergency services throughout the world. Most notably the US, Canada and Australia deploy systems based on P25. Compared to existing analog systems, P25 offers improved spectrum use, coverage and flexibility. Provision is made to ensure the confidentiality of traffic, to allow the use of trunking and the provision of data in addition to voice services.
Some services are encrypted. This software does not provide decryption.
op25 can also be set up to stream online. Online streaming is not covered here.
sudo apt-get install libitpp8v5 libitpp-dev libpcap0.8-dev sudo apt-get install gnuplot-x11 # Warning: may install Qt5.11 on Raspberry Pi OS. Check the installer when it asks permission to proceed.
cd ~ git clone https://github.com/boatbod/op25 cd op25 sudo sed -i -- 's/^# *deb-src/deb-src/' /etc/apt/sources.list # Tell op25 to use python3 echo "/usr/bin/python3" > op25/gr-op25_repeater/apps/op25_python mkdir build cd build cmake ../ make -j 4 sudo make install sudo ldconfig
cd ~/op25/op25/gr-op25_repeater/apps
# For SDRplay: ./rx.py --args 'driver=sdrplay,soapy=0' -N 'IFGR:28,RFGR:2' -S 2500000 -x 1 -f 855.2875e6 -o 1e3 -q -1 # For HackRF ./rx.py --args 'hackrf' -g 65 -N 'RF:14,IF:32,BB:26' -S 1000000 -x 1 -f 855.2875e6 -o 50e3 -q -1
# For SDRplay: ./rx.py --args 'driver=sdrplay,soapy=0' -N 'IFGR:28,RFGR:2' -S 2500000 -x 1 -f 855.2875e6 -o 1e3 -q -1 -d 600 # For HackRF: ./rx.py --args 'hackrf' -g 65 -N 'RF:14,IF:32,BB:26' -S 1000000 -x 1 -f 855.2875e6 -o 50e3 -q -1 -d 600
NAC 0x799 WACN 0x92493 SYSID 0x796 855.287500/810.287500 tsbks 10
Sysname | Control Channel List | Offset | NAC | Modulation | TGID Tags File | Whitelist | Blacklist | Center Frequency |
Washtenaw County | 855.28750 | 0 | 0x799 | cqpsk | washtenaw.tsv |
2191 | Washtenaw County Ann Arbor Dispatch [Alternate] | 1 |
2237 | Huron Valley Ambulance: Dispatch | 3 |
cd ~/op25/op25/gr-op25_repeater/apps grep "\- Secure" michigan.tsv > blacklist.tsv
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'driver=sdrplay,soapy=0' -N 'IFGR:28,RFGR:1' -S 2500000 -x 1 -f 855.2875e6 -o 1e3 -q -1 -d 600 -T michigantrunk.tsv -V -2 -O pulse -U 2> stderr-stream0.2 # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'hackrf' -g 65 -N 'RF:14,IF:32,BB:26' -S 1000000 -x 1 -f 855.2875e6 -o 50e3 -q -1 -d 1200 -T michigantrunk.tsv -V -2 -U 2> stderr-stream0.2Add -O pulse to the command line if your audio is garbled. You may have to experiment to get all of the SDR apps to work.
sudo apt-get install liquidsoap
apt list -a liquidsoap Listing... Done liquidsoap/testing,now 1.4.1-2 arm64 [installed]
sudo mkdir /usr/share/liquidsoap/1.4.1 sudo ln -s /usr/share/liquidsoap/libs /usr/share/liquidsoap/1.4.1/
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'driver=sdrplay,soapy=0' -N 'IFGR:28,RFGR:1' -S 1000000 -x 1 -f 855.2875e6 -o 1e3 -q -1 -d 700 -T michigantrunk.tsv -V -2 -w 2> stderr-stream0.2 # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'hackrf' -g 65 -N 'RF:14,IF:32,BB:26' -S 1000000 -x 1 -f 855.2875e6 -o 50e3 -q -1 -d 1200 -T michigantrunk.tsv -V -2 -w 2> stderr-stream0.2
cd ~/op25/op25/gr-op25_repeater/apps ./op25.liq
cd ~/op25/op25/gr-op25_repeater/apps tail -f stderr-stream0.2
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'driver=sdrplay,soapy=0' -N 'IFGR:28,RFGR:1' -S 1000000 -x 1 -f 855.2875e6 -o 1e3 -q -1 -d 700 -T michigantrunk.tsv -V -2 -v 1 -w -l 'http:0.0.0.0:8080' # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./rx.py --args 'hackrf' -g 65 -N 'RF:14,IF:32,BB:26' -S 1000000 -x 1 -f 855.2875e6 -o 50e3 -q -1 -d 1200 -T michigantrunk.tsv -V -2 -v 1 -w -l 'http:0.0.0.0:8080'
cd ~/op25/op25/gr-op25_repeater/apps ./op25.liq
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -c dmr_cfg.json -v 10 3>&1 1>&2 2>&3 | grep DSTADDR # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -c dmr_cfg_hackrf.json -v 10 3>&1 1>&2 2>&3 | grep DSTADDR
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -c dmr_cfg_ext_audio.json -v 10 # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -c dmr_cfg_hackrf_ext_audio.json -v 10
cd ~/op25/op25/gr-op25_repeater/apps ./op25-2_channel.liq
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -v 4 -c smartnet_test.json 2> stderr.2 # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -v 4 -c smartnet_hackrf.json 2> stderr.2
cd ~/op25/op25/gr-op25_repeater/apps tail -f stderr.2
# For SDRplay: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -v 4 -c smartnet_test_http.json # For HackRF: cd ~/op25/op25/gr-op25_repeater/apps ./multi_rx.py -v 4 -c smartnet_hackrf_http.json
cd ~/op25/op25/gr-op25_repeater/apps ./op25.liq