Baza wiedzy
Architektura i technologia
Ten plik znajduje się w menu dokumentacji pod nazwą MQTT — treść poniżej jest zsynchronizowana z PDF: JULIA SYSTEM ARCHITECTURE (PL) oraz Julia AI v1.0. W obu dokumentach nie opisano MQTT jako magistrali komunikacji aplikacji Julia z Microsoft Flight Simulator 2024.
Spis treści
Komunikacja opisana literalnie w dokumentacji źródłowej:
| Funkcja | Mechanizm |
|---|---|
| Telemetria i stan statku | Python-SimConnect (most do MSFS) |
| Plan lotu | HTTP → SimBrief (XML/JSON, OFP) |
| METAR | HTTP → CheckWX |
| Generacja odpowiedzi | HTTPS → API Google Gemini |
| Backend komercyjny | Firebase, Stripe, webhooki (Make.com) |
| Wejście głosowe | PTT → plik audio → Whisper (lokalnie/API) |
Wniosek: wersja Julii opisana dla komisji jest aplikacją desktopową z dominującym HTTP/S i SDK SimConnect, a nie klientem MQTT.
Repozytorium Pilot Hangar może ewoluować w stronę fleet / telemetry z użyciem MQTT dla innych komponentów (edge, workerzy, mostek do Firestore). Taka architektura nie zastępuje opisu PDF Julii+MSFS — jest ortogonalna.
Jeśli w przyszłości pojawi się oficjalny rejestr tematów i kontrakty JSON dla JET/Hangar, należy je dodać tutaj jako osobną sekcję wersjonowaną.
Poniższe nie pochodzi z PDF Julii — to wzór dla ewentualnych komponentów IoT/symulatora rozproszonego:
jet/{tenant}/{siteId}/session/{hwid}/telemetry/gps
jet/{tenant}/{siteId}/session/{hwid}/cmd/desired
jet/{tenant}/{siteId}/session/{hwid}/cmd/ack
| Scenariusz | QoS | Uwagi |
|---|---|---|
| Heartbeat | 0 lub 1 | QoS 0 mniejszy narzut; 1 przy niestabilnej sieci |
| Telemetria stanowa | 1 | Konsument idempotentny po (hwid, timestamp) |
| Komendy krytyczne | 1 | Aplikacja musi tolerować duplikaty |
| Wysoki wolumen logów | 0 lub osobny system | Unikać zapychania brokera |
edge, worker, admin — zasada najmniejszych uprawnień.Jeśli worker subskrybuje MQTT i zapisuje do Firestore:
updatedAt, seq,clientId, hwid, traceId w payloadach krytycznych ścieżek.Poniższy blok to pełna warstwa operacyjna opisu MQTT w ekosystemie JULIA/JET (portal, workerzy, edge poza desktopową Julją+MSFS). Nie zastępuje tabeli „Co jest w PDF zamiast MQTT” — uzupełnia ją o parametry wdrożeniowe, gdy broker jest w użyciu.
Środowisko deweloperskie
eclipse-mosquitto:2.hangar-internal), bez ekspozycji publicznej.Środowisko produkcyjne
jet/{tenantId}/… albo julia/{region}/…). Utrzymaj jedną konwencję w całym projekcie.Zasada: nie mieszaj na jednym brokerze produkcji dev i prod bez silnej separacji ACL — preferowane osobne instancje lub rozłączne prefiksy root z osobnymi credentialami.
jet/{tenant}/{siteId}/session/{hwid}/telemetry/gps
jet/{tenant}/{siteId}/session/{hwid}/telemetry/imu
jet/{tenant}/{siteId}/session/{hwid}/status/heartbeat
jet/{tenant}/{siteId}/session/{hwid}/cmd/desired
jet/{tenant}/{siteId}/session/{hwid}/cmd/ack
julia/{region}/bus/health
julia/{region}/bus/diag/{serviceId}
Zasady: stałe segmenty (telemetry, status, cmd) utrudniają literówki i ułatwiają ACL typu jet/+/+/session/+/telemetry/#. Unikaj głębokich hierarchii bez potrzeby. Przy łamaniu kompatybilności payloadu rozważ nowy segment (telemetry/gps/v2).
| Scenariusz | QoS | Uzasadnienie |
|---|---|---|
| Heartbeat / keepalive | 0 lub 1 | QoS 0 redukuje narzut; QoS 1 przy niestabilnej sieci |
| Telemetria stanowa (GPS co N s) | 1 | Powtórzenia akceptowalne; konsument idempotentny po (hwid, timestamp) |
| Komendy krytyczne (np. STOP) | 1 | Gwarantuje próbę dostarczenia; aplikacja musi obsłużyć duplikaty |
| Logi diagnostyczne wolumenowe | 0 | Obciążenie brokera; ewentualnie osobny kanał (Kafka, pliki) |
Antywzorzec: QoS 2 dla setek wiadomości/s na jednym temacie — zwykle niepotrzebny koszt.
Retained: używaj oszczędnie (np. ostatni status/online per hwid z małym JSON). Nie ustawiaj retained na strumieniach wysokiej częstotliwości.
LWT: przy connect temat np. .../status/lwt z payloadem {"state":"offline","reason":"tcp_drop"}. Upewnij się co do keepalive i firewalla (ciche zerwanie bez LWT).
Telemetria GPS (przykład referencyjny)
{
"schema": "jet.telemetry.gps.v1",
"hwid": "string",
"ts": "2026-03-27T12:00:00.000Z",
"lat": 52.2297,
"lon": 21.0122,
"acc_m": 4.2,
"src": "gnss"
}
Komenda desired → ack
{ "cmdId": "uuid", "action": "sync_config", "params": { "profile": "night" } }
{ "cmdId": "uuid", "status": "applied", "detail": "ok" }
Zasady: zawsze schema lub pole wersji; timestampy UTC ISO 8601; nigdy sekretów w MQTT plaintext — tokeny krótkotrwałe przez HTTPS.
Not After.aclfile)user julia_edge
topic readwrite jet/acme/+/session/+/telemetry/#
topic readwrite jet/acme/+/session/+/status/#
topic read jet/acme/+/session/+/cmd/desired
topic write jet/acme/+/session/+/cmd/ack
user hangar_worker
topic read jet/acme/#
topic write julia/eu-west/bus/diag/#
Testuj ACL w CI (sub/pub z oczekiwanym Not authorized).
message_size_limit) — ochrona przed DoS.Wzorzec: MQTT może dostarczać dane częściej niż ekonomia Firestore pozwala. Subskrybent buforuje, zapisuje co interwał lub po progu przemieszczenia; payload może nosić seq.
# Pseudokod — weryfikacja przed produkcją
last = {}
INTERVAL = 5.0
async def on_gps(hwid: str, payload: dict) -> None:
now = time.monotonic()
prev = last.get(hwid)
if prev and (now - prev[0]) < INTERVAL:
last[hwid] = (now, payload)
return
last[hwid] = (now, payload)
await firestore_save(hwid, payload)
messages_dropped, brak heartbeat regionu, wzrost opóźnień (jeśli broker eksponuje latency).max_connections, monitoring nietypowych tematów.