Lokalna bramka do mostkowania ruchu pomiędzy:
SARTrackAPRSMeshtasticCoT / ATAKjako wyjściem rozwojowym
Projekt działa jako asynchroniczny router zdarzeń. Odbiera pozycje i wiadomości z kilku wejść, normalizuje je do wspólnego modelu, filtruje duplikaty i przekazuje dalej do aktywnych adapterów.
Najbardziej praktyczne ścieżki w obecnej wersji:
SARTrack -> lokalny serwer APRS-IS -> gateway -> MeshtasticSARTrack -> Dire Wolf / AGWPE -> gateway -> MeshtasticMeshtastic -> gateway -> APRS-IS / AGWPE server
Repozytorium zawiera działającą implementację:
- runtime
asyncioz centralnym routerem zdarzeń - wspólny model
PositionEventiMessageEvent - deduplikację zdarzeń i podstawową ochronę przed pętlami
- lokalny panel operatorski HTTP z podglądem stanu, zdarzeń, logów i testowym TX
- trwały zapis części zmian runtime z GUI z powrotem do
config.py - wejście APRS przez klienta
AGWPE - serwer
AGWPE, który potrafi przyjmować i nadawać ramki monitoroweTorazV - lokalny serwer
APRS-ISdla klientów SARTrack i innych klientów TCP - klient
SARTrack APRS, który łączy się do zewnętrznego serwera APRS-IS i publikuje odebrane ramki do routera - natywny serwer
SARTrack TCPdla prostych rekordów pozycji i wiadomości - adapter
Meshtastic TCPz reconnectem, backoffem, odbiorem tekstu i pozycji oraz mapowaniem callsign <-> node - stub adaptera
CoT
Główne katalogi:
core/- model zdarzeń
- router
- cache deduplikacji
- in-memory state store dla GUI i logów
aprs/- klient
AGWPE - serwer
AGWPE - lokalny serwer
APRS-IS - parser APRS
- generatory ramek APRS
- klient
sartrack/- serwer
SARTrack TCP - klient
SARTrack APRS - parser prostych rekordów SARTrack
- serwer
mesh/- adapter
Meshtastic TCP - parser pakietów Meshtastic
- adapter
cot/- adapter i generator XML CoT
gui/- panel operatorski oparty o
FastAPI
- panel operatorski oparty o
utils/- konfiguracja logowania
Punkty wejścia:
Gateway rozróżnia dwa typy pozycji:
stationobject
To rozróżnienie jest używane przy:
- generowaniu APRS TX
- prezentacji zdarzeń w GUI
- budowie waypointów Meshtastic
- kształtowaniu przyszłego wyjścia CoT
PositionEvent przechowuje między innymi:
idlat,lonentity_kindtactical_nameobject_nameowner_idsymbol_table,symbol_code
MessageEvent przechowuje między innymi:
idtargetmessagemessage_id
Adapter aprs.agwpe odbiera ruch APRS z serwera AGWPE i publikuje go do routera. Wspiera reconnect oraz defensywne odrzucanie niepoprawnych ramek.
Adapter aprs.agwpe_server działa jako serwer kompatybilny z klientami AGWPE:
- nasłuchuje na TCP
- przyjmuje komendy monitoringu
- odbiera ramki
MiV - dekoduje z nich APRS
- wysyła zrouterowane zdarzenia z powrotem do klientów jako
Ti/lubV
To pozwala podłączyć narzędzia oczekujące interfejsu AGWPE bez stawiania pełnego Dire Wolf po drugiej stronie.
Adapter aprs.is_server udostępnia prosty lokalny serwer APRS-IS:
- przyjmuje logowanie
user ... - odbiera ramki APRS od klientów TCP
- parsuje pozycje, obiekty i wiadomości
- rozsyła odebrane i wygenerowane ramki do innych podłączonych klientów
To jest obecnie najwygodniejsza ścieżka do testów z wieloma klientami SARTrack w LAN.
Adapter sartrack.aprs_server_client potrafi połączyć się do zewnętrznego serwera APRS-IS i przekazywać odebrane ramki APRS do wewnętrznego routera.
Adapter sartrack.tcp_server nasłuchuje prostych rekordów tekstowych SARTrack. Parser akceptuje kilka formatów:
POS|ID|LAT|LON|komentarzMSG|ID|TARGET|tresc- warianty rozdzielane przecinkami
- warianty rozdzielane spacjami
- warianty
key=value
Obsługiwane są rekordy pozycji i wiadomości.
Adapter mesh.adapter wspiera:
- połączenie TCP z radiem / daemonem Meshtastic
- cichy start połączenia i heartbeat-safe wrapper
- reconnect z konfigurowalnym backoffem
- odbiór tekstu i pozycji z Meshtastic
- wysyłkę wiadomości tekstowych
- wysyłkę pozycji jako:
- waypointy
- albo tekstowe payloady
APRS_POS|...
- mapowanie APRS callsignów do node ID na podstawie aliasów i informacji z sieci
- prostą ochronę przed echem mostka
Jeżeli wiadomość APRS ma target, adapter próbuje wysłać ją bezpośrednio do odpowiedniego node Meshtastic. Jeśli mapowanie nie istnieje, wiadomość jest odrzucana z ostrzeżeniem w logu.
Adapter cot.cot jest obecny jako rozszerzalny stub. Projekt generuje kanoniczne dane dla przyszłego eksportu CoT, ale nie jest to jeszcze pełna integracja z TAK Server.
W tej wersji parser APRS obsługuje:
- pozycje
!i= - obiekty
; - wiadomości
:
Rozpoznawane podtypy wiadomości:
private_messageackencrypted_messagegroup_messagebulletinpingquerystatus_response
Dodatkowo parser zachowuje:
symbol_tablesymbol_codeobject_timestamp_raw- znormalizowany
object_timestamp_utc - nazwę taktyczną z komentarza
[:nazwa owner_callsigniobject_namedla obiektów
Parser jest tolerancyjny:
- błędne ramki są odrzucane bez crasha procesu
- nieobsługiwane payloady są logowane ostrzeżeniem
- duplikaty są odfiltrowywane w routerze
GUI startuje jako lokalny serwer HTTP oparty o FastAPI i uvicorn.
Funkcje panelu:
- status komponentów
- liczniki zdarzeń i duplikatów
- lista ostatnich zdarzeń
- inspektor pełnego rekordu zdarzenia
- logi z filtrowaniem po poziomie i loggerze
- podgląd błędów
- runtime update konfiguracji wybranych adapterów
- ręczny reconnect adapterów
- testowe wysyłanie pozycji i wiadomości z GUI
- gotowe presety testowe
- podgląd aktywnych klientów lokalnego serwera APRS-IS
Najważniejsze endpointy:
GET /api/statusGET /api/events/recentGET /api/events/{event_id}GET /api/logsGET /api/errorsGET /api/adaptersPOST /api/adapters/{name}/configPOST /api/adapters/{name}/reconnectPOST /api/test/send-positionPOST /api/test/send-message
Domyślny adres GUI:
http://127.0.0.1:8080
Cała konfiguracja startowa jest trzymana w config.py.
Najważniejsze sekcje:
AGWPEAGWPE_SERVERAPRS_IS_SERVERKISSSARTRACK_TCPSARTRACK_APRSCOTGUILOGGINGDEMOMESH_ADAPTERSMESH_CALLSIGN_ALIASES
Wybrane zmiany wprowadzone z GUI są zapisywane z powrotem do config.py, więc przetrwają restart procesu.
Aktualne wartości domyślne z config.py:
AGWPE:127.0.0.1:8000, domyślnie wyłączonyAGWPE_SERVER:0.0.0.0:8002, domyślnie wyłączonyAPRS_IS_SERVER:0.0.0.0:10152, domyślnie włączonyKISS:127.0.0.1:8001SARTRACK_TCP:0.0.0.0:8005, domyślnie wyłączonySARTRACK_APRS:127.0.0.1:10152, domyślnie wyłączonyGUI:127.0.0.1:8080, domyślnie włączoneCOT: domyślnie wyłączonyMESH_ADAPTERS: jedna definicjamesh4405, domyślnie wyłączona, host192.168.0.117, port4405
Najprostszy tryb testowy:
SARTrack -> APRS-IS server -> gateway -> Meshtastic / AGWPE server / CoT
Polecany do:
- testów LAN
- pracy z wieloma klientami
- testowania obiektów APRS
- diagnozowania typów wiadomości
Klasyczny tryb APRS:
SARTrack -> KISS -> Dire Wolf -> AGWPE -> gateway
Polecany do:
- porównań z klasycznym APRS
- pracy z logami Dire Wolf
- testów kompatybilności z istniejącym stosem AGWPE
Możliwy jest też ruch z sieci Meshtastic do routera i dalej do aktywnych adapterów APRS:
Meshtastic -> gateway -> APRS-IS / AGWPE server
W tym trybie kluczowe jest poprawne mapowanie callsignów do node ID.
py -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python .\main.pypython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python main.pyPakiety z requirements.txt:
meshtasticfastapiuvicornpaho-mqttpytak
Zalecany Python:
3.11+
Logi są zapisywane do pliku i równolegle trafiają do StateStore, z którego korzysta GUI.
Przydatne miejsca:
logs/gateway.log- panel logów w GUI
Przykładowe logger names:
mainrouteragwpeagwpe.serveraprs.isaprs.parsersartrack.tcpsartrack.aprsmeshtastic.mesh4405cotgui
Repo zawiera testy parsera APRS w tests/test_aprs_parser.py.
Obecnie pokrywają między innymi:
- obiekty APRS z różnymi symbolami
- nazwy taktyczne
- timestampy obiektów
- wiadomości prywatne
ack- wiadomości szyfrowane SARTrack
- wiadomości grupowe
- bulletiny
PING?APRSS- odpowiedzi statusowe SARTrack
Uruchomienie:
python -m unittest tests.test_aprs_parserCoTnadal jest stubem, nie pełną integracją TAK- mapowanie APRS target -> Meshtastic node zależy od aliasów lub danych poznanych po połączeniu
KISSma konfigurację, ale nie jest osobnym aktywnym adapterem runtime wmain.py- nie wszystkie scenariusze interoperacyjności Meshtastic są jeszcze domknięte
- GUI jest narzędziem operatorskim i nadal ewoluuje
- main.py
- config.py
- core/model.py
- core/router.py
- core/state.py
- aprs/parser.py
- aprs/is_server.py
- aprs/agwpe_server.py
- mesh/adapter.py
- sartrack/parser.py
- gui/server.py
Repozytorium nie zawiera jeszcze pliku licencji.