У цій статті розповім про APRS мережі та написання власного додатку для збирання інформації про стан станцій в таких мережах.
Розпочну, певне, з пояснення що таке APRS.
APRS (Automatic Packet Reporting System) – радіоаматорська система обміну цифровими пакетами для поширення коротких повідомлень. Уявіть, що у вас працює система, яка складається із десятка пристроїв на акумуляторах, які реєструють погодні умови у певному віддаленому місці. Звичайно, використовуючи мережі мобільного зв’язку, чи навіть Wi-FI можна передавати всю інформацію до місця її обробки. Проте такий метод буде вимагати оплату за трафік для кожної окремої станції та залежність від інфраструктури провайдера, якому зачасту невигідно надавати послуги там, де можлива низька рентабельність від його діяльності. Тут на допомогу приходить APRS. Коротке текстове повідомлення модулюється AFSK за протоколом AX.25 на спецільному пристрої – TNC (terminal node controller). Сформований звуковий сигнал передається на будь-який FM передавач і, як наслідок, виходить в ефір. У цей час інші станції приймають радіосигнал, демодульовують і розшифровують передане коротке повідомлення. Все – у вас сформована проста мережа обміну повідомленнями. До слова, роль TNC може виконувати будь-який комп’ютер із звуковою карткою або навіть мікроконтролер Atmega328p (той, що у Arduino Uno) з кількома резисторами та конденсаторами. Дешево і сердито. При цьому передані короткі повідомлення можуть містити як простий текст, так і телеметрію, погодні умови, заряд акумулятора, координати або будь-що інше, що поміщається у довжину пакету.
Діджіпітери
Оце вище описано найпростіше використання APRS. У тому випадку усі станції повинні бути у межах доступності інших. Коли ж дальність зв’язку недостатня, то використовують діджіпітери – “digital repeaters”. Діджіпітери зазвичай розміщують на підвищеннях із максимально можливою дальністю роботи. Це дозволяє отримувати сигнал із станцій, розміщених у місцях з поганим проходженям радіохвиль, і “повторювати” його на більшу відстань.
Протокол APRS передбачає, що у структурі повідомлення буде вказаний шлях, куди або кому повинно бути надіслане повідомлення. За потреби передавання сигналу діджіпітерами, вказують їхні кличні знаки або загальні псевдоніми. Останні широко поширені у класичному використанні. Зокрема існує псевдонім WIDEn–N: n – це кількість необхідних повторів пакету діджіпітером, а N – залишок повторів даного пакету. До прикладу, WIDE2-2 – така команда означає, що пакет повинен бути переданий 2 рази і “залишок” передавань в цей момент 2. Всі діджіпітери, які отримали пакет з таким псевдонімом повинні передати його далі вже з командою WIDE2-1, а ті, що отримали той ретрансльований пакет – повинні передати його ще раз з командою WIDE2* (-0 не вказується). Всі діджіпітери, який прийняли останній пакет “розуміють”, що далі нічого передавати не потрібно. Отак із системою кількох діджіпітерів можна передати пакет на значні відстані, особливо у районах поганого проходження радіохвиль.
IGate
Діджіпітери це метод збільшення дальності зв’язку по радіоканалу. А якщо пакет діджіпітерами передавати із віддалених місць до місць з хорошим інтернет-з’єднанням і далі передавати в мережу для аналізу вже силами серверів, підключених до інтернету? Саме так працює IGate – Internet Gate. Така радіостанція усі прийняті пакети (за винятком тих, які мають команду NOGATE) передає в Інтернет. Сервіс, який приймає ці пакети називається APRS-IS – APRS-Internet Service. Переданий в APRS-IS пакет передається на всі сервери мережі APRS-IS і далі його можна опрацювати далеко за межами покриття радіостанції, діджіпітерів і самих IGate.
З використанням IGate також можна сформувати зв’язок “Радіостанція <-> Діджіпітер <-> IGate <-> APRS-IS <-> IGate <-> Діджіпітер <-> Радіостанція” дальністю на тисячі кілометрів. Отака схема і формує мережу APRS – глобальну мережу об’єднаних за допомогою Інтернету локальних радіомереж.
За підтримання інфраструктури спільнотою, маємо глобальну систему, яка потребує мінімальних вкладень і забезпечує альтернативний цифровий зв’язок. Який, до слова, може виручити за надзвичайних ситуацій, коли пошкоджена інфраструктура стільникового чи провідного зв’язку.
Чим така штука ще зручна?
А тим, що з використанням автоматичних сервісів, які публікують дані з пакетів на картах, можна спостерігати активність інших радіоаматорів, “розказувати” про свою активність, показувати себе при подорожах, поширювати інформацію про локальні радіогуртки, локальні репітери і та інше обладнання. А ще можна відправляти короткі повідомлення, листуватись чи розказувати про частоту, на якій ви зараз прослуховуєте ефір.
До слова, радіоаматорські повітряні кулі найчастіше обладнані саме APRS трансівером, а тому їх можна відслідковувати у реальному часі під час прольоту над активними IGate. І це без потреби видумувати щось особливе для використання стільникового зв’язку на великих висотах. На мою думку, це просто неймовірний проект планетарних масштабів. Більше того, активний діджіпітер APRS є на Міжнародній космічній станції, що збільшує цей проект навіть до космічних масштабів!
Але, як вже написав вище, підтримкою радіоаматорської APRS мережі займаються самі радіоаматори. І хоча апаратура для IGate може бути найпростішою – старенький вживаний трансівер, звукова картка та одноплатний комп’ютер – це все потребує контролю самими радіоаматорами.
Приклад пакету APRS
UR4WWR-2>APDW16,SR8VPW*,WIDE2-1,qAR,SP8EET-4:!4949.55NS02404.69E#PHG1220I-Gate/BCN/DGPTR 144.800MHz
На цьому прикладі можна розібрати структуру пакету:
- Пакет відправила станція із кличним знаком
UR4WWR-2
APDxxx
значить що це Linux aprsd server версії 16- Шлях
SR8VPW*,WIDE2-1,qAR,SP8EET-4
, зокрема діджіпітерSR8VPW
передав пакет далі (значок*
), застосувався псевдонімWIDE2-2
(1 віднялась);qAR
– пакет був отриманий IGate, кличний IGate –SP8EET-4
- Деталі про розміщення станції, зокрема координати –
4949.55NS02404.69E#PHG1220
, а також коментар –I-Gate/BCN/DGPTR 144.800MHz
Власна програма для моніторингу цікавих APRS-станцій
У одному із радіоаматорських чатів, присвячених APRS та пакетному радіозв’язку України, Володимир UR3QJW поширив посилання на статтю радіоаматора IZ7BOJ про веб-додаток, який моніторить стан діджіпітерів та IGate. IZ7BOJ встановив автономний діджіпітер на сонячних панелях і для контролю за його станом (та інших діджіпітерів) написав простенький веб-додаток, який збирає дані із сервісу aprs.fi про цікаві йому діджіпітери та формує таблицю. Тоді ж UR3QJW висунув ідею, що добре було б мати таблицю із станом IGate та діджіпітерів на території України.
Мене така ідея зацікавила. І не тільки тому, що найцікавіше для мене як програміста це розробка різних API та автоматизація процесів на підприємствах (і тому процес аля збирання стану APRS станцій це те, з чим я постійно маю справу), а ще через можливість краще ознайомитись із тим, як працює APRS. Тож вирішив написати свій аналог додатку від IZ7BOJ.
Версія #1 – Дані із aprs.fi
Перша ідея була використати джерелом інформації aprs.fi, аналогічно тому, як це зробив IZ7BOJ. Тоді додаток розділив на дві складові – код, який збирав дані з aprs.fi і кешував у базі даних MySQL та плагін для WordPress, який за коротким кодом створював таблицю із даними. Зв’язок між першою і другою складовою виконав простеньким API, а для контролю списку кличних, цікавих для моніторингу, написав простенький користувацький інтерфейс на Bootstrap.
Та зразу же помітив проблему – дані на aprs.fi не завжди відповідали реальним і мали затримку, суто через те, як той сервіс працює із APRS-IS. Ну що ж, взявся сам розбиратись як працює APRS-IS і як з ним працювати.
Версія #2 – Власний сервіс для обробки “сирого” потоку пакетів
Все виявилось простіше, ніж я думав. Із сервером достатньо з’єднатись будь-яким telnet-клієнтом, ввести команди і почати отримувати пакети APRS у вигляді потоку. Це все, ніяких реєстрацій, ніяких смс. Більше того, існує Python-бібліотека aprslib, яка вже вміє декодовувати пакети. Простенький працюючий приклад потребує всього декілька рядків коду!
Отож, переробив перший пробний проект у три-компонентну систему:
- Бекенд на Python, який збирає дані із APRS мережі та зберігає їх у базі даних
- Фронтенд у вигляді API та UI, написаних на PHP та JavaScript
- Плагін для WordPress, для показу даних із API
Перша компонента в основному працює завдяки aprslib.
Написаний клієнт під’єднується до APRS-IS сервера із використанням користувацького фільтру. Власне, сервери APRS-IS мають набір фільтрів, які дозволяють обмежити потік пакетів. Таким чином зробив фільтр за радіусом так, щоб отримувати пакети із координатами лише у межах України. Іншою частиною фільтру було відхилення пакетів від станцій, префікс кличного знаку яких не належить до префіксів українських кличних знаків. Отож, програма моніторить лише українські станції на території України. Навантаження на мій сервер виходить мінімальним.
-p/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/V/W/X/Y/Z/UA/UB/UC/UD/UE/UF/UG/UH/UI/UJ/UK/UL/UM/UN/UO/UP/UQ r/49.7/25.35/284 r/49.44/31.5/368 r/48.81/37.79/202 r/47/32.46/388
Збереження даних відбувається у різних таблицях бази даних, зокрема зберігається остання телеметрія станції, остання її позиція, останній переданий інший об’єкт, останній статус, остання маршрутизація (тобто робота у режимі IGate) та останні дані про погоду (WX). Активність станції визначається за тим, чи була будь-яка з вище перерахованих активностей нещодавно здійснена.
Окремо визначається активність діджіпітерів. Оскільки звичайні діджіпітери не передають інформацію в APRS-IS, для всіх пакетів з України перевіряється шлях в тому пакеті. Якщо у шляху наявний кличний знак цікавого нам діджіпітера – то вважаємо, що зафіксували його активність.
Друга компонента складається з користувацького інтерфейсу, який дозволяє додавати кличні знаки та об’єднувати їх у групи.
Окремо наявний розділ, де зберігаються “пропозиції” із активних станцій, активність яких виглядає як активність IGate, тобто в шляху є q-конструкт qAR. Також у цій компоненті реалізований API з доступом до даних з використанням секретного ключа.
Третя компонента – плагін для WordPress.
Плагін має сторінку конфігурації, де потрібно ввести адресу до другої компоненти, а також секретний ключ. Після налаштування можна використати короткі коди для додавання таблиці або карти у будь-якому місці на сайті. Короткий код – це така команда для сайту, якою вставляється у місці його розміщення щось інше, згенероване плагіном. Також ці короткі коди мають атрибути, якими можна задавати певні параметри, необхідні для генерації потрібного контенту. Зокрема таким атрибутом зробив перелік груп для відображення – тобто можна мати карту або таблицю тільки з певними станціями.
Отак у цьому блозі тепер наявна сторінка із станом українських IGate/діджіпітерів, а також віджет із моєю активністю у мережі APRS. У майбутньому хочу ще зробити систему, яка буде відслідковувати радіоаматорські повітряні кулі і сповіщати про кулю, коли вона прямує до моєї локації. Повинно бути не складно і цікаво.
Весь код доступний на GitHub і може бути вільно використаний або модифікований.
Congratulations for the nice work.
I like to see that my idea is the base for other developments!
Is your project available on github or other public repositories?
Best 73’s
Alfredo IZ7BOJ
Thanks!
Yes, it’s available on GitHub in three parts:
https://github.com/mkbodanu4/aprs-stations-status-monitor-backend – collects data directly from APRS-IS
https://github.com/mkbodanu4/aprs-stations-status-monitor-frontend – allows to manage Call Signs and provides API functionality
https://github.com/mkbodanu4/aprs-stations-status-plugin – displays data using the API above
A bit more complicated than your project, but allows you to get data directly from APRS-IS rather than aprs.fi.
73!
Bohdan UR5WKM