èªåã§ãã©ã€ãïŒUSB CAR
Linuxã®æ奜家ã«å¯ŸããWindowsã®æ奜家ã®äž»åŒµã®1ã€ã¯ããã®OSã®ããŒããŠã§ã¢ã®ãã©ã€ããŒããªãããšã§ãã æéãçµã€ã«ã€ããŠãç¶æ³ã¯æ¹åãããŠããŸãã ä»ã§ã¯ãã§ã«10幎åãããã¯ããã«åªããŠããŸãã ãããããæ°ã«å
¥ãã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§èªèãããªãããã€ã¹ã«åºäŒãããšããããŸãã éåžžãããã¯äœããã®çš®é¡ã®USBåšèŸºæ©åšã§ãã
ããªãŒãœãããŠã§ã¢ã®å©ç¹ã¯ããã®åé¡ãèªåã§è§£æ±ºã§ããããšã§ãïŒããã°ã©ããŒã®å ŽåïŒã ãã¡ãããããã¯ãã¹ãŠæ©åšã®è€éãã«äŸåããŸãã 3次å
ãŠã§ãã«ã¡ã©ã§ã¯æåããªããããããŸããããå€ãã®USBããã€ã¹ã¯éåžžã«ã·ã³ãã«ã§ãããã³ã¢ã®æ·±éšã«é£ã³èŸŒãã ããCã§æã£ããããå¿
èŠã¯ãããŸããã ã
ããã»ã¹ã¯æ¬è³ªçã«ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«ãªããŸãã ãŸããããã€ã¹ã詳现ã«èª¿æ»ãã次ã«Windowsã§ãã©ã€ããŒãšäº€æããããŒã¿ãä¿åãããããã®æå³ãç解ããããšããŸãã èªæã§ãªããããã³ã«ã®å Žåãçµéšãšéã®äž¡æ¹ãå¿
èŠã«ãªãå ŽåããããŸãã
USBã®çŽ¹ä»
USB-ãã¹ãå¶åŸ¡ãåãããã¹ã ãã¹ãïŒPCïŒã¯ãã©ã®ããã€ã¹ãããŒã¿ããã€ã¯ã€ã€çµç±ã§éä¿¡ãããã決å®ããŸãã éåæã€ãã³ãïŒããŒããŒãã®ãã¿ã³ãæŒãïŒã®å Žåã§ãããã¹ãã«ããã«ã¯éä¿¡ãããŸããã åãã¹ã«ã¯æ倧127åã®ããã€ã¹ïŒããçµç±ã®å Žåã¯ããã«å€ãïŒãååšããå¯èœæ§ãããããããã®æäœã¹ããŒã ã¯å¶åŸ¡ã容æã«ããŸãã
USBã«ã¯ãã€ã³ã¿ãŒãããã«ãã䌌ãå€å±€ãããã³ã«ã·ã¹ãã ããããŸãã éåžžãæäœã¬ãã«ã¯ã·ãªã³ã³ã«å®è£
ãããŸãã ãã©ã³ã¹ããŒãå±€ã¯ããã³ãã«ïŒãã€ãïŒãä»ããŠæ©èœããŸãã ã¹ããªãŒã ãã³ãã«ã¯ãããŸããŸãªããŒã¿ãã¡ãã»ãŒãžãã³ãã«-ããã€ã¹ã管çããããã®ã¡ãã»ãŒãžãéä¿¡ããŸãã åããã€ã¹ã¯ãå°ãªããšã1ã€ã®ã¡ãã»ãŒãžãã³ãã«ããµããŒãããŸãã ã¢ããªã±ãŒã·ã§ã³ïŒãŸãã¯ã¯ã©ã¹ïŒã®æé«ã¬ãã«ã«ã¯ãUSB倧容éèšæ¶è£
眮ïŒãã©ãã·ã¥ãã©ã€ãïŒããã¥ãŒãã³ã€ã³ã¿ãŒãã§ã€ã¹ããã€ã¹ïŒHIDïŒãªã©ã®ãããã³ã«ããããŸãã
ã¯ã€ã€ãŒã§
USBããã€ã¹ã¯ããšã³ããã€ã³ãã®ã»ããããŸãã¯I / Oãããã¡ãŒãšèããããšãã§ããŸãã ããããã«ããŒã¿ã®æ¹åïŒå
¥åãŸãã¯åºåïŒãšéä¿¡ã®ã¿ã€ãããããŸãã ãããã¡ã®ã¿ã€ãã¯æ¬¡ã®ãšããã§ããå²ã蟌ã¿ãã¢ã€ãœã¯ããã¹ãå¶åŸ¡ãããã³ãã±ããã
å²ã蟌ã¿ã¯ããªã¢ã«ã¿ã€ã ã§å°ãããŒã¿ãéä¿¡ããŸãã ãŠãŒã¶ãŒãããŒãæŒããšãããã€ã¹ã¯ãã¹ãããããã§ãã¿ã³ãæŒããŸãããïŒããšå°ãããŸã§åŸ
æ©ããŸãã ãã¹ãã®é床ãäœäžããããšã¯ãªãããããã®ã€ãã³ãã¯å€±ãããŸããã ã¢ã€ãœã¯ããã¹ã¯ã»ãŒåãæ¹æ³ã§åäœããŸãããããã»ã©é£ããã¯ãããŸãã-ããå€ãã®ããŒã¿ã転éã§ããŸãããéèŠã§ã¯ãªãå ŽåïŒãŠã§ãã«ã¡ã©ãªã©ïŒã¯å€±ãããŸãã
倧容éçšã«èšèšããããããã ãã£ãã«ãè©°ãŸãããªãããã«ãçŸåšä»ã®ããŒã¿ã«ãã£ãŠå æãããŠããªããã¹ãŠã®ã¹ããŒã¹ãäžããããŸãã ã³ã³ãããŒã©ã¯ããã€ã¹ã®å¶åŸ¡ã«äœ¿çšãããèŠæ±ãšå¿çã®åœ¢åŒãå³å¯ã«å®çŸ©ãããŠããã®ã¯ã³ã³ãããŒã©ã®ã¿ã§ãã é¢é£ä»ããããã¡ã¿ããŒã¿ãæã€ãããã¡ã®ã»ããã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãšåŒã°ããŸãã
USBããã€ã¹ã®ãããã¡çªå·ã¯ãŒãã§ããããã¯ãå¶åŸ¡ããŒã¿ã«äœ¿çšããããã³ãã«ã®ããã©ã«ãã®ãšã³ããã€ã³ãã§ãã ããããããã€ã¹ãæã£ãŠãããããã¡ãŒã®æ°ãšãã®ã¿ã€ãããã¹ãã¯ã©ã®ããã«ããŠç¥ãã®ã§ããããïŒ ãã®ããã«ãç¹å¥ãªèŠæ±ã«ãã£ãŠããã©ã«ããã³ãã«ãä»ããŠéä¿¡ãããããŸããŸãªèšè¿°åã䜿çšãããŸãã ãããã¯ãã¹ãŠã®æšæºãç¹å®ã®ã¯ã©ã¹ã®ããã€ã¹ã«ç¹åãããã®ããŸãã¯ç¬èªã®ãã®ã§ãã
èšè¿°åã¯ãlsusbãªã©ã®ãŠãŒãã£ãªãã£ã§è¡šç€ºã§ããéå±€ãæ§æããŸãã æäžéšã«ã¯ããã€ã¹èšè¿°åãããããã³ããŒIDïŒVIDïŒãšè£œåIDïŒPIDïŒãå«ãŸããŠããŸãã ãã®ãã¢ã¯ããã€ã¹ããšã«åºæã§ãããã·ã¹ãã äžã§é©åãªãã©ã€ããŒãæ€åºãããŸãã ããã€ã¹ã«ã¯ããã€ãã®æ§æããããããããã«ç¬èªã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒMFPã®ããªã³ã¿ãŒãã¹ãã£ããŒãFAXãªã©ïŒããããŸãã ãã ããéåžžã¯ã1ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæã€1ã€ã®æ§æãå®çŸ©ãããŸãã ãããã¯ã察å¿ããèšè¿°åã«ãã£ãŠèšè¿°ãããŸãã åãšã³ããã€ã³ãã«ã¯ãã¢ãã¬ã¹ïŒçªå·ïŒãæ¹åïŒå
¥åãŸãã¯åºåïŒãããã³äŒéã¿ã€ããå«ãèšè¿°åããããŸãã
ã¯ã©ã¹ä»æ§ã«ã¯ç¬èªã®èšè¿°åã¿ã€ãããããŸãã USB HIDä»æ§ã§ã¯ãå¶åŸ¡ãããã¡ãŸãã¯å²ã蟌ã¿ãä»ããŠéåä¿¡ããããã¬ããŒããã®åœ¢åŒã§ã®ããŒã¿è»¢éãæ³å®ãããŠããŸãã ãããã®èšè¿°åã¯ãã¬ããŒãã®åœ¢åŒïŒããšãã°ãã1ãã£ãŒã«ã8ãããé·ãïŒãšãã®äœ¿çšæ¹æ³ïŒãXæ¹åã®ãªãã»ãããïŒã決å®ããŸãã ãããã£ãŠãHIDããã€ã¹ã¯ããèªäœãèšè¿°ãããŠãããŒãµã«ãã©ã€ããŒïŒLinuxã§ã¯usbhidïŒã§ãµããŒãã§ããŸãã ãã以å€ã®å Žåã¯ãããŠã¹ããšã«ç¬èªã®ãã©ã€ããŒãäœæããå¿
èŠããããŸãã
æ°çŸããŒãžã®ä»æ§ãæ°æ®µèœã§èª¬æããããšã¯ããŸããã
www.beyondlogic.org/usbnutshellããç¡æã§O'Reillyã®æ¬ãUSB in a Nutshellãã«éä¿¡ããããšã«èå³ããããŸãã ãã£ãšè¯ãããŸãããã
èš±å¯ã«ã€ããŠ
ããã©ã«ãã§ã¯ãUSBããã€ã¹ã¯ã«ãŒãå
ããã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã ãã®æ¹æ³ã§ãã¹ãããã°ã©ã ãå®è¡ããªãããã«ããã«ã¯ãudevã«ãŒã«ãè¿œå ããŸãã
SUBSYSTEM=="usb", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0702", GROUP="INSERT_HERE", MODE="0660"
ãŠãŒã¶ãŒãå±ããã°ã«ãŒãã®ååãæ¿å
¥ããããã/lib/udev/rules.d/99-usbcar.rulesã«è¿œå ããŸãã
ãã³ãããã®äž
USBçµç±ã§ãã·ã³ãã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã lsusbã¯ãããã€ã¹ãã«ãŠã³ãããèšè¿°åããã³ãŒãããããã®ããŒã«ã§ãã usbutilsã«å«ãŸããŠããŸãã
[val@y550p ~]$ lsusb Bus 002 Device 036: ID 0a81:0702 Chesen Electronics Corp. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ...
ãã·ã³ã¯ããã€ã¹036ã§ãïŒç¢ºãã«ãåæããŠlsusbãå床å®è¡ã§ããŸãïŒã IDãã£ãŒã«ãã¯ãVIDãšPIDã®ãã¢ã§ãã èšè¿°åãèªã¿åãã«ã¯ãlsusb -vãå®è¡ããŸãã
[val@y550p ~]$ lsusb -vd 0a81:0702 Bus 002 Device 036: ID 0a81:0702 Chesen Electronics Corp. Device Descriptor: idVendor 0x0a81 Chesen Electronics Corp. idProduct 0x0702 ... bNumConfigurations 1 Configuration Descriptor: ... Interface Descriptor: ... bInterfaceClass 3 Human Interface Device ... iInterface 0 HID Device Descriptor: ... Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: ... bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt ...
æšæºéå±€ã ã»ãšãã©ã®ããã€ã¹ãšåæ§ã«ãæ§æãšã€ã³ã¿ãŒãã§ãŒã¹ã¯1ã€ã ãã§ãã 1ã€ã®ãšã³ããã€ã³ãå²ã蟌ã¿ãçºçããå ŽåããããŸãïŒããã©ã«ããã€ã³ã0ã¯äŸå€ã§ããããã©ã«ããã€ã³ã0ã¯åžžã«ååšããããããªã¹ãã«è¡šç€ºãããŸããïŒã bInterfaceClassãã£ãŒã«ãã¯ããããHIDããã€ã¹ã§ããããšãå ±åããŸãã ããã¯è¯ãããšã§ã-HIDãšéä¿¡ããããã®ãããã³ã«ã¯éããŠããŸãã ã¬ããŒãã®åœ¢åŒãšäœ¿çšæ³ãç解ããããã«ã¬ããŒãã®èšè¿°åãèªãããã«æããŸãããããã¯åé¡ã§ãã ãã ãã** UNAVAILABLE **ãšããŒã¯ãããŠããŸãã FAQïŒ ãã·ã³ã¯HIDããã€ã¹ã§ãããããusbhidãã©ã€ããŒã¯ãããèªåèªèº«ã«å²ãåœãŠãŸãããããããã©ããããã¯ããããŸããã 圌ãããã管çããã®ã解ãå¿
èŠããããŸãã
ãŸãããã¹ã®ã¢ãã¬ã¹ãèŠã€ããå¿
èŠããããŸãã åæ¥ç¶ããŠãdmesgãå®è¡ããŸã| grep usbãããã³usb XY.Zã§å§ãŸãæåŸã®è¡ãèŠãŠãã ããã XãYãããã³Zã¯ããã¹ãäžã®ããŒããäžæã«èå¥ããæŽæ°ã§ãã 次ã«å®è¡ãã
[root@y550p ~]
1.0ã¯ãusbhidãã©ã€ããŒããªãªãŒã¹ããæ§æãšã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ãã¹ãŠãçµã³ã€ããã«ã¯ã/ sys / bus / usb / drivers / usbhid / bindã«åãããšãæžããŸãã
ããã§ãã¬ããŒãèšè¿°åãã£ãŒã«ãããæ
å ±ãåŸãããŸãã
Report Descriptor: (length is 52) Item(Global): Usage Page, data= [ 0xa0 0xff ] 65440 (null) Item(Local ): Usage, data= [ 0x01 ] 1 (null) ... Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2 ... Item(Global): Report Size, data= [ 0x08 ] 8 Item(Global): Report Count, data= [ 0x01 ] 1 Item(Main ): Output, data= [ 0x02 ] 2 ...
2ã€ã®ã¬ããŒããæäŸãããŸãã 1ã€ã¯ããã€ã¹ããèªã¿åãïŒå
¥åïŒã2ã€ç®ã¯æžã蟌ã¿ïŒåºåïŒã§ãã äž¡æ¹ãšããã€ããµã€ãºã§ãã ãã ãããããã®äœ¿çšã¯æããã§ã¯ãããŸããã æ¯èŒã®ããã«ãããŠã¹ã®ã¬ããŒãèšè¿°åã¯æ¬¡ã®ããã«ãªããŸãïŒãã¹ãŠã§ã¯ãªããäž»èŠãªè¡ïŒã
Report Descriptor: (length is 75) Item(Global): Usage Page, data= [ 0x01 ] 1 Generic Desktop Controls Item(Local ): Usage, data= [ 0x02 ] 2 Mouse Item(Local ): Usage, data= [ 0x01 ] 1 Pointer Item(Global): Usage Page, data= [ 0x09 ] 9 Buttons Item(Local ): Usage Minimum, data= [ 0x01 ] 1 Button 1 (Primary) Item(Local ): Usage Maximum, data= [ 0x05 ] 5 Button 5 Item(Global): Report Count, data= [ 0x05 ] 5 Item(Global): Report Size, data= [ 0x01 ] 1 Item(Main ): Input, data= [ 0x02 ] 2
ããã§ã¯ãã¹ãŠãæ確ã§ãã ã¿ã€ãã©ã€ã¿ãŒã§ã¯-ããã¯æ確ã§ã¯ãªããç§ãã¡èªèº«ã§ãããã䜿çšããããšãæšæž¬ããå¿
èŠããããŸãã
å°ããŒãã¹
ã»ãšãã©ã®ã©ãžã³ã³ç©å
·ã¯ã·ã³ãã«ã§ãåãåšæ³¢æ°ã§åäœããæšæºçãªåä¿¡æ©ã䜿çšããŠããŸãã ãããã£ãŠããã®ããã°ã©ã ã䜿çšããŠããã®ãã·ã³ä»¥å€ã®ä»ã®ããã¡ããå¶åŸ¡ã§ããŸãã
æ¢åµã®ä»äº
ãããã¯ãŒã¯ãã©ãã£ãã¯ãåæããå Žåãã¹ããã¡ãŒã䜿çšãããŸãã ãããŠãç§ãã¡ã®å Žåããã®ãããªããšã䟿å©ã«ãªããŸãã åçšå©çšã®ããã®ç¹å¥ãªUSBã¢ãã¿ãŒããããŸãããWiresharkãç§ãã¡ã®ã¿ã¹ã¯ã«é©ããŠããŸãã
Wiresharkã§USBã€ã³ã¿ãŒã»ãããèšå®ããŸãã ãŸããã«ãŒãã«ã§USBç£èŠãæå¹ã«ããŸãã usbmonã¢ãžã¥ãŒã«ãããŠã³ããŒãããŸãã
[root@y550p ~]
ç¹å¥ãªdebugfsãã¡ã€ã«ã·ã¹ãã ãããŠã³ãããŸãã
[root@y550p ~]
/ sys / kernel / debug / usb / usbmonãã£ã¬ã¯ããªã衚瀺ãããŸããããã¯ãåçŽãªã·ã§ã«ããŒã«ã䜿çšããŠãã©ãã£ãã¯ãèšé²ããããã«äœ¿çšã§ããŸãã
[root@y550p ~]
æå·åãããååã®ãã¡ã€ã«ããããŸãã æŽæ°-ãã¹çªå·ïŒUSBãã¹ã¢ãã¬ã¹ã®æåã®éšåïŒ; 0ã¯ããã¹ãäžã®ãã¹ãŠã®ãã¹ãæå³ããŸãã s-çµ±èšãt-転éãu-URBïŒé²è¡äžã®ãã©ã³ã¶ã¯ã·ã§ã³ãè¡šãUSBèŠæ±ãããã¯è«çãšã³ãã£ãã£ïŒã ãã¹2ã®ãã¹ãŠã®è»¢éãä¿åããã«ã¯ã次ã®ããã«å
¥åããŸãã
[root@y550p ~]
èšç·ŽãããŠããªãç®ã§ã¯ãããã§ã¯äœãæ確ã§ã¯ãããŸããã WiresharkãããŒã¿ããã³ãŒãããã®ã¯è¯ãããšã§ãã
次ã«ãå
ã®ãã©ã€ããŒã§åäœããWindowsãå¿
èŠã§ãã VirtualBoxã«ãã¹ãŠãã€ã³ã¹ããŒã«ããã®ãæé©ã§ãïŒUSBãµããŒããå¿
èŠãªãããOracle Extension Packã䜿çšïŒã VirtualBoxãããã€ã¹ã䜿çšã§ããããšã確èªããWindowsã§ãã·ã³ãå¶åŸ¡ããKeUsbCarãå®è¡ããŸãã Wiresharkãèµ·åããŠããã©ã€ããŒãããã€ã¹ã«éä¿¡ããã³ãã³ãã確èªããŸãã æåã®ç»é¢ã§ãusbmonXã€ã³ã¿ãŒãã§ãŒã¹ãéžæããŸããXã¯ãã·ã³ãæ¥ç¶ãããŠãããã¹ã§ãã ã«ãŒãã®å€éšããWiresharkãå®è¡ããå Žåã¯ãããŒã/ dev / usbmon *ã«é©åãªæš©éãããããšã確èªããŠãã ããã

KeUsbCarã®[é²ã]ãã¿ã³ãã¯ãªãã¯ããŸãã Wiresharkã¯ãããã€ãã®çºä¿¡å¶åŸ¡ãã±ãããååããŸãã ã¹ã¯ãªãŒã³ã·ã§ããã¯å¿
èŠãªãã®ã瀺ããŠããŸãã ãã©ã¡ãŒã¿ãŒããå€æãããšãããã¯SET_REPORTèŠæ±ïŒbmRequestType = 0x21ãbRequest = 0x09ïŒã§ãããéåžžã¯ããŒããŒãã®é»çãªã©ã®ããã€ã¹ã®ã¹ããŒã¿ã¹ãå€æŽããããã«äœ¿çšãããŸãã 確èªããã¬ããŒãèšè¿°åã«ãããšãããŒã¿é·ã¯1ãã€ãã§ãã¬ããŒãèªäœã«ã¯0x01ãå«ãŸããŠããŸãïŒããã匷調衚瀺ãããŠããŸãïŒã
å³ãã¿ã³ãæŒããšãåæ§ã®ã¯ãšãªãå®è¡ãããŸãã ãã ããã¬ããŒãã«ã¯ãã§ã«0x02ãå«ãŸããŠããŸãã ããã¯ç§»åã®æ¹åãæå³ãããšæšæž¬ã§ããŸãã åæ§ã«ã0x04ãå³éã0x08ãéãªã©ã§ããããšãããããŸãã ã«ãŒã«ã¯åçŽã§ããæ¹åã³ãŒãã¯ãKeUsbCarã€ã³ã¿ãŒãã§ãŒã¹ã®ãã¿ã³ã®äœçœ®ã§å·Šã«ã·ãããããã€ããªåäœã§ãïŒæèšåãã«ã«ãŠã³ãããå ŽåïŒã
ãšã³ããã€ã³ã1ããã®å®æçãªå²ã蟌ã¿èŠæ±ã«æ³šæããããšãã§ããŸãïŒ0x81ã0x80ã¯ããããšã³ããªãã€ã³ãã§ããããšãæå³ãã0x01ã¯ãã®ã¢ãã¬ã¹ã§ãïŒã ããã¯äœã§ãã ãã¿ã³ã«å ããŠãKeUsbCarã«ã¯å
é»ã€ã³ãžã±ãŒã¿ããããããããã¯ããããªãŒæ
å ±ã§ããå¯èœæ§ããããŸãã è»ãã¬ã¬ãŒãžãé¢ããªãå Žåããããã®å€ã¯å€åããŸããïŒ0x05ïŒã ãã以å€ã®å Žåãå²ã蟌ã¿èŠæ±ã¯çºçããŸããããå
ã«æ»ããšåéãããŸãã ãããŠãã©ãããã0x05ã¯ãå
é»ããæå³ããŸãïŒããã¡ãã¯ç°¡åãªã®ã§ãå
é»ã¬ãã«ã¯éä¿¡ãããŸããïŒã ããããªãŒãå
é»ããããšãå²ã蟌ã¿ã¯0x85ïŒ7ããããèšå®ããã0x05ïŒãè¿ãå§ããŸãã ã©ãããã7ãããã¯ãå
é»æžã¿ããæå³ããŸãã 0x05ãæ§æããããã0ãš2ã®åäœã¯ãŸã æ確ã§ã¯ãããŸããã
ã»ãšãã©æ¬ç©ã®ãã©ã€ããŒãæžã
以åã¯ãµããŒããããŠããªãã£ãããã€ã¹ã§ããã°ã©ã ãåäœãããããšã¯è¯ãããšã§ãããå Žåã«ãã£ãŠã¯ã·ã¹ãã ã®æ®ãã®éšåãåäœãããå¿
èŠããããŸãã ã€ãŸãããã©ã€ããŒãäœæããå¿
èŠããããããã«ã¯ã«ãŒãã«ã¬ãã«ïŒhttp://www.linuxvoice.com/be-a-kernel-hacker/ïŒã§ã®ããã°ã©ãã³ã°ãå¿
èŠã§ãããä»ã§ã¯ã»ãšãã©å¿
èŠãããŸããã ããããUSBã«ã€ããŠè©±ããŠããå Žåã¯ããããããããªãã§ãå®è¡ã§ããŸãã
USBãããã¯ãŒã¯ã«ãŒããããå ŽåãTUN / TAPã䜿çšããŠPyUSBããã°ã©ã ãLinuxãããã¯ãŒã¯ã¹ã¿ãã¯ã«æ¥ç¶ã§ããŸãã TUN / TAPã€ã³ã¿ãŒãã§ãŒã¹ã¯ãtun0ãtap1ã®ãããªååãæã€éåžžã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®ããã«æ©èœããŸãããããããéããŠããã¹ãŠã®ããã±ãŒãžã/ dev / net / tunããŒãã§å©çšå¯èœã«ãªããŸãã pytunã¢ãžã¥ãŒã«ã䜿çšãããšãTUN / TAPãç°¡åã«æäœã§ããŸãã ããã©ãŒãã³ã¹ã¯äœäžããŸãããlibusbã䜿çšããŠCããã°ã©ã ãæžãæããããšãã§ããŸãã
å¥ã®åè£ã¯USBãã£ã¹ãã¬ã€ã§ãã Linuxã«ã¯ã/ dev / fbXãªã©ã®ãã¬ãŒã ãããã¡ãŒã«ã¢ã¯ã»ã¹ã§ããvfbã¢ãžã¥ãŒã«ããããŸãã ioctlã䜿çšããŠã³ã³ãœãŒã«ãã³ã³ãœãŒã«ã«ãªãã€ã¬ã¯ããã/ dev / fbXã®ã³ã³ãã³ããUSBããã€ã¹ã«ã¢ããããŒãã§ããŸãã ãããé«éã§ã¯ãããŸããããUSBçµç±ã§3Dã·ã¥ãŒãã£ã³ã°ã²ãŒã ããã¬ã€ããäºå®ã¯ãããŸããã
ã³ãŒããæžã
Windowsçšãšåãããã°ã©ã ãäœããŸãããã 6æ¬ã®ç¢å°ãšããã·ã³ã®å
é»äžã«ç¹æ»
ããå
é»ã¬ãã«ã ã³ãŒãã¯githubã«ãããŸã
github.com/vsinitsyn/usbcar.pyLinuxã§USBã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ãlibusbã©ã€ãã©ãªã䜿çšããŠãŠãŒã¶ãŒç©ºéããå®è¡ã§ããŸãã Cã§æžãããŠãããUSBã®ååãªç¥èãå¿
èŠã§ãã ç°¡åãªä»£æ¿æ段ã¯PyUSBã§ãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãPyGameã䜿çšããŸããã
github.com/walac/pyusbããPyUSBãœãŒã¹ãããŠã³ããŒãããsetup.pyã§ã€ã³ã¹ããŒã«ããŸãã libusbã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ãã·ã³ãå¶åŸ¡ããæ©èœããUSBCarãšããå
ã®ååã®ã¯ã©ã¹ã«å
¥ããŸããã
import usb.core import usb.util class USBCar(object): VID = 0x0a81 PID = 0x0702 FORWARD = 1 RIGHT = 2 REVERSE_RIGHT = 4 REVERSE = 8 REVERSE_LEFT = 16 LEFT = 32 STOP = 0
2ã€ã®ã¡ã€ã³PyUSBã¢ãžã¥ãŒã«ãã€ã³ããŒããããã©ãã£ãã¯ã衚瀺ãããšãã«èšç®ãããã·ã³ãå¶åŸ¡ããããã®å€ãæ¿å
¥ããŸãã VIDããã³PIDã¯ãlsusbåºåããååŸãããã·ã³IDã§ãã
def __init__(self): self._had_driver = False self._dev = usb.core.find(idVendor=USBCar.VID, idProduct=USBCar.PID) if self._dev is None: raise ValueError("Device not found")
usb.core.findïŒïŒé¢æ°ã¯ãIDã§ããã€ã¹ãæ€çŽ¢ããŸãã 詳现ã«ã€ããŠã¯ã
github.com / walac / pyusb / blob / master / docs / tutorial.rstãã芧ãã ãã
if self._dev.is_kernel_driver_active(0): self._dev.detach_kernel_driver(0) self._had_driver = True
lsusbã§è¡ã£ãããã«ãã«ãŒãã«ãã©ã€ããŒã解ããŸãã 0-ã€ã³ã¿ãŒãã§ãŒã¹çªå·ã ããã°ã©ã ãçµäºãããšãã¢ã¯ãã£ãã§ãã£ãå Žåã¯ããªãªãŒã¹ïŒïŒã§ãã€ã³ããçŽãå¿
èŠããããŸãã ãããã£ãŠãself._had_driverã®åæç¶æ
ãèŠããŠããŸãã
self._dev.set_configuration()
æ§æãå®è¡ããŸãã ãã®ã³ãŒãã¯ãPyUSBãããã°ã©ãããé ããŠãã次ã®ã³ãŒããšåçã§ãã
self._dev.set_configuration(1) usb.util.claim_interface(0) def release(self): usb.util.release_interface(self._dev, 0) if self._had_driver: self._dev.attach_kernel_driver(0)
ãã®ã¡ãœããã¯ãããã°ã©ã ãçµäºããåã«åŒã³åºãå¿
èŠããããŸãã 䜿çšæžã¿ã®ã€ã³ã¿ãŒãã§ã€ã¹ã解æŸããã«ãŒãã«ãã©ã€ããŒãæ¥ç¶ãçŽããŸãã
æ©æ¢°ã®åãïŒ
def move(self, direction): ret = self._dev.ctrl_transfer(0x21, 0x09, 0x0200, 0, [direction]) return ret == 1
directionã¯ãã¯ã©ã¹ã®æåã«å®çŸ©ãããå€ã®1ã€ã§ãã ctrl_transferïŒïŒã¯å¶åŸ¡ã³ãã³ããæž¡ããŸãã ããŒã¿ã¯æååãŸãã¯ãªã¹ããšããŠéä¿¡ãããŸãã ãã®ã¡ãœããã¯ãæžã蟌ãŸãããã€ãæ°ãè¿ããŸãã 1ãã€ããããªãããããã®å Žåã¯Trueãè¿ããããã§ãªãå Žåã¯Falseãè¿ããŸãã
ããããªãŒç¶æ
ã®æ¹æ³ïŒ
def battery_status(self): try: ret = self._dev.read(0x81, 1, timeout=self.READ_TIMEOUT) if ret: res = ret.tolist() if res[0] == 0x05: return 'charging' elif res[0] == 0x85: return 'charged' return 'unknown' except usb.core.USBError: return 'out of the garage'
readïŒïŒã¡ãœããã¯ããšã³ããã€ã³ãã¢ãã¬ã¹ãšèªã¿åããã€ãæ°ãåãå
¥ããŸãã 転éã®ã¿ã€ãã¯ãšã³ããã€ã³ãã«ãã£ãŠæ±ºå®ãããèšè¿°åã«ä¿åãããŸãã ãŸããããã°ã©ã ãããéãåäœããããã«ãéæšæºã®ã¿ã€ã ã¢ãŠãæéãèšå®ããŸãã Device.readïŒïŒã¯ããªã¹ãã«å€æããé
åãè¿ããŸãã æåã®ãã€ãããã§ãã¯ããŠãå
é»ã¹ããŒã¿ã¹ãå€æããŸãã ãã·ã³ãã¬ã¬ãŒãžã«ãªãå ŽåãreadïŒïŒåŒã³åºãã¯å€±æããusb.core.USBErrorãšã©ãŒãã¹ããŒãããŸãã ãã®ãšã©ãŒã¯ãŸãã«ããã«ãããã®ãšæ³å®ããŠããŸãã ãã®ä»ã®å Žåããäžæãã®ã¹ããŒã¿ã¹ãè¿ããŸãã
UIã¯ã©ã¹ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã«ãã»ã«åããŸãã äž»ãªãã®ãèŠãŠãããŸãããã ã¡ã€ã³ã«ãŒãã¯UI.main_loopïŒïŒã«ãããŸãã èæ¯ãåçã§èšå®ãããã·ã³ãã¬ã¬ãŒãžã«ããå Žåã¯å
é»ã¬ãã«ã衚瀺ããã³ã³ãããŒã«ãã¿ã³ãæç»ããŸãã 次ã«ãã€ãã³ããåŸ
ã¡ãŸã-ã¯ãªãã¯ã®å ŽåãUSBCar.moveïŒïŒãä»ããŠãã·ã³ãæå®ã®æ¹åã«ç§»åããŸãã
GUIãå«ãããã°ã©ã å
šäœã¯ã200è¡åŒ·ãå ããŸãã ããã¥ã¡ã³ãã®ãªãããã€ã¹ã«ãšã£ãŠã¯æªããããŸããã
ãã¡ãããããªãåçŽãªããã€ã¹ãå
·äœçã«åãäžããŸããã ããããäžçã«ã¯ç§ãã¡ã®ããã€ã¹ã«äŒŒãããã€ã¹ãããªãå€ããããå€ãã¯ç§ãã¡ãåãäžãããã®ãšããŸãå€ãããªããããã³ã«ã䜿çšããŠããŸãã è€éãªããã€ã¹ã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããããåä¿¡ããé»åã¡ãŒã«ãå ±åããããã€ã¹ãªã©ãLinuxãµããŒãã«ããã€ãã®è£
身å
·ãè¿œå ã§ããããã«ãªããŸããã ãããããŸã圹ã«ç«ããªãå Žåã¯ãå°ãªããšãèå³æ·±ãã§ãã