Uruchomienie reklamowej tablicy LED, część II

„Kablem! Ja po prostu wpisywałem tekst i przez kabel byłem połączony” – taką informację usłyszałem od pracownika który z tym chińskim cudem techniki miał doświadczenie. A więc wybrałem się do najbliższego sklepu i kupiłem jedyny dostępny tam kabel, za pomocą którego mogłem nawiązać łączność z tablicą – USB C ↔ USB A. Takimi kablami zwykle podłącza się nowe telefony, ale w swoim laptopie posiadam zarówno złącze USB C jak i popularne A.

Znalezione obrazy dla zapytania usb connector types
Krótka ściąga z wtyczek USB

UWAGA! To, że urządzenie ma port USB nie oznacza że można je bezpiecznie podłączyć do innego sprzętu z portem USB – a szczególnie kiedy jest to wynalazek w oczywisty sposób łamiący standardy USB (kable A ↔ A są z nim niezgodne). Można spalić swój komputer, urządzenie docelowe, albo obydwa na raz. Tak, widziałem takie przypadki i to nawet całkiem niedawno. 

Sam fakt tego, że tablica jest raz hostem USB a raz ma być urządzeniem peryferyjnym i to wszystko na USB 2.0 które oficjalnie nie pozwala na takie harce brzmi bardzo dziwnie. Mimo wszystko zdecydowałem się zaryzykować i świeżo kupionym kablem podłączyłem laptopa do tablicy. Dymu ani płomieni nie było, obydwa urządzenia wciąż działały i nawet odbyła się między nimi jakaś próba komunikacji – ale nie ma co mówić o sukcesie.

Kabel był akurat w porządku

Jeszcze jeden telefon do eksperta i udało mi się zarezerwować wizytę w magazynie w którym spoczywał zarówno komputer używany do sterowania tablicą jak i kabel z którego pomocą przesyłano do niej dane. Pożyczyłem obydwa (jak się okazało, na komputerze był Windows Vista a nie ME) i przyszedł czas na kolejny eksperyment.

Jak się okazało, pożyczony zestaw faktycznie działał i kluczowy był tutaj kabel. Kiedy użyłem go ze swoim laptopem, w dzienniku zobaczyłem wykrycie nowego urządzenia.

Coś tu dalej nie gra

W systemie nie pojawił się jednak żaden nowy port szeregowy. Jak w końcu XYLED przesyła te dane, skoro w każdym oknie tego programu jest coś o portach szeregowych? To nie jest wina systemu, Windows tak jak Linux wykrywa tablicę jako urządzenie HID (takmi są m.in. mysz czy klawiatura). O co tutaj chodzi?

Po skonfigurowaniu odpowiednich uprawnień wine również obsługuje HID i faktycznie, XYLED steruje tablicą bezproblemowo. Problem mam natomiast ja, bo czas goni a ja w życiu swoim nigdy nie programowałem interfejsu USB. Jedną z niewielu rzeczy którą na ten temat wiem, to to że Wireshark kilka lat temu dostał funkcjonalność podsłuchiwania ruchu USB. 

Nie wygląda to najgorzej

Zrzut komunikacji nie wyglądał na przytłaczający – jedyne wiadomości to URB_INTERRUPT, zwykle wychodzące z komputera i co jakiś czas przychodzące z tablicy. W każdej takiej wiadomości zawsze równo 8 bajtów. Łącznie 246 wiadomości – to daje całkiem „ogarnialną” liczbę danych.

Skoro mamy już taki zrzut, pierwszy krok to napisanie programu który podszyje się pod XYLED i odtworzy poprawnie komunikację z tablicą, dając ten sam efekt co oryginał. Aby się do tego zabrać, trzeba ze zrzutu wyłuskać same tylko dane, bez nagłówków USB. Żeby zrobić to szybko, zdecydowałem się skorzystać ze swojej ulubionej metody prototypowania – programu ipython, bardzo interaktywnej nakładki na interpreter Pythona, która błyskawicznie pozwoliła mi stworzyć skrypt który wyłuska odpowiednie bajty z użyciem biblioteki scapy.

Raz dwa i gotowe

Podsłuchałem komunikację z kilkoma bardzo prostymi przykładami – literami A, B, C, kropką i przecinkiem. Mając zrzuty komunikacji przefiltrowane przez powyższy program, można spróbować gołym okiem stwierdzić co mniej więcej wysyłane jest do tablicy.

Na przykładach kropki (składa się tylko z jednego piksela) i B widać że początek komunikacji jest taki sam i że zgodnie ze zdrowym rozsądkiem dane przesyłane są jako bitmapa. W analizie można pójść o krok dalej i zaprzęgając do współpracy narzędzie xxd przekonwertować pliki binarne na tekstowe, które będzie można łatwo porównać.

Kropka kontra przecinek

Kropka i przecinek różnią się dokładnie jednym bajtem, a więc wiadomo że w protokole nie ma sum kontrolnych, długość komunikacji jest stała (przynajmniej dla krótkich tekstów) i początek komunikacji jest zawsze taki sam. Nic tylko ją odtwarzać! Ale jak?

Na szybko znaleziona biblioteka hidapi zdaje się dawać wszystko czego potrzeba. Potrafi wyliczać urządzenia i łączyć się z nimi za pomocą identyfikatora producenta i urządzenia (zresztą to może być powód dla którego Chińczycy zdecydowali się wybrać HID – nie ma problemu z szukaniem portu, który nęka urządzenia korzystające z portów szeregowych). Biblioteka pozwala też na zapis i odczyt z urządzeń.

Po kilku minutach miałem gotowy program, który w paczkach po 8 bajtów wysyłał dane do tablicy. Z wielkimi nadziejami uruchomiłem go i… cała tablica zgasła a po chwili program zawisł. Nie zamykając go, zacząłem szukać błędu. I wtedy, po kilku minutach kątem oka zobaczyłem krwistoczerwoną łunę.

A

Podsłuch komunikacji nie wykazał różnic w danych wysyłanych, ale wciąż pozostawała jedna ważna różnica – nie próbowałem niczego z tablicy czytać. Policzyłem wiadomości i na sztywno zaszyłem w programie odczyt danych w tych samych momentach co XYLED. 

Okazało się to kluczem do sukcesu – program przesłał dane błyskawicznie i wynik był zgodny z oczekiwaniami

B Bez problemów

Najtrudniejsze wydawało się gotowe. Teraz zostało już tylko ostateczne rozpracowanie protokołu, wygenerowanie odpowiednich bitmap i podłączenie do mediów społecznościowych. I o tym wszystkim będzie w dalszych częściach (w których też będzie kilka ciekawych przygód).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *