
ACP/2 — Acoustic Command Protocol
Sterowanie telefonem z laptopa przez dźwięk: bez Wi-Fi, bez Bluetooth, bez NFC, bez kabla.
- PROJECT
- LAB-035
- MODULACJA
- 4-FSK 1200–2400 Hz
- FEC
- REED-SOLOMON GF(256)
- AUTENTYCZNOŚĆ
- HMAC-SHA256
- CZAS PING
- ~19 s (ACP/1: 46 s)
- STATUS
- UKOŃCZONY
- DATA
- 28 sierpnia 2026
Jedynym medium transmisji jest głośnik laptopa i mikrofon telefonu. To nie jest „sterowanie dźwiękiem” w postaci dowolnych instrukcji, tylko mały, jednoznacznie zdefiniowany protokół cyfrowy z korekcją błędów, uwierzytelnianiem i zamkniętym katalogiem poleceń.
PROBLEM
Każdy kanał łączności między laptopem a telefonem wymaga parowania, sieci albo fizycznego złącza. Pytanie brzmiało: czy da się przesłać uwierzytelnione, odporne na błędy polecenie, mając do dyspozycji wyłącznie głośnik i mikrofon — czyli medium, którego nikt nie konfiguruje.
POMYSŁ
Zbudować pełny stos protokolarny, a nie efektowną sztuczkę: warstwa fizyczna, korekcja błędów, uwierzytelnianie, ochrona przed powtórzeniem i wykonanie ograniczone do listy dozwolonych akcji.
Kluczowe ograniczenie bezpieczeństwa: zamknięty katalog dziesięciu poleceń, wyłącznie presety, żadnego dowolnego kodu. Kanał akustyczny jest z natury podsłuchiwalny i dostępny dla każdego w pomieszczeniu — protokół musi to zakładać.
PROJEKT
Modulacja 4-FSK na czterech tonach (1200, 1600, 2000, 2400 Hz), dwa bity na symbol. Detekcja bankiem filtrów Goertzela z odzyskiwaniem zegara symbolowego. Korekcja Reeda-Solomona w GF(256) z czterema bajtami parzystości, dekodowaniem z wymazaniami i łączeniem Chase. Uwierzytelnianie HMAC-SHA256, sześć bajtów dla poleceń i cztery dla odpowiedzi. Ochrona przed powtórzeniem: okno 64 numerów sekwencyjnych na sesję.
Wybór Goertzela zamiast pełnej transformaty Fouriera jest podyktowany kosztem: interesują nas cztery znane częstotliwości, a nie całe widmo. Bank czterech filtrów liczy się na telefonie w czasie rzeczywistym bez zauważalnego obciążenia.
Dekodowanie z wymazaniami ma konkretne uzasadnienie fizyczne. W pomieszczeniu z pogłosem część symboli nie tyle się przekłamuje, co znika — deklarowanie ich jako wymazań zamiast zgadywania podwaja skuteczną zdolność korekcyjną kodu.
REALIZACJA
Dwie implementacje: desktop w Pythonie z PySide6 (276 testów) i Android w Kotlinie z Compose (54 testy JVM, zbudowany APK). Zgodność między nimi potwierdzona wspólnymi wektorami testowymi i wspólnymi plikami WAV — dekoder Kotlina czyta materiał wygenerowany przez Pythona w trzech profilach warstwy fizycznej.
Transmisja działa w obie strony: telefon nadaje przez AudioTrack, laptop dekoduje.
Zgodność dwóch niezależnych implementacji tego samego protokołu okazała się najlepszym testem specyfikacji. Każda rozbieżność między Pythonem a Kotlinem wskazywała miejsce, w którym dokument protokołu był nieprecyzyjny — a nie miejsce, w którym któraś ze stron miała błąd.
EFEKT
Transakcja PING w profilu STANDARD trwa około 19 sekund — poprzednia wersja protokołu potrzebowała 46. Przetestowane end-to-end przez pełny tor akustyczny: PING, SHOW_MESSAGE, VIBRATE, OPEN_URL_PRESET, scalona odpowiedź oraz automaty stanów obu stron. FEC sprawdzony na siatce 2e+r≤4 z zanikami i zakłóceniami na torze audio.
GALERIA
03 ZDJĘĆACP/2 — aplikacja desktopowa, nadawanie polecenia · zrzut z projektu
ACP/2 — analiza toru akustycznego · zrzut z projektu
ACP/2 — status transakcji · zrzut z projektu
WNIOSKI
Najwięcej czasu zabrało nie samo modulowanie, tylko odzyskiwanie zegara symbolowego w pomieszczeniu z pogłosem. Dopiero po dołożeniu dekodowania z wymazaniami protokół przestał się wykładać przy odbiciach od ścian.


