Ocena Jammertest: opublikowany plan jako zaplanowany wzorzec
kshana jammertest import czyta katalog testów Jammertest i plan transmisji i zamienia sloty jednego obszaru testowego na [[events]] zaufania do odbiornika. kshana jammertest score przepuszcza log odbiornika przez monitory zaufania i ocenia go względem tego harmonogramu, test po teście. Każdy wynik ma status MODELLED: harmonogram mówi, kiedy test był zaplanowany, a nie kiedy nadajnik był włączony.
Oprogramowanie wyłącznie doradcze, nie jest to sprzęt nawigacyjny z zatwierdzeniem typu (IEC 61108, IEC 61162): za nawigację statku odpowiada nadal operator. Nic tutaj nie jest zatwierdzone przez Norweski Zarząd Dróg Publicznych, Nkom ani organizatorów wydarzenia; nie twierdzi się, że zawarto z nimi jakiekolwiek porozumienie.
Plan i katalog#
Źródło: repozytorium NPRA/jammertest-plan Norweskiego Zarządu Dróg Publicznych (https://github.com/NPRA/jammertest-plan), licencja MIT (prawa autorskie 2024 Norwegian Public Roads Administration; tekst licencji jest sprawdzany w xval/jammertest-plan/MANIFEST.tsv). Pliki są pobierane, nigdy nie dołączane do repozytorium:
xval/jammertest-plan/fetch.sh <dest-dir-outside-the-repo>
Pobiera katalogi i pliki planu 2025 z przypiętego commita 75c0b2ceea10e470c3799d14a8ef18842d8375a7 i odrzuca każdy plik, którego SHA-256 różni się od xval/jammertest-plan/MANIFEST.tsv.
Test w katalogu ma identyfikator z kropkami, type.group.test (na przykład 1.2.5: typ 1 zagłuszanie, grupa 2, test 5). Plan wymienia dla każdego obszaru testowego i slotu czasowego, który identyfikator jest zaplanowany. Typy 1 (zagłuszanie), 2 (spoofing) i 3 (meaconing) nadają; typ 0 (odprawy, okres karencji, sloty rezerwacji i doraźne) nie nadaje i jest pomijany. Czasy w planie są lokalnym czasem ściennym; --local-offset-h (domyślnie 2, CEST) mówi, jak daleko są od UTC. Pliki planu zawierają pole kontaktu testowego z imieniem i nazwiskiem osoby: nigdy nie jest odczytywane i nic z niego pochodnego nie jest zapisywane.
Import#
kshana jammertest import --catalog testcatalog2025.json \
--plan plan-tuesday-2025-09-16.json --plan plan-wednesday-2025-09-17.json \
--location 1 --log receiver.ubx --format ubx --out events.toml
--log-start <UTC time> zastępuje --log/--format, gdy log nie podaje swojego początku. Wynikiem jest TOML [[events]] do dołączenia do scenariusza zaufania do odbiornika; każda etykieta zaczyna się od scheduled truth: i zawiera rok edycji, identyfikator katalogowy i obszar, a nagłówek zapisuje SHA-256 każdego pliku źródłowego. --attack-log <scenario.json> czyta natomiast wzorzec zdarzeń jednego folderu zbioru danych JammerTest 2024 (jego attack_log, znaczniki przesunięte o --time-shift-h, domyślnie -2: podają Z, ale są czasem lokalnym).
Ocena#
kshana jammertest score session.toml --catalog testcatalog2025.json --plan plan-....json \
--location 1 [--json] [--key signer.key --out pack/]
session.toml to scenariusz zaufania do odbiornika ([log] format/path, opcjonalnie [monitors], [compare]). Jego własne [[events]] są zastępowane zaimportowanym harmonogramem. Dla każdego zaplanowanego testu:
| pole | znaczenie |
|---|---|
outcome |
detected (alarm w ciągu compare.detect_tol_s, domyślnie 10 s, od planowanego początku), late (później, wewnątrz slotu), missed (brak), not-evaluable |
latency_s |
pierwszy alarm minus planowany początek |
time_to_recover_s |
od końca slotu do początku pierwszego odcinka co najmniej --recover-hold-s (10 s) bez alarmu, przed następnym testem |
Test podlega ocenie tylko wtedy, gdy zaczyna się co najmniej calibration_s + guard_s po rozpoczęciu logu; log z wcześniejszym testem jest oznaczany baseline_contaminated (punkt odniesienia mógł powstać w warunkach zakłóceń). Fałszywe alarmy to alarmujące epoki po kalibracji poza każdym slotem rozszerzonym o --guard-s (60 s) przed i po (lub po punkcie powrotu do normy), liczone jako epoki i jako przebiegi, z przebiegami na godzinę czystego czasu. Z --key i --out przebieg jest zapisywany jako podpisany pakiet dowodowy (docs/EVIDENCE-PACKS.md): karta wyników i zaimportowany harmonogram znajdują się wewnątrz config.json, a więc wewnątrz łańcucha skrótów i podpisu. Pakiet jest rekordem technicznym, a nie opinią prawną.
Czego wynik nie mówi#
- Zaplanowany slot nie jest zapisem emisji w eterze. Nadajnik mógł wystartować późno, zatrzymać się wcześniej albo nigdy nie działać; test „missed” może być testem, który nie nadawał, a opóźnienie liczy się od planowanego początku.
- „Czysta” epoka to „poza zaplanowanymi slotami”, a nie „udowodniona wolna od zakłóceń”.
- Detekcja przez monitory w dziedzinie pomiarów nic nie mówi o wykrywaniu spoofera o małej mocy i koherentnego.
- Żadna zewnętrzna wyrocznia nie podaje prawdziwych czasów emisji w eterze, więc nic tutaj nie ma statusu VALIDATED.
Przebieg na zbiorze danych 2024 (zarejestrowany z góry)#
xval/jammertest-score/PREREGISTRATION.md ustaliło populację, definicje i progi przed pierwszym przebiegiem ocenianym; xval/jammertest-score/RESULTS.md zapisuje ten przebieg. Wynik: zarejestrowana reguła minimalnej ilości danych nie została spełniona (4 okna zagłuszania podlegające ocenie z 4 z 12 folderów .ubx: 5 folderów odrzucono regułą punktu odniesienia, a 3 logi UBX podają swój początek tylko jako tydzień i sekundę tygodnia czasu GPS), więc żaden próg nie podlega ocenie. Niczego nie poluzowano ani nie powtórzono. v2 (PREREGISTRATION-v2.md, zatwierdzone samodzielnie przed swoim przebiegiem; tylko obsługa danych, te same progi i reguła minimalnej ilości danych) umieściło logi tylko z czasem GPS na podstawie daty folderu, oceniło 12 folderów tylko z CSV i użyło sesji platformy ruchomej dla ruchomych łazików. Wynik (RESULTS-v2.md): zachowano 14 z 24 folderów, ale tylko 7 okien zagłuszania podlegających ocenie, więc reguła minimalnej ilości danych znów nie została spełniona i żaden próg nie podlega ocenie. Wynik v1 jest niezmieniony. Tylko opisowo: 3 z 7 okien zagłuszania wywołało alarm w ciągu 10 s, 4 później, żadne niewykryte; mediana opóźnienia 18 s; odsetek fałszywych alarmów w czystym czasie 0,089. Ograniczeniem wiążącym jest teraz reguła punktu odniesienia, która usuwa 10 folderów; kolejna rejestracja wymagałaby innej reguły dla wczesnych okien. Zbiór danych (JammerTest 2024, Zenodo 15911589, GPL-3.0-or-later) jest pobierany przez xval/oracles/setup.sh i nigdy nie jest dołączany do repozytorium; test tests/jammertest_score_2024.rs przypina zarejestrowany przebieg, gdy KSHANA_JAMMERTEST_DIR wskazuje rozpakowany zbiór danych.
Zbiór danych NMEA SimulaMet 2025#
Zbiór danych SimulaMet Jammertest 2025 wyprowadzony z NMEA (IEEE DataPort, DOI 10.21227/a7v4-xw11) nie jest adaptowany w 0,38. Jego strona nie podaje licencji i mówi: „Dostęp do tego zbioru danych wymaga subskrypcji IEEE DataPort”: warunki nie zezwalają jasno na redystrybucję ani automatyczne pobieranie, więc nie napisano adaptera ani skryptu pobierającego. Użycie go wymaga decyzji właściciela i, najlepiej, pisemnej zgody autorów.
Powierzchnie#
CLI, Rust (kshana::jammertest), Python (jammertest_import, jammertest_score), WebAssembly (te same nazwy), narzędzia MCP o tych samych nazwach oraz polecenie /kshana-jammertest i umiejętność jammertest. Podpisany pakiet jest dostępny tylko z wiersza poleceń (wymaga klucza podpisu). Zob. docs/SURFACES.md.