Elektroda.pl
Elektroda.pl
X
Elektroda.pl
TermoPasty.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bezprzewodowa wirtualna klawiatura HID dla drugiego komputera na WiFi

p.kaczmarek2 04 Cze 2019 10:12 2094 14
  • Bezprzewodowa wirtualna klawiatura HID dla drugiego komputera na WiFi
    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
    Zaloguj się, aby zobaczyć kod

    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
    Zaloguj się, aby zobaczyć kod

    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:
    Bezprzewodowa wirtualna klawiatura HID dla drugiego komputera na WiFi
    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.
    Bezprzewodowa wirtualna klawiatura HID dla drugiego komputera na WiFi
    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
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • TermoPasty.pl
  • #2
    Euzebiusz23091998
    Poziom 15  
    W sumie rozwiązanie problemu ciekawe, ale nadal i tak trzeba mieć 2 myszki. Nie byłoby praktyczniej koledze zrezygnować z 2 komputerów i po prostu w miejscu drugiego po prostu podpiąć monitor do laptopa? Nie wiem jakie jest zastosowanie tego systemu, ale moim zdaniem większa wygoda w obsłudze + brak problemu z przenoszeniem plików w razie czego + oszczędność prądu + ogólnie mamy jeden system zamiast dwóch.

    Tak czy tak + za kreatywność :)

    PS: nie krzyczy ci antywirus na twój program? Bo może go rozpoznawać trochę jako keyloggera
  • #3
    p.kaczmarek2
    Poziom 23  
    Dzięki za dobre słowa.
    Euzebiusz23091998 napisał:
    W sumie rozwiązanie problemu ciekawe, ale nadal i tak trzeba mieć 2 myszki.

    Zrobienie podobnego mechanizmu do myszki mam w planach. Jedynie obawiam się, że potrzebny będzie osobny mikrokontroler. Tzn. osobno będzie to co zrobiłem w tym temacie (wirtualna klawiatura) i osobno wirtualna myszka.


    Euzebiusz23091998 napisał:
    Nie byłoby praktyczniej koledze zrezygnować z 2 komputerów i po prostu w miejscu drugiego po prostu podpiąć monitor do laptopa?

    Mam już dwa monitory, w tym jeden podłączony na USB.
    Poza tym motywacją też było:
    - całość używam do sterowania osobnym starszym komputerem "do elektroniki", specjalnie go trzymam jako osobną maszynę, bo czasem uruchamiam jakieś płytki z USB, itp. itd. a wiem, że jestem omylny, więc to jest swego rodzaju zabezpieczenie. Jak coś pójdzie nie tak, np. będzie spięcie na USB to oberwie i tak stary komputer, a nie główna maszyna.
    - całość używam czasem jak komuś np. stawiam system (itp. itd) i sterowany laptop stoi dalej a trzeba tylko czasem wcisnąć ENTER albo wpisać login
    Z plikami nie ma problemu, i tak korzystam z NAS.

    Euzebiusz23091998 napisał:

    PS: nie krzyczy ci antywirus na twój program? Bo może go rozpoznawać trochę jako keyloggera

    Mam tylko MBAM i nie reaguje na mój exe. Ale tak, to z tym keyloggerem to powód dla którego nie dałem źródła aplikacji na Windowsa.
  • #4
    Szyszkownik Kilkujadek
    Poziom 35  
    Gratuluję udanego projektu. Pytanie mam tylko nieco malkontenckie ;-)
    Dlaczego nie skorzystałeś z opcji połączenia wirtualnego pulpitu typu Team Viewer?
  • #5
    p.kaczmarek2
    Poziom 23  
    Szyszkownik Kilkujadek napisał:
    Gratuluję udanego projektu. Pytanie mam tylko nieco malkontenckie ;-)
    Dlaczego nie skorzystałeś z opcji połączenia wirtualnego pulpitu typu Team Viewer?

    Znam ten program od bardzo dawna, ale on raczej wymaga instalacji (ew. przerzucenia wersji portable jako plik na docelową maszynę), przepisania ID komputera, połączenia się, wymaga połączenia internetowego na obu maszynach...
    Do tego przy np. stawianiu komuś Windowsa raczej nie użyję Teamviewera, bo on działa już po zalogowaniu się do systemu.
    A moje rozwiązanie działa od początku - nawet na boot screenie. Na drugiej maszynie o której pisałem w tym temacie mam dual boot Windowsa i Ubuntu.
  • TermoPasty.pl
  • #6
    Baskhaal
    Poziom 11  
    Gratulacje, ciekawy projekt, interesujące podejście. Gdyby pominąć fakt, że urządzenia działa już od momentu Boot to wystarczą rozwiązania programowe. Kiedyś, jak byłem jeszcze piękny i młody pracowałem jednym zestawem bezprzewodowej klawiatury i myszy na dwóch komputerach (jeden Windows, drugi SuSe). Dwa monitory obok siebie, przejazd kursorem za wybraną krawędź ekranu przerzucało kontrolę na drugi komputer. Można było też przełączać kontrolę np kombinacją klawiszy. Jedne komputer ustawiony jako 'master' drugi 'użyczał' od niego sprzęt poprzez LAN. Jak sobie przypomnę nazwę programu to podrzucę w dalszym ciągu wątku.
  • #7
    arturavs
    Poziom 40  
    A może użyć coś w rodzaju ESP32/ESP8266, lub modułu LoLin? Masz wszystko, co prawda USB przez konwerter ale jest.
  • #8
    noseqp
    Poziom 2  
    Szyszkownik Kilkujadek napisał:
    Gratuluję udanego projektu. Pytanie mam tylko nieco malkontenckie ;-)
    Dlaczego nie skorzystałeś z opcji połączenia wirtualnego pulpitu typu Team Viewer?


    Co do rozwiązań software'owych wartym uwagi jest także Mouse Without Border .
  • #9
    kwas1988
    Poziom 9  
    Jako ciekawostka i projekt dla majsterkowicza ok.
    Ale można to samo osiągnąć w ciągu dosłownie 5 minut i kilku kliknięć myszką (pomijając już możliwość kupna gotowego KVM'a za grosze).
    https://symless.com/synergy
    Taki softowy KVM
    Z aplikacji korzystałem przez długi czas i się świetnie sprawdza.
    Kiedyś była bezpłatna (przynajmniej starsze wersje takie są). Z tego co kojarzę nowe wersje są już płatne ale stare wersję działają bez problemu.
    Dzięki niej można kilkoma jednostkami sterować niezależnie od zainstalowanego OS.
    Ma własny schowek dzięki czemu wycinanie kopiowanie i wklejanie działa.
    Poza Synergy jest jeszcze InputDirector http://inputdirector.com/index.html podobne rozwiązanie, ale tylko na Winde.
  • #10
    ...KUBA...
    Poziom 21  
    Dla myszki fajne rozwiązanie zrobił Logitech mianowicie chodzi mi o: Logitech Flow dostępny już w różnych modelach myszy od Logitech. Dzięki temu można sterować kilkoma komputerami za pomocą jednej myszki ;)
  • #11
    Szyszkownik Kilkujadek
    Poziom 35  
    @noseqp, @kwas1988, @...KUBA... nie wiem czy zauważyliście, ale autor potrzebował rozwiązania SPRZĘTOWEGO, a nie programowego. Polecam najpierw czytać, a potem się wypowiadać.
  • #12
    Baskhaal
    Poziom 11  
    Szyszkownik Kilkujadek napisał:
    @noseqp, @kwas1988, @...KUBA... nie wiem czy zauważyliście, ale autor potrzebował rozwiązania SPRZĘTOWEGO, a nie programowego. Polecam najpierw czytać, a potem się wypowiadać.


    No i super - w dobie świetnych rozwiązań software'owych jest to sztuka dla sztuki. Nie zmiania to faktu, że nadal to sztuka :) Godna zauważenia i pochwały.
  • #13
    Szyszkownik Kilkujadek
    Poziom 35  
    Baskhaal napisał:
    No i super - w dobie świetnych rozwiązań software'owych jest to sztuka dla sztuki.

    W jaki sposób można za pomocą rozwiązania programowego sterować komputerem jeszcze przez startem systemu operacyjnego? Jak wejść w BIOS? :-)
  • #14
    Baskhaal
    Poziom 11  
    Szyszkownik Kilkujadek napisał:
    Baskhaal napisał:
    No i super - w dobie świetnych rozwiązań software'owych jest to sztuka dla sztuki.

    W jaki sposób można za pomocą rozwiązania programowego sterować komputerem jeszcze przez startem systemu operacyjnego? Jak wejść w BIOS? :-)


    Nie twierdze, że idealne :) Co czego potrzebuje. "Master" zawsze będzie w takiej sytuacji obsłużony. I szczerze - poza oczywiście ciekawym projektem jedyną zaletą tego rozwiązania sprzętowego jest właśnie dostęp do BIOS.

    PS. Customowy BIOS z trigerem ze strony klawiatury via etherner wake-up? Coś w tym stylu? Hehe, wiem, trochę mnie fantazja poniosła, nie znam się akurat na tym ;)
  • #15
    Szyszkownik Kilkujadek
    Poziom 35  
    Baskhaal napisał:
    Nie twierdze, że idealne Co czego potrzebuje. "Master" zawsze będzie w takiej sytuacji obsłużony. I szczerze - poza oczywiście ciekawym projektem jedyną zaletą tego rozwiązania sprzętowego jest właśnie dostęp do BIOS.

    Albo ja słabo rozumuje, albo ta odpowiedź nie ma nic wspólnego z moim pytaniem. :-(