Witajcie moi drodzy
Już tłumaczę, co kryje się za tym tajemniczym tytułem.
Jest to projekt który powstał w ciągu jednego dnia z praktycznej potrzeby - a mianowicie mam u siebie dwa komputery. Pierwszy komputer (właściwie laptop) ma oczywiście klawiaturę, a drugi z kolei jest na stole przy którym nie ma za bardzo miejsca na klawisze. Dlatego uznałem, że zrobię urządzenie które pozwoli mi z pomocą jednej klawiatury sterować obiema maszynami - po prostu będzie możliwość przełączania, który komputer odbiera klawisze. Tutaj opiszę, jak to zrealizowałem.
Zarys projektu
Całość można było zrealizować na różne sposoby, ale ja wybrałem taki który wydał mi się najprostszy i jednocześnie najbardziej odpowiedni dla mnie.
Postanowiłem, że na maszynie głównej zainstalowana będzie aplikacja, która będzie przechwytywać klawisze, a następnie wysyłać je przez sieć do modułu WiFi/USB wpiętego w port USB drugiej maszyny. Ten moduł będzie udawać drugą klawiaturę na HID.
W skrócie, na system będą się składać 3 składniki:
- program na maszynie pierwszej (nadawca klawiszy) - po włączeniu hotkeya przesyła przez WiFi dalej klawisze, a jak hotkey jest wyłączony to nic nie robi
- hardware - mikrokontroler na USB z modułem WiFi
- firmware - na mikrokontrolerze będzie program który po prostu odbiera klawisze przez WiFi i wysyła je na USB poprzez protokół HID udając zwykłą klawiaturę
Pseudokod działania systemu na maszynie pierwszej (nadawca klawiszy):
Kod: C / C++
Pseudokod jest bardzo uproszczony, tak naprawdę muszę obsługiwać osobno onKeyDown i onKeyUp, dodatkowo w dwóch wersjach (dla zwykłych klawiszy i systemowych). Do tego ze względu na działanie HID część klawiszy specjalnych wysyłanych jest jako maska bitowa, a część jako ich kody.
Pseudokod działania systemu na urządzeniu USB (odbiorca klawiszy):
Kod: C / C++
Powyższy pseudokod jest bardzo uproszczony, bo tak naprawdę wspieram (i muszę wspierać) zgodnie ze standardem klawiatury HID osobno maskę bitową dla klawiszy takich jak ALT, CTRL, itp., oraz osobno wsparcie trzymania KILKU klawiszy na raz.
Na maszynie drugiej nie trzeba nawet nic instalować, bo moje urządzenie jest przez nią widziane jako klawiatura HID i jest wspierane automatycznie.
Dzięki obranemu podejściu całość działa bez problemu zarówno na systemach Windowsowych, jak i na Ubuntu (testowałem na wersji 18, ale zadziała raczej na wszystkim co wspiera klawiaturę HID na USB).
Realizacja projektu - nadajnik
"Nadajnik" to w zasadzie tylko i wyłącznie program na Windowsa który napisałem z pomocą WINAPI i WinForms. Poza oczywistą funkcją łapania hotkeya i w razie potrzeby wysyłania klawiszy do odbiornika przez WiFi wzbogaciłem go o możliwość znalezienia odbiornika poprzez skan sieci. Dzięki temu nie trzeba konfigurować ręcznie adresów IP, i wszystko się samo paruje. Docelowo można by to rozbudować jeszcze o nadawanie ID dla różnych odbiorników, ale ja po prostu nie miałem potrzeby wspierania więcej niż jednej takiej płytki w mojej lokalnej sieci.
Wstępna wersja programu wygląda tak:
Na oknie znajdują się:
- informacje o stanie połączenia/poszukiwaniu odbiornika
- pole do zaznaczenia czy przekierowanie jest aktywne (do niego jest również podpięty hotkey)
- informacja ile pakietów już wysłano
- trzy przyciski służące do testowania (wysyłają pakiety z klawiszami, bez 'przekierowywania' tego co się dzieje na głównej maszynie)
- historia kodów wciskanych klawiszy (używałem jej do testów oraz do pisania translacji kodów klawiszy WINAPI na kody HID - bo one niestety są różne...)
Nadajnik korzysta z protokołu TCP, aczkolwiek równie dobrze mógłby korzystać z UDP. Nadajnik w momencie zmiany stanu klawiatury wysyła krótki pakiet z informacji o klawiszach wg. ustalonego przeze mnie formatu.
Realizacja projektu - odbiornik
Odbiornik to PIC18F45K50 ze sprzętowym USB udający klawiaturę HID z podłączonym modułem WiFi RN131. RN131 komunikuje się z PICem poprzez UART. PIC odbiera na UART kod klawisza i od razu przesyła go dalej na USB.
Odbiornik został wzbogacony o diodę LED, która miga wtedy, kiedy otrzyma on pakiet. Firmware został napisany w MikroC PRO for PIC.
Całość na ten moment wygląda tak jak wygląda, ponieważ została złożona z tego co miałem pod ręką. Do projektu użyłem jednej z moich pierwszych płytek pod PIC, którą wytrawiłem parę lat temu.
Filmik z działania pierwszej wersji
Z góry przepraszam, za 'vertical video syndrome', ale trudno było to lepiej nagrać tak, by pokazać jednocześnie ekran laptopa i moje urządzonko na jego klawiaturze.
Początkowo chciałem w kadrze złapać również drugiego laptopa, ale wtedy już wcale nie widać byłoby wyraźnie to, co piszę zdalnie na tym pierwszym...
Filmik przedstawia jak poprzez swoje urządzenie włączam menu Start, uruchamiam notatnik, a potem piszę w nim duże i małe litery, cyfry oraz znaki specjalne. Również testuję kombinacje takie jak CTRL + A, CTRL + C, CTRL + B, spację oraz tab.
Na filmiku widać laptop, którym steruję, oraz całość mojego sterownika (moduł WiFi, części na płytce stykowej, oraz płytkę pod PIC18F45K50). Poza kadrem korzystam z klawiatury drugiej maszyny i chodzący na niej mój soft przesyła klawisze do mojego modułu.
Na filmiku również widać kiedy przesyłane są pakiety - w momencie odbioru pakietu zmienia się stan żółtej diody LED.
Dalszy rozwój projektu
Teraz cała idea działania jest już przetestowana, a cały soft jest gotowy i sprawny, więc można pomyśleć o wykonaniu całości już na czysto. Planuję użyć do nowej wersji jakiegoś mniejszego mikrokontrolera, może coś z młodszej części rodziny PIC16F, ale już tych, które maja sprzętowe USB. Może PIC16F1455? W obudowie SMD? Do tego całość można by zmieścić na jednej płytce, do której również lutowany byłby moduł WiFi, ale nie wiem czy prędko będę miał czas to zrealizować. Wszystko dobrze spełnia swoje zadanie też w obecnej formie.
Podsumowanie
Z projektu jestem bardzo zadowolony. Całość jest bardzo "lekka", sterowana przeze mnie zdalnie maszyna nawet nie zdaje sobie sprawy, ze jej input pochodzi od czegoś innego niż zwykła klawiatura HID! Jest to wielki plus, ponieważ rozwiązania takie jak Teamviewer itp. są w porównaniu do tego nieporęczne i problematyczne, wymagają instalacji na docelowej maszynie, zajmują jej czas procesora i RAM, a do tego zależą od systemu operacyjnego. Z całości korzystam dość często i pewnie prędko się to nie zmieni.
Załączniki
Wrzucam dokumentację USB którą używałem, finalny projekt HID w MikroC PRO for PIC - plik binarny oraz kod źródłowy.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.