ACP/2 — Acoustic Command Protocol
LAB

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ń.

ACP/2AKUSTYCZNY PROTOKÓŁ POLECEŃ
TOR DŹWIĘKOWY
WEJŚCIEPRZETWARZANIEKONTROLANARZĘDZIEWYJŚCIERETRANSMISJA01POLECENIEz katalogu02SERIALIZACJA03HMACautentyczność04FEC RS(GF256)05MODULACJA 4-FSK06GŁOŚNIK →MIKROFONmedium: powietrze07GOERTZELbank filtrów08KOREKCJA +WYMAZANIA09ANTI-REPLAYokno 64 SEQ10WYKONANIE
4-FSK 1200–2400 Hz · REED-SOLOMON GF(256) · HMAC-SHA256 · KATALOG 10 POLECEŃ, ŻADNEGO DOWOLNEGO KODU
OPEN_URL_PRESET · PROFIL TURBO5.5 s · TONY ROZPOZNANE W 95% OKIEN
1200 Hz1600 Hz2000 Hz2400 Hz
0:000:05
PING · PROFIL STANDARD10.3 s · TONY ROZPOZNANE W 95% OKIEN
1200 Hz1600 Hz2000 Hz2400 Hz
0:000:10
VIBRATE · PROFIL ROBUST15.9 s · TONY ROZPOZNANE W 90% OKIEN
1200 Hz1600 Hz2000 Hz2400 Hz
0:000:15
01

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.

02

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ć.

03

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.

04

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.

05

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.

06

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

07

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.