project:sdr:tetra
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
project:sdr:tetra [2016/06/04 15:37] – [What is broken] jenda | project:sdr:tetra [2017/01/02 11:35] (current) – [tetra-listener] rudely replacing with my fork jenda | ||
---|---|---|---|
Line 9: | Line 9: | ||
status=active}} | status=active}} | ||
- | tetra-listener allows decoding of speech on unencrypted Tetra network. Thanks to miracles of wideband SDRs, a small cluster of standard PCs can decode the entire network in a big city in real time. | + | tetra-listener allows decoding of speech |
tetra-listener consists of GnuRadio Tetra demodulator, | tetra-listener consists of GnuRadio Tetra demodulator, | ||
- | https://brmlab.cz/ | + | https://jenda.hrach.eu/ |
[[https:// | [[https:// | ||
Line 19: | Line 19: | ||
===== Architecture ===== | ===== Architecture ===== | ||
- | tetra-rx utility from osmo-tetra is patched to dump traffic data to file. | + | tetra-rx utility from osmo-tetra is patched to dump traffic data to a file. |
- | tetra.sh spawns one tetra-rx process for each channel we want to listen to (usually 36, 72 or 108 channels), reading raw bits from FIFO, dumping decoded traffic to traffic.out and logs to log.txt (redirect to /dev/null if you don't need them anymore as this can generate 10 GB of logs per hour!) | + | tetra.sh spawns one tetra-rx process for each channel we want to listen to. Then, tetra.sh spawns one tetra_rx_multi.py |
- | + | ||
- | Then, tetra.sh spawns one tetra_rx_multi.py, | + | |
Then, tetra.sh periodically checks for recorded traffic files and runs ETSI reference codec on them. | Then, tetra.sh periodically checks for recorded traffic files and runs ETSI reference codec on them. | ||
- | ===== Hardware ===== | + | Additionally, |
- | For receiving, rtl-sdr works. Of course anything better is… better. | + | {{ :project:sdr:tetra:tetra.png? |
- | + | ||
- | Unfortunately, | + | |
===== How To ===== | ===== How To ===== | ||
- | Get yourself https:// | + | [[: |
- | On amd64 Debian, a non-obvious dependency is lib32gcc-5-dev. The codec can also run on 32bit ARM and probably | + | [[: |
- | Then you need libc6-dev: | + | You can uncomment |
- | + | ||
- | And libtalloc-dev libpcsclite-dev for libosmocore. | + | |
- | + | ||
- | Calibrate your SDR, like with kalibrate-rtl. | + | |
- | + | ||
- | Open your favorite SDR tool and look for Tetra channels in the 420-430 MHz range. It's 25 kHz wide [[http://www.sigidwiki.com/ | + | |
- | + | ||
- | Edit config.sh. | + | |
- | + | ||
- | Recommended: | + | |
- | < | + | |
- | iptables -A INPUT -p UDP --dport 4729 -j DROP | + | |
- | </ | + | |
- | + | ||
- | Run radio-tetra/ | + | |
- | + | ||
- | Check what you have found: | + | |
<code bash> | <code bash> | ||
Line 72: | Line 51: | ||
</ | </ | ||
- | If you see "Air encryption: 0", you are fine. If encryption | + | ===== What is broken ===== |
- | ===== Jenda' | + | The dumper just appends all the audio data from a timeslot to one file. This mixes conversations together, but strict splicing would not be good either as there can be pauses in speech. Maybe we should lower the pause threshold from current one minute to something like 20 seconds. |
- | Not mainlined because | + | Recognizing SSI/group ID could be very useful if one network is shared by multiple organizations. Currently we try to guess the SSI; proper implementation |
- | You need [[:user:jenda:blobutils]]. | + | Protocol decoding beyond traffic frames needs some love. SDSs are now implemented by a [[https:// |
- | Apply [[http:// | + | Uplink support would be nice. |
- | * tetra.patch - enables our favorite stuff - frequency | + | Error correction |
- | * bitstream.patch - dump raw packed bitstream (unpack with gr-unpack and feed to tetra-rx later) | + | |
- | * resample.py - receive Tetra even on SDRs that do not have sample rate that is an integer multiply of 900 kHz | + | |
- | * tetra.grc - one-channel graphic receiver | + | |
- | Work around broken squelch: run it for several hours with all " | + | Duplicates occur when one sniffs multiple BTSs at once. Detect |
- | + | ||
- | There is also some autotune feature, pick some strong from tetra_cli_pwr.py and then put it to self.afc_channel. | + | |
- | + | ||
- | cdp is now your ACELP player if you set REC_FORMAT=cdata.bz2, | + | |
- | + | ||
- | ===== What is broken ===== | + | |
- | + | ||
- | The dumper just appends all the audio data from a channel to one file. This mixes conversations together. And also probably interleaves data if they are on both timeslots in parallel. | + | |
- | + | ||
- | SSI/group ID of the conversation is not recognized. This could be very useful if one network is shared by multiple organizations. | + | |
- | + | ||
- | Protocol decoding beyond traffic frames needs some love. There are two efforts to decode SDSs: | + | |
- | * [[https:// | + | |
- | * [[https:// | + | |
- | + | ||
- | Uplink support would be nice. | + | |
The project lives as a combination of patches that occasionally break with new commits. We really need to mainline all of them into one thing. | The project lives as a combination of patches that occasionally break with new commits. We really need to mainline all of them into one thing. | ||
Script that automatically selects channels not only based on signal strength, but on amount of traffic, would be nice. | Script that automatically selects channels not only based on signal strength, but on amount of traffic, would be nice. |
project/sdr/tetra.txt · Last modified: 2017/01/02 11:35 by jenda