Zpátky do budoucnosti s modemem v Androidu

napsal Jan BartovskýStoryous
JavaScript, Android SDK, HTML
4. 3. 2018

Začalo to, když jsme v naší Androidí POS1) aplikaci hledali možnost, jak zobrazit informaci zákazníkovi - druhý displej, na kterém můžete vidět třeba cenu k zaplacení i když má obsluha v restauraci při placení appku za barem.

Tablet, který používáme pro velkou instalaci s těžkým stojánkem, má HDMI výstup a první co nás napadlo byl samozřejmě samostatný displej. Nejlevnější 10” LCD za zhruba $50 bez cla a DPH? Po chvíli hledání padl nápad, že možná bude levnější použít jako displej další tablet.

  • Na začátku jsme si na tohle řešení dali pár požadavků:
  • Musí zůstat volné USB na nabíjení.
  • Bylo by fajn, kdyby řešení fungovalo i bez přístupu k internetu.
  • Musí se to dát snadno používat - ideálně bez konfigurace a musí to zvládnout zapojit i vaše babička.

Za nějakou chvíli jsme měli hotový seznam použitelných technologií a nevýhod:

  • USB a virtuální COM port
    Není volné USB na nabíjení.
  • Wi-Fi
    Není moc použitelné offline. I u P2P řešení musíme počítat s tím, že nefunguje lokální síť.
  • Wi-Fi Direct
    Zařízení musí mít dva čipy, aby mohlo komunikovat přes Wi-Fi Direct i klasickou Wi-Fi.
  • Bluetooth
    Složitější konfigurace.

Když jsem se podíval na tyhle dva seznamy … nebyl jsem si jistý, že to vyjde. Pak mně napadlo, že jednou na obědě mezi prací někdo mluvil o bakalářce2), kterou napsal náš kamarád David Ovčačík a která řešila komunikaci mezi Androidem a zařízením se sériovým portem (RS-232) po audio kabelu. Zavanula na mne nostalgie devadesátek, pískání faxů, modemů a vzpomínky na osmdesátky a pět minut chrčení z magneťáku před tím, než si člověk zahrál JetPac, ale chtěl jsem to zkusit a všichni dali palec nahoru.

Když má propojení fungovat v kavárně. v hospodě nebo v naší kanceláři, nebude to fungovat jen zvukem bez kabelu. Co budu potřebovat? Na obou koncích čtyřpólový jack jako na handsfree, výstup sluchátek z jednoho tabletu půjde na piny mikrofonního vstupu druhého tabletu. V tu chvíli jsem neměl v ruce ani Davidovu bakalářku a ani Android Device Specification3), ale předpokládal jsem, že z výstupu na sluchátka jde line out a na mikrofonní úroveň bude potřeba zeslabit. Abych se nějak pohnul z místa, rozhodnul jsem se udělat prototyp. O mých zkušenostech s elektrotechnikou: Když jsem doteď něco pájel, byly to jen věci, co jsem potřeboval opravit a vždycky to bylo jen půjčenou páječkou. Chvíli jsem googlil, jak signál zeslabit a jako nejrozumnější mi přišlo následující schéma4):

Zpátky s obchodu jsem přišel s nákupem: kabel, čtyři jacky, odpory, kondenzátory, druhá nejlevnější páječka, cín a kalafuna. Časem jsem ještě zjistil, že se na poniklované konektory hodí i pájecí tekutina na nikl. Když se mi první kabel po několika oživovacích pokusech povedlo zapojit, zjistil jsem, že mám štěstí, i když jsem v tu chvíli ještě nevěděl proč. Při zasunutí konektoru se ve status baru tabletu objevila ikonka sluchátek s mikrofonem. Až později jsem zjistil, že je to hlavně díky zatížení tím odporem a třeba na zasunutí samotného konektoru systém nijak nezareaguje.

Oživování a hledání studených spojů chvíli trvalo a hodil se při něm osciloskop5), který poslouchá na audio vstupu a zobrazuje průběh signálu. Na začátku stačí pustit jako zdroj cokoliv z YouTube a když  je na obrazovkách obou tabletů jasně vidět signál, dá se vyzkoušet komunikace přes nějakou hotovou appku. Zkusil jsem postupně s různým úspěchem asi tři nebo čtyři. S tou poslední6), která konečně komunikovala spolehlivě, jsem si ověřil, že to celé může fungovat.

I když jsou zdrojáky na githubu, tak se pro naše potřeby nedaly moc dobře využít. Byl jsem ale rád, že jsem si zkusil, jak audio modem funguje, jak ho ovlivňuje nastavení parametrů jako třeba používaná frekvence a hlavní lekce byla: nahrávání mikrofonního vstupu v Androidu většinou nevrací signál v původní podobě, která se pošle na vstup a záleží na výrobci tabletu, co se zvukem udělá než se dostane jako data do funkcí třídy AudioRecord (gain control, odstranění šumu, ...).

Další hledání z hlubin internetu konečně vydalo projekt Quiet7). Původně vzniknul jako céčková knihovna, časem se objevil quiet-js pro JavaScript, QuietModemKit pro iOS a taky Quiet for Android. Zatím je to asi nejdotaženější knihovna, která existuje. Kromě možnosti nadefinování několika profilů včetně téměř neslyšitelných frekvencí má přes audio modem naimplementovaný i UDP/TCP protokol.

Ještě se mi nepovedlo, aby přenos fungoval s rychlejším profilem než audible-7k, ale jestli 7 kbps je 870 bytů za sekundu a v nejjednodušším případě potřebujeme přenášet jen cenu zaplacenou na pokladně, tak proč ne. S tím se vlastně dá poslat i hodně jednoduchá HTML stránka, která vyřeší i formátování a nebude tak záviset na zobrazovací aplikaci v zákaznickém displeji.

 

Pokud vás zajímá, jak se převádí digitální data na zvuk a naopak, googlete FSK (klíčování frekvenčním posuvem). To je jeden ze způsobů, jak nuly a jedničky převést na signál pomocí změn frekvence. Je to asi nejpoužívanější způsob, ale data se dají zakódovat i do změn amplitudy (ASK), posunu fáze vln (PSK) a podobně. Při dekódování se FSK signál demoduluje - pomocí Fourierovy transformace zjistíme frekvence a jejich změny převedeme zpátky na jedničky a nuly. Víc bych do toho nezabrušoval, abyste měli sílu přečíst si ještě poslední odstavec.

Na tomhle místě článek končí. Moje poučení z něj je, že přenos digitálních dat zvukem ještě neumřel. Aspoň ne dokud máme handsfree konektor. Do něj se aktuálně dá zapojit třeba čtečka karet8), teploměr9), hardwarové tlačítko10), modelářská vysílačka11), detektor radiace12) nebo BTC peněženka13). Zajímavě vypadá třeba i projekt Chirp14).

Naše řešení je hotové jako prototyp a může se pracovat na designu stojánku, ověřit, jak složité bude vyrobit kabel a těšit se, že to jednou někdo bude používat. Já osobně jsem si z toho odnesl vlastní páječku včetně tréninku v práci s ní a fajn pocit vždycky, když to začalo fungovat.

  1. Point Of Sales - pokladní systém
  2. Návrh a implementace modemového kabelu Jack/RS-232, David Ovčačík, 2016
  3. 3.5 mm Headset Jack: Device Specification [https://source.android.com/devices/accessories/headset/jack-headset-spec]
  4. https://www.youtube.com/watch?v=aovtGu_pG4w
  5. https://play.google.com/store/apps/details?id=com.lab_nation.smartscope
  6. https://github.com/romanz/audiomodem-android
  7. https://quiet.github.io/
  8. https://squareup.com/
  9. https://thermodo.com/
  10. https://www.youtube.com/watch?v=GrxAfqK2q7Q
  11. https://www.kickstarter.com/projects/ari-krupnik/iphly-radio-control-with-iphone
  12. https://www.kickstarter.com/projects/1517658569/smart-radiation-detector
  13. https://bitcointalk.org/index.php?topic=135423.0
  14. https://www.chirp.io/
  15. https://software.intel.com/en-us/android/articles/using-the-audio-jack-as-data-interface-on-android-systems