Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam!
Używam ostatnio myszki Microsoft Arc Touch Mouse, niestety wibracje w tej myszce można wyłączyć tylko pod Windowsem. Trafiłem na ten blog http://julien.danjou.info/blog/2012/logitech-k750-linux-support ,zainstalowałem VirtualBoxa i udało mi się przechwycić Wiresharkiem pakiety, które wysyła host (Windows) do tej myszki, by wyłączyć/włączyć wibracje.
wygląda to mniej więcej tak;
0000 00 18 dc f4 00 00 00 00 53 02 80 05 02 00 00 3c ........ S......< 0010 8a a4 3b 50 00 00 00 00 8a 5b 06 00 8d ff ff ff ..;P.... .[...... 0020 1b 00 00 00 00 00 00 00 a1 01 22 03 02 00 1b 00 ........ .."..... 0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 ........ ........
teraz mam pytanie;
jest jakiś sposób na wysłanie tych czystych danych do urządzenia USB? lub jak analizować ten zapis?
Offline
Chyba odpowiedź masz w blogu, do którego link wkleiłeś. Czyż nie?
Offline
No tak, chociaż myślałem, że jest inna droga na przesłanie tych bytów niż libusb/libhid. Będę musiał przeczytać dokumentacje może mi się uda coś wykombinować
Ostatnio edytowany przez dominbik (2012-08-29 15:07:29)
Offline
Po co inna skoro ta najprostsza bo gotowa?
Offline
Racja, ale on tam odbiera dane z klawiatury i je analizuje. A ja chciałbym wysłać z hosta -> myszka ;/
Offline
strzelam: echo "coś" > /dev/input/mouseX?
Offline
Gdyby taki sposób zadziałał byłoby super. Myślałem o tym, ale wydaje mi się to za proste - po co zatem libusb, libhid?
Pytanie tylko czy zamiast "coś" mogę wpisać te swoje bajty z tego pakietu. Jutro się pewnie tym pobawię - mam nadzieję, że myszki to nie rozwali ;p
Offline
Ja mam jedno pytanko (Offtopic)
Po cholerę w myszce wibracje?
Fervi
Offline
Dowiesz się, jak będziesz duży. ;)
Offline
Hhah nie, zamiast kółeczka jest panel dotykowy i jak przewijasz stronę to wibruje (Microsoft Arc Touch Mouse) imitując kółeczko. Niestety, nie zrobili możliwości wł/wył tego pod Linuxem (tylko pod Windowsem jak się zainstaluje program).
azhag napisał(-a):
strzelam: echo "coś" > /dev/input/mouseX?
a tym sposobem można wysyłać do urządzenia byte czy tekst? Jak byś to wkleił?
Wkleiłem jako skrypt, by wysyłał za porządkiem dokładnie to samo co host(windows) do myszki, ale nie działa, Podejrzewam, że nie można wysyłać po prostu przez echo wklejając te liczby/bajty z wiresharka (bez tych indexów na początku typu 0010, 0020, 0030, 0040). Jak dam
cat /dev/input/mouse0
to też mi nie pokazuje bytów tylko jakieś dziwne znaczki.
skrypcik;
#!/bin/bash echo "00c005eb00000000530280050200003c95a43b50000000008a160d008dffffff1b00000000000000a101220302001b0000000000000000000002000000000000" > /dev/input/mouse0 echo "00c005eb00000000530280050200003c95a43b5000000000a5200d008dffffff1300000000000000a10120030200130000000000000000000002000000000000" > /dev/input/mouse0 echo "00c005eb00000000530200050200000095a43b5000000000e52a0d008dffffff1b0000001b0000002109220302001b0000000000000000000000000000000000228101001f00000000000000000000000000000000000000000000" > /dev/input/mouse0
w sumie, by wyłączyć hibernacje ten windowsowy program wysyła te 3 pakiety, myszka na każdy odpowiada jednym. wysyłam dokładnie to samo i gó*** ;/
Offline
dominbik napisał(-a):
azhag napisał(-a):
strzelam: echo "coś" > /dev/input/mouseX?
a tym sposobem można wysyłać do urządzenia byte czy tekst? Jak byś to wkleił?
echo służy do tekstów. Musisz skorzystać z jakiegoś polecenia, który wysyła w innym "formacie" (od biedy możesz utworzyć odpowiedni plik i użyć cat).
Zaznaczam też, że nie wiem czy w ten sposób można wysłać coś do myszki. Ale zmodemami w każdy razie tak się to robi :)
Offline
wciaz nie rozumiem po co sie jebac z bash skoro typek wrzucil gotowy kod programu ktory to robi ....
wystarczy skopiowac do "jakis_tam_plik.c" potem daj
gcc jakis_tam_plik.c -o nazwa_programiku_jaki_chcesz_uzyskac
jedyne co musisz zrobic to zmienic wysylany ciag bajtow na "twoj" i vendor i dev ID na zgodne z twoim.
jedyne sensowne wyjasnienie dlaczego "odbiera i analizuje dane" to:
zeby wyświetlic napis " light on " , ... sadze ze logu "girls fun tool " nie bedziesz potrzebowal bo poczujesz wibracje.
wasniejsze tutaj jest twoje lenistwo i wyslanie calego syfnego pakietu.
( zamiast odebrac dwa, kiedy wlaczasz, kiedy wylaczasz i zrobic diff na nich ).
[edit]
ale zeby nie bylo , drugi link google
http://stackoverflow.com/questions/1604765/linux-sh … ring-to-bytes
pytanie:
http://www.google.pl/search?client=opera&rls=en … 7&bih=957
Ostatnio edytowany przez gindek (2012-08-31 20:28:01)
Offline
Masz rację. Nie doczytałem, że ten program również wysyła pakiet do urządzenia.
na początku miałem problem z biblioteką libusb (#include <libusb.h>)
doinstalowałem libusb-dev libusb-1.0-0-dev kompiluje poleceniem;
gcc program.cpp -o program -I/usr/include/libusb-1.0/ -lusb
to jest ten kod;
/* Written by Julien Danjou in 2012 */ #include <linux/hid.h> #include <libusb.h> #include <stdio.h> #include <stdlib.h> #include <string.h>z int main(void) { libusb_context *ctx; libusb_init(&ctx); libusb_set_debug(ctx, 3); /* Look at the keyboard based on vendor and device id */ libusb_device_handle *device_handle = libusb_open_device_with_vid_pid(ctx, 0x046d, 0xc52b); fprintf(stderr, "Found keyboard 0x%p\n", device_handle); libusb_device *device = libusb_get_device(device_handle); struct libusb_device_descriptor desc; libusb_get_device_descriptor(device, &desc); for(uint8_t config_index = 0; config_index < desc.bNumConfigurations; config_index++) { struct libusb_config_descriptor *config; libusb_get_config_descriptor(device, config_index, &config); /* We know we want interface 2 */ int iface_index = 2; const struct libusb_interface *iface = &config->interface[iface_index]; for (int altsetting_index = 0; altsetting_index < iface->num_altsetting; altsetting_index++) { const struct libusb_interface_descriptor *iface_desc = &iface->altsetting[al>tsetting_index]; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!LINIA 39^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ if (iface_desc->bInterfaceClass == LIBUSB_CLASS_HID) { libusb_detach_kernel_driver(device_handle, iface_index); libusb_claim_interface(device_handle, iface_index); unsigned char ret[65535]; unsigned char payload[] = "\x10\x02\x09\x03\x78\x01\x00"; if(libusb_control_transfer(device_handle, LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, HID_REQ_SET_REPORT, 0x0210, iface_index, payload, sizeof(payload) - 1, 10000)) { int actual_length = 0; while(actual_length != 20 || strncmp((const char *) &ret[9], "GOOD", 4)) libusb_interrupt_transfer(device_handle, iface_desc->endpoint[0].bEndpointAddress, ret, sizeof(ret), &actual_length, 100000); uint16_t lux = ret[5] << 8 | ret[6]; fprintf(stderr, "Charge: %d %%\nLight: %d lux\n", ret[4], lux); } libusb_release_interface(device_handle, iface_index); libusb_attach_kernel_driver(device_handle, iface_index); } } } libusb_close(device_handle); libusb_exit(ctx); }
i mam błąd w kompilacji;
program.cpp: In function ‘int main()’:
program.cpp:39:87: error: ‘al’ was not declared in this scope
program.cpp:39:90: error: ‘tsetting_index’ was not declared in this scope
chodzi o linię 39
co do echo
#!/bin/bash echo -e "\x00\xc0\x05\xeb\x00\x00\x00\x00\x53\x02\x80\x05\x02\x00\x00\x3c\x95\xa4\x3b\x50\x00\x00\x00\x00\x8a\x16\x0d\x00\x8d\xff\xff\xff\x1b\x00\x00\x00\x00\x00\x00\x00\xa1\x01\x22\x03\x02\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00" > /dev/input/mouse0 echo -e "\x00\xc0\x05\xeb\x00\x00\x00\x00\x53\x02\x80\x05\x02\x00\x00\x3c\x95\xa4\x3b\x50\x00\x00\x00\x00\xa5\x20\x0d\x00\x8d\xff\xff\xff\x13\x00\x00\x00\x00\x00\x00\x00\xa1\x01\x20\x03\x02\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00" > /dev/input/mouse0 echo -e "\x00\xc0\x05\xeb\x00\x00\x00\x00\x53\x02\x00\x05\x02\x00\x00\x00\x95\xa4\x3b\x50\x00\x00\x00\x00\xe5\x2a\x0d\x00\x8d\xff\xff\xff\x1b\x00\x00\x00\x1b\x00\x00\x00\x21\x09\x22\x03\x02\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x81\x01\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /dev/input/mouse0
niestety nie działa. Zna się ktoś może na C++?
Ostatnio edytowany przez dominbik (2012-09-03 14:30:07)
Offline
dominbik napisał(-a):
Kod:
for (int altsetting_index = 0; altsetting_index < iface->num_altsetting; altsetting_index++) { const struct libusb_interface_descriptor *iface_desc = &iface->altsetting[al>tsetting_index]; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!LINIA 39^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^i mam błąd w kompilacji;
program.cpp: In function ‘int main()’:
program.cpp:39:87: error: ‘al’ was not declared in this scope
program.cpp:39:90: error: ‘tsetting_index’ was not declared in this scope
chodzi o linię 39
Ekspertem od kodowania nie jestem, ale wygląda mi na to, że ma tam być "altsetting_index" zamiast "al>tsetting_index".
Tym bardziej, że powyżej masz taką właśnie nazwę zadeklarowaną:
int altsetting_index = 0
Spróbuj usunąć ten ">" i zobaczyć czy się uda.
Jeśli sam do tego doszedłeś to przepraszam za zwrócenie uwagi.
Pozdrawiam
TheAnt
Ostatnio edytowany przez TheAnt (2012-09-03 15:57:54)
Offline
Ok. Po edycji rzeczywiście kompilacja poleceniem;
g++ -Wall -c Roboczy/program.cpp -I/usr/include/libusb-1.0/
się udała.
Niestety po uruchomieniu programu
./program.o: 5: ./program.o: Syntax error: Unterminated quoted string
będę dalej nad tym kombinować, jak się uda dam znać.
Offline
Specjalistą nie jestem, ale usunąłbym "z" z końca linijki "#include <string.h>", być może to jest właśnie błąd, który wywala program.
Offline
plik .o to nie binarka! Tego się nie uruchamia! To dopiero plik obiektowy. Musisz go zminkować, albo wywal -c z lini poleceń g++, to od razu zlinkuje.
Offline