Listening to Iridium satellite traffic on Ubuntu (16.04 LTS)

Software
Download gr-iridium.
Download iridium-toolkit.

Hardware
RTLSDR/HackRF (using HackRF here).
A L-band patch antenna (using outernet’s antenna here).
A low noise amplifier allowing frequencies 1.616 – 1.6265 GHz (ideal but optional to perform initial tests).
A modified GPS antenna can also be used instead.
For a full list of hardware options please refer to CCC.

Target Frequencies
1.616 – 1.6265 GHz (L-band).
The outernet LNA does not fit this band but can be modified.
To get going quickly with rough results, it is still possible to receive messages without any filter.

Installing gr-iridium
Assuming GNU Radio and HackRF are already installed.
Download gr-iridium.
Install with the following commands:
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig

There should now be iridium blocks available in GNU Radio Companion.
The command line tool iridium-extractor should also be available.

Installing iridium-toolkit
Download iridium-toolkit.
No installation needed, just extract the zip file.

Listening to Iridium signals
Within the gr-iridium directory, the following command can be used:
(if using a RTLSDR, then use the rtl-sdr.conf file instead)
$ iridium-extractor -D 4 examples/hackrf.conf | grep "A:OK" > output.bit

Output should look something like:
osmosdr 0.1.4 (0.1.4) gnuradio 3.7.9
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy redpitaya
Using HackRF One with firmware git-44df9d1
(RF) Gain: 14.0 (Requested 10)
BB Gain: 20.0 (Requested 20)
IF Gain: 40.0 (Requested 40)
Bandwidth: 10000000.0 (Requested 10000000)
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO1476513419 | i: 0/s | i_avg: 0/s | q: 0 | q_max: 0 | o: 0/s | ok: 0% | ok: 0/s | ok_avg: 0% | ok: 0 | ok_avg: 0/s | d: 0
OO1476513420 | i: 5/s | i_avg: 2/s | q: 0 | q_max: 3 | o: 5/s | ok: 83% | ok: 4/s | ok_avg: 83% | ok: 5 | ok_avg: 2/s | d: 0
1476513421 | i: 12/s | i_avg: 6/s | q: 0 | q_max: 2 | o: 12/s | ok: 84% | ok: 10/s | ok_avg: 84% | ok: 16 | ok_avg: 5/s | d: 0
1476513422 | i: 14/s | i_avg: 8/s | q: 0 | q_max: 2 | o: 14/s | ok: 100% | ok: 14/s | ok_avg: 91% | ok: 31 | ok_avg: 7/s | d: 0
1476513423 | i: 16/s | i_avg: 10/s | q: 0 | q_max: 3 | o: 16/s | ok: 88% | ok: 14/s | ok_avg: 90% | ok: 46 | ok_avg: 9/s | d: 0
1476513424 | i: 19/s | i_avg: 11/s | q: 0 | q_max: 3 | o: 19/s | ok: 70% | ok: 13/s | ok_avg: 84% | ok: 60 | ok_avg: 9/s | d: 0
1476513425 | i: 20/s | i_avg: 13/s | q: 0 | q_max: 3 | o: 20/s | ok: 80% | ok: 16/s | ok_avg: 83% | ok: 77 | ok_avg: 10/s | d: 0
...

Next, look at the captured traffic in the output.bit file:
$ tail -f output.bit

The output should look something like:
RAW: i-1476565594-t1 0009152 1626448000 A:OK I:00000000041 98% 0.009 132 001100000011000011110011001100111111001100110011111100110000101000011111
01000001001000010000000010100010100001001100011000000000000000000000000000000000000000000000000000000000000000001100110011001100110011001100110011
0011001100110011001100110011001001011110101101101100110011111111100001
RAW: i-1476565594-t1 0014822 1626280832 A:OK I:00000000045 86% 0.003 86 001100000011000011110011100000101001110001111111010001010110000010101111
1010010010110010011111010010001000000001101111100100100010001100100001100011010100110001100000000001000011100000111111111111
RAW: i-1476565594-t1 0019142 1626280448 A:OK I:00000000055 90% 0.004 140 001100000011000011110011100101001011100100001111011010010111001110101000
10101000011100110111001110110000000000001000001001010000011000000110001000100000001100001000010010100110101011001111111111111111111111111111111111
11111111111111111111111111111110010111101011011011001100111101000000100010001001000001
RAW: i-1476565594-t1 0020032 1621280384 A:OK I:00000000067 82% 0.003 179 001100000011000011110011000100011011001100000010001000000111001101100001
00010101110101001100110001010101010011010100110101010101010101010101010101010101010101010101010101010101010101010101110001001101010101010101010101
01010101010101010101010101010111000011010101010101010101010101010101010101110001010101010101010101010101010101010101010101010101010101010101010101
010101011100010101

Decoding Iridium signals
Within the iridium-toolkit directory, the following command can be used:
$ python iridium-parser.py output.bit > output.parsed

The output should look something like:
IRA: i-1476565594-t1 000053431 1626276608 81% 0.004 131 DL sat:80 beam:28 pos=(-43.58/+139.10) alt=804 RAI:48 ?10 bc_sb:07 PAGE(tmsi:38018671 msc_id:01) descr_extra:11101011010111100111001100111110100110
IRA: i-1476565594-t1 000054512 1626276480 95% 0.005 110 DL sat:80 beam:31 pos=(-43.51/+139.09) alt=803 RAI:48 ?10 bc_sb:12 PAGE(NONE) descr_extra:011010110101111001110011001111011011100000000000000110010011
IBC: i-1476565594-t1 000059452 1619859200 86% 0.004 137 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 0000 time:2016-10-16T08:07:36Z descr_extra:101110001100
IBC: i-1476565594-t1 000059632 1619859072 90% 0.004 143 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 101110100011111111111111110000 max_uplink_pwr:31 descr_extra:011110010111010100111101
IBC: i-1476565594-t1 000059812 1619858944 94% 0.004 137 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 0000 tmsi_expiry:284264056 descr_extra:001101000111
IBC: i-1476565594-t1 000059992 1619859072 87% 0.004 138 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 0000 time:2016-10-16T08:07:37Z descr_extra:00001100011001
IBC: i-1476565594-t1 000060172 1619858944 92% 0.004 139 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 101110100011111111111111110000 max_uplink_pwr:31 descr_extra:1111000101010101
IBC: i-1476565594-t1 000060352 1619858944 90% 0.004 142 DL bc:0 sat:80 cell:31 0 ts:1 sv_blkn:0 aq_cl:1111111111111111 aq_sb:12 aq_ch:0 00 0000 tmsi_expiry:284264056 descr_extra:0101001110110011010100
...

To visualise the types of messages captured:
$ python stats.py output.parsed

To check if your data contains voice calls:
$ python stats-voc.py output.parsed

Select the samples and play-iridium-ambe will decode and play the calls.

Leave a Reply

Your email address will not be published. Required fields are marked *