Побачив в Флеша пост про супутникові телефони Ірідіум (Iridium), в якому він лінкує на туторіал на ру-Хабрі. Нижче буде переклад цього туторіалу.
У попередній частині ми розглянули приймання сигналів супутників Inmarsat. Зараз ми розглянемо не менш цікаву систему - супутникову систему зв'язку Iridium, прийняти сигнали якої також може у себе вдома будь-хто.
Примітка: нічого секретного в наведених нижче даних немає, описані в статті декодери лежать на github уже не один рік. Частоти і сигнали також доступні будь-кому, хто готовий витратити 35$ на антену і висунути її у кватирку. Попри це, система зв'язку Iridium є діючою, тому деякі дані не викладаються з юридичних міркувань. Цей матеріал призначений виключно для ознайомлення, публікація або зберігання прийнятих повідомлень можуть бути заборонені законодавством тих чи інших країн.
Хардвер
Тут нічого нового немає, все було описано в попередній статті. Я використовував антену "Active L-Band 1525-1637 Patch Antenna", купити яку можна за 35$, і приймач SDRPlay, замість якого можна використовувати RTL SDR V3, вартістю також близько 35$. Таким чином, все обійдеться в суму дешевше 100$, цілком доступно.
Весь комплект для прийому виглядає так (коробка сірників для масштабу):
Далі, відчиняємо вікно (скло глушить радіохвилі цього діапазону), спрямовуємо антену в небо, і можна приймати сигнал. Важливо не забути ввімкнути в налаштуваннях приймача bias-tee, тому що антена є активною і без подачі живлення працювати не буде. Якщо все було зроблено правильно, на частоті приблизно 1.6ГГц ми повинні побачити таку картинку:
До речі, якщо подивитися спектр із більшою деталізацією, то добре видно нахил ліній через ефект Допплера - супутники рухаються орбітою, і частота змінюється.
Цікаво відзначити дві досить принципові відмінності Iridium і Inmarsat.
По-перше, в Inmarsat використовують геостаціонарні супутники, що летять у космосі на геостаціонарній орбіті висотою 35786 км. На відміну від цього, в Iridium використовується інший підхід - понад 60 супутників літають на низьких орбітах (871км), покриваючи всю територію Землі. Це дає змогу використовувати більш компактні та ненаправлені антени, також така система краще працює на північних територіях, де прийом геостаціонарних супутників обмежений. До речі, кількість супутників Iridium було розраховано так, що в будь-який момент часу абонент може використовувати кілька видимих у небі супутників.
І по-друге, в Iridium використовується принципово інша схема передавання даних - замість постійних дата-лінків на постійній частоті використовуються короткі burst-пакети, які можна бачити на картинці.
На цьому ми закінчимо "теоретичну" частину, якщо все працює, то час переходити до софту.
Софтвер
Із софтом для декодування є одна "невелика" складність - він написаний під Linux. Можливо, є секретний спосіб скомпілювати Gnu Radio проєкти під Windows, але у мене жодного разу, крім величезної кількості помилок, так нічого й не вийшло. З Linux все просто і працює "з коробки", але я виходжу з того, що у більшості читачів все ж встановлено Windows. Тож ми підемо обхідним шляхом - запишемо сигнали в HDSDR, а декодер для їхнього опрацювання запустимо на Ubuntu в Windows 10. Благо що Win10 штатно надає таку можливість.
Крок-1. Компіляція gr-iridium
Для початку необхідно завантажити в App Store Ubuntu і встановити туди GNU Radio.
Компіляція декодера gr-iridium виконується без проблем:
git clone https://github.com/muccc/gr-iridium.git
cd gr-iridium
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
Процес виглядає приблизно так:
Для роботи декодера необхідний модуль gr-osmosdr. Його компіляція робиться за таким самим принципом, з однією лише різницею - нам необхідно відключити непотрібні на цьому кроці приймачі, інакше отримаємо помилки компіляції.
git clone git://git.osmocom.org/gr-osmosdr
cd gr-osmosdr
mkdir build
cd build/
cmake .. -DENABLE_UHD=OFF -DENABLE_RTL=OFF -DENABLE_BLADERF=OFF -DENABLE_FCD=OFF -DENABLE_RFSPACE=OFF -DENABLE_REDPITAYA=OFF -DENABLE_HACKRF=OFF
make
sudo make install
sudo ldconfig
Тут є кумедний “підводний камінь”. Запустивши make, я отримав дивні помилки типу `c++: error: /wd4251: No such file or directory`. Пошук у гуглі показує, що ці помилки відносяться до Windows-версії, що при компіляції для Ubuntu не мали би трапитися. Виявилося, може - вивівши докладний лог командою “make -n”, я виявив, що диски Windows за замовчуванням підмонтовані в Ubuntu, і cmake “підхопив” ці файли:
cd /home/<USER>/Documents/gr-osmosdr-0.1.5/build/lib && /usr/bin/c++ -DBOOST_ALL_DYN_LINK -DHAVE_CONFIG_H=1 -DNOMINMAX -DUSE_SSE2 -Dgnuradio_osmosdr_EXPORTS -I/home/<USER>/Documents/gr-osmosdr-0.1.5/build/lib -I/home/<USER>/Documents/gr-osmosdr-0.1.5/include -I/home/<USER>/Documents/gr-osmosdr-0.1.5/lib -I/home/<USER>/Documents/gr-osmosdr-0.1.5/lib/file -I/home/<USER>/Documents/gr-osmosdr-0.1.5/lib/rtl_tcp -I/home/<USER>/Documents/gr-osmosdr-0.1.5/lib/soapy -isystem "/mnt/c/Program Files/PothosSDR/include" -O3 -DNDEBUG -fPIC -Wall -Wextra -Wno-unused-parameter -Wsign-compare -fvisibility=hidden -fvisibility-inlines-hidden -msse2 /MP /wd4251 /wd4503 -o CMakeFiles/gnuradio-osmosdr.dir/source_impl.cc.o -c /home/<USER>/Documents/gr-osmosdr-0.1.5/lib/source_impl.cc
<USER> замініть на назву свого користувача
Звісно, вихідні коди несумісні і нічого не компілюється. Така ось особливість роботи Ubuntu під Windows. Рішення просте - розмонтуємо папку (sudo umount /mnt/c), повторюємо cmake і build, потім монтуємо назад (sudo mount -t drvfs C: /mnt/c). Підмонтовані диски нам знадобляться, коли ми оброблятимемо записані в HDSDR файли.
Останнім кроком нам необхідно встановити Iridium Toolkit:
git clone https://github.com/muccc/iridium-toolkit.git
Тепер усе готово, і ми можемо записати й обробити сигнали Iridium.
Крок-2. Запис сигналів
Тут усе просто - відкриваємо HDSDR, вибираємо ділянку де сигналів побільше, робимо IQ-запис. Сигнали в Iridium йдуть не постійно, а "пакетами", тож, можливо, доведеться трохи почекати. Недолік лише один - великий обсяг запису, одна хвилина з шириною смуги 2МГц займає близько 500Мбайт.
Ще раз повторюся, що під "нормальним" Linux це непотрібно, і можна запустити gr-iridium відразу з SDR-приймачем без проміжного запису, але в Windows це не спрацювало - lsusb не бачить підключених пристроїв.
Крок-3. Обробка
Зупиняємо запис в HDSDR, перемикаємося в Ubuntu в папку /mnt/c/Users/XXX/Documents/HDSDR і вводимо команду:
iridium-extractor -c 1619XXXXXX -r 2000000 -f sc16 --offline HDSDR_20200112_110653Z_1619XXXkHz_RF.wav | grep "A:OK"
Тут HDSDR_20200112_110653Z_1619XXXkHz_RF.wav це записаний нами файл, 1619XXXXXXXX - центральна частота запису і 2000000 - ширина смуги записаного wav-файлу. Якщо все було зроблено правильно, має з'явитися приблизно такий лог:
Якщо пакетів не видно, продовжувати далі безрезультатно, потрібно з'ясовувати, в чому помилка. Якщо записи видно, повторюємо команду ще раз, зберігаємо результати у файл і обробляємо файл за допомогою iridium-parser.py:
iridium-extractor -c 1619XXXXXX -r 2000000 -f sc16 --offline HDSDR_20200112_110653Z_1619XXXkHz_RF.wav | grep "A:OK" > output.bits
python iridium-parser.py output.bits > output.parsed
Тепер ми можемо витягти інформацію зі збереженого файлу output.parsed. "Витягнути" звідти можна різні дані, наприклад текстові або навіть голосові повідомлення. З юридичних міркувань я робити це тут не буду, охочі можуть докладніше прочитати опис на сторінці проєкту. Там є цікаві моменти, наприклад, в Iridium можуть передаватися не тільки текстові або голосові, а й GSM-дані, тобто Iridium-термінал може надавати послуги GSM-зв'язку в тих місцях, де звичайного покриття немає - супутник і термінал тут, ймовірно, працюють лише як "подовжувач" для стандартних GSM-пакетів.
Можна, наприклад, продемонструвати, як із записаних даних отримати координати супутника, що летить:
Координати легко імпортуються, наприклад, в Google Maps і можна побачити, що під час запису супутник пролітав десь над Осло (червона лінія):
Про інші функції Iridium Toolkit можна почитати на їхньому github.
Підсумовуючи
Як можна бачити, процес приймання сигналів із супутників не такий вже й складний, і з погляду вивчення систем зв'язку, досить цікавий.
Для охочих вивчити Iridium детальніше, пара відео (англійською):