[solved] sterowanie z klawiatury

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
dcm_Marecheq
Piegowaty Guziec
Piegowaty Guziec
Posty: 16
Rejestracja: 06 lut 2007, 20:59
Płeć: Mężczyzna
Wersja Ubuntu: 15.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

[solved] sterowanie z klawiatury

Post autor: dcm_Marecheq »

Chciałbym sterować kartą przekaźników przy pomocy klawiatury. Znalazłem program obsługujący joystick i próbowałem go przerobić tak żeby przechwytywał zdarzenia klawiatury (/dev/input/event1 zamiast /dev/input/js0 i dostosowanie struktury zdarzenia do kodów wysyłanych przez klawiaturę). Niestety klawiatura wysyła scancodes różnej długości a dostęp do węzła klawiatury można uzyskać tylko jako root co bardzo komplikuje sprawę. Czy ktoś miał może kiedyś podobny problem?
Dodam że znaleziony program działa bez zarzutu, ale chcę mieć też możliwość sterowania w przypadku braku joysticka. Mógłbym użyć GTK lub innej biblioteki, ale nie chcę żeby program za bardzo się rozrósł. Klawiatura generuje kod przycisku w momencie naciśnięcia go, co jakiś czas (typematic rate delay) przez cały czas gdy przycisk jest wciśnięty oraz gdy przycisk jest zwalniany (inny kod). Nie urządzają mnie funkcje getch() czy scanf() bo rejestrują tylko wciśnięcie klawisza.

Obrazek Obrazek

Załączam kod powstały z połączenia programu przechwytującego zdarzenia joysticka (joystick.c), programu wysyłającego komendy na port szeregowy (rs232.c) oraz przykładowego kodu odpowiedzialnego za ruch gąsienic czołgu (tank.c).
Byłbym wdzięczny gdyby ktoś podzielił się linkiem do kodu źródłowego jakiegoś prostego keyloggera lub gierki w których znalazłbym rozwiązanie.
Załączniki
2009_09_26.tar.gz
(12.94 KiB) Pobrany 67 razy
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: sterowanie z klawiatury

Post autor: beluosus »

Chyba nie bardzo rozumiem ale postaram się pomóc... :D
No więc zrobiłem tak:

Kod: Zaznacz cały

sleep 1 && hexdump -x /dev/input/event1
Po odczekaniu 1s i naciśnięciu shifta otrzymałem:

Kod: Zaznacz cały

0000000    fd8a    4ad8    cef6    000e    0004    0004    0036    0000
0000010    fd8a    4ad8    cefd    000e    0001    0036    0001    0000
0000020    fd8a    4ad8    cefe    000e    0000    0000    0000    0000
0000030    fd8b    4ad8    abdf    0000    0004    0004    0036    0000
0000040    fd8b    4ad8    abe4    0000    0001    0036    0000    0000
0000050    fd8b    4ad8    abe6    0000    0000    0000    0000    000
Zaznaczony bajt (czternasty) jest numerem wciśniętego klawisza. Takim sposobem (reverse engineering) można dojść o czym informuje każdy bit. Pewnie jest też to gdzieś udokumentowane. Nie wiem skąd Ci się wzięły różnej długości scancody. Z tego co widzę to każdy sygnał jest długości 16 bajtów.
Nie wydaje mi się żeby czytanie tego pliku było możliwe:
- nie będąc rootem
- nie będąc w grupie root
- nie zmieniając praw dostępu do pliku
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
dcm_Marecheq
Piegowaty Guziec
Piegowaty Guziec
Posty: 16
Rejestracja: 06 lut 2007, 20:59
Płeć: Mężczyzna
Wersja Ubuntu: 15.10
Środowisko graficzne: Unity
Architektura: x86_64
Kontakt:

sterowanie z klawiatury

Post autor: dcm_Marecheq »

Zastąpiłem strukturę zdarzenia joysticka:

Kod: Zaznacz cały

	unsigned int time;	/* czas zarejestrowania zdarzenia w milisekundach */
	short value;		/* wychylenie drążka lub stan przycisku */
	unsigned char type;     /* czy zdarzenie dotyczy drążka czy przycisku */
	unsigned char number;   /* numer przycisku lub osi (0 ? oś pozioma X, 1 oś pionowa Y) */
odpowiednią dla zdarzenia klawiatury:

Kod: Zaznacz cały

	struct timeval time;
	unsigned short type;
	unsigned short code;
	unsigned int value;
znalezioną w dokumentacji. Teraz powinno być już z górki - wystarczy funkcję przechwytującą zdarzenia klawiatury wstawić do tej samej pętli głównej co tą od joysticka. Zamieszczam kod programu wyświetlającego zdarzenia klawiatury: klawiatura.c. Program musi być wykonywany jako super user.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 17 gości