PyUSB 1.0 рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ :
рдпрд╣ PyUSB 1.0 рдореИрдиреБрдЕрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ
рдпрд╣ рдЧрд╛рдЗрдб PyUSB рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд▓реНрджреА рд╕реЗ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд╛рд▓рдХ рдЧрд╛рдЗрдб рдХреЗ рдореБрдЦреНрдп рд▓реЗрдЦрдХ рд╣реИрдВред

рдореБрдЭреЗ рдЕрдкрдирд╛ рдкрд░рд┐рдЪрдп рджреЛ


PyUSB 1.0 рдПрдХ рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ USB рдХреА рдЖрд╕рд╛рди рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред PyUSB рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  • рдкрд╛рдпрдерди рдореЗрдВ 100% рд▓рд┐рдЦрд╛:
    0.x рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ, рд╕рдВрд╕реНрдХрд░рдг 1.0 рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реА рдЕрдиреБрднрд╡ рдХреЗ рдмреЗрд╣рддрд░ рдкреНрдпреВрд╕ рдмреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рддрдЯрд╕реНрдерддрд╛:
    рд╕рдВрд╕реНрдХрд░рдг 1.0 рдореЗрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб рдмреИрдХрдПрдВрдб рдпреЛрдЬрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред IBackend рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрди рджреЛ рдкрд░рддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред PyUSB libusb 0.1, libusb 1.0 рдФрд░ OpenUSB рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рдмреИрдХрдПрдВрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдкрдирд╛ рдмреИрдХреЗрдВрдб рдЦреБрдж рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
  • рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА:
    PyUSB рдХреЛ Python> = 2.4, ctypes рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрдо рд╕реЗ рдХрдо рд╕рдорд░реНрдерд┐рдд рдмреИрдХ-рдЗрди рдмреИрдХреЗрдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╕рд╛рджрдЧреА:
    USB рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХрднреА рдирд╣реАрдВ рд░рд╣рд╛! USB рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рдФрд░ PyUSB рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рдкреНрд░реАрд╕реЗрдЯ рд╣реИрдВред
  • Isochronous рдЧрд┐рдпрд░ рд╕рдорд░реНрдерди:
    рдпрджрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмреИрдХреЗрдВрдб рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ PyUSB рд╕рдордХрд╛рд▓рд┐рдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдпрджреНрдпрдкрд┐ PyUSB USB рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдХрдо рджрд░реНрджрдирд╛рдХ рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ USB рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рди рд╣реИред рдпрджрд┐ рдЖрдк USB рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ Jan Axelson рдХреА рдЙрддреНрдХреГрд╖реНрдЯ USB рдкреВрд░реНрдг рдкреБрд╕реНрддрдХ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдмрд╣реБрдд рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ!


рдХреМрди рд╣реИ рдХреМрди


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП PyUSB рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдВред рд╕рднреА PyUSB рдореЙрдбреНрдпреВрд▓ рдирд┐рдореНрди рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде USB рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реИрдВ:
рдореЙрдбреНрдпреВрд▓рд╡рд┐рд╡рд░рдг
рдХреЛрд░рдореБрдЦреНрдп USB рдореЙрдбреНрдпреВрд▓ред
utilрд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпред
рдирд┐рдпрдВрддреНрд░рдгрдорд╛рдирдХ рдкреНрд░рдмрдВрдзрди рдЕрдиреБрд░реЛрдзред
рд╡рд┐рд░рд╛рд╕рддрд╕рдВрд╕реНрдХрд░рдг 0.x рд╕рдВрдЧрддрддрд╛ рдкрд░рддред
рдмреИрдХрдПрдВрдбрдПрдХ рдмреИрдХрдкреИрдХ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмреИрдХрдПрдВрдб рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд░реНрдЬ рдХрд░реЗрдВ:

>>> import usb.core >>> dev = usb.core.find() 

рдЦреИрд░, рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдкрд░реАрдХреНрд╖рдг) рдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд (рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ) рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ:

  import usb.core import usb.util #    dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001) #   ? if dev is None: raise ValueError('Device not found') #   .  ,   #    dev.set_configuration() #    cfg = dev.get_active_configuration() intf = cfg[(0,0)] ep = usb.util.find_descriptor( intf, #     custom_match = \ lambda e: \ usb.util.endpoint_direction(e.bEndpointAddress) == \ usb.util.ENDPOINT_OUT) assert ep is not None #   ep.write('test') 

рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ PyUSB рдкреИрдХреЗрдЬ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреА рд╣реИрдВред usb.core рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдФрд░ usb.util рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдирд┐рдореНрди рдЖрджреЗрд╢ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреЛрдИ рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ред рдЕрдЧрд▓рд╛, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдиреЛрдЯ: рддрд░реНрдХреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рдХрдИ PyUSB рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╛рдпрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рд╣реИред

рдлрд┐рд░, рд╣рдо рдЙрд╕ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╛ рдкрддрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 dev.write(1, 'test') 

рдпрд╣рд╛рдВ рд╣рдо рдПрдбреНрд░реЗрд╕ 1 рдкрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ 'рдЯреЗрд╕реНрдЯ' рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?


PyUSB рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред рдорд╛рдирдХ рдкрд╛рдпрдерди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, PyUSB USB рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП usb.core.USBError рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЖрдк PyUSB рд▓реЙрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде PYUSB_DEBUG рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ: рдорд╣рддреНрд╡рдкреВрд░реНрдг , рддреНрд░реБрдЯрд┐ , рдЪреЗрддрд╛рд╡рдиреА , рдЬрд╛рдирдХрд╛рд░реА рдпрд╛ рдбреАрдмрдЧ ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рдВрджреЗрд╢ sys.stderr рдкрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ PYUSB_LOG_FILENAME рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорд╛рди рд╕рд╣реА рдкрде рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рд╡рд╣рд╛рдВ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рдЙрдиреНрд╣реЗрдВ sys.stderr рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред

рддреБрдо рдХрд╣рд╛рдБ рд╣реЛ


рдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЦреЛрдЬ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ 0xfffe рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рд╡рд┐рдХреНрд░реЗрддрд╛ ID рдФрд░ 0x0001 рдХрд╛ рдЙрддреНрдкрд╛рдж ID рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ:

 import usb.core dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001) if dev is None: raise ValueError('Our device is not connected') 

рдпрд╣ рд╕рдм рд╣реИ, рдлрд╝рдВрдХреНрд╢рди usb.core.Device рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдИ рдирд╣реАрдВ рд▓реМрдЯреЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдпреВрдПрд╕рдмреА рдкреНрд░рд┐рдВрдЯрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ? рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

 #      ,   if usb.core.find(bDeviceClass=7) is None: raise ValueError('No printer found') 

7 USB рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд┐рдВрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред рдУрд╣, рд░реБрдХреЛ, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдкреНрд░рд┐рдВрдЯрд░ рдХреЛ рдирдВрдмрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ:

 #     ... printers = usb.core.find(find_all=True, bDeviceClass=7) # Python 2, Python 3,     import sys sys.stdout.write('There are ' + len(printers) + ' in the system\n.') 

рдХреНрдпрд╛ рд╣реБрдЖ? рдЦреИрд░, рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордп ... рдЦреЛрдЬ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ find_all рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╛рд▓реНрд╕ рдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдЭреВрда рд╣реИ [рез] , рдкрд╣рд▓реЗ рдорд╛рдкрджрдВрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЦреЛрдЬреЗрдВрдЧреЗ (рд╣рдо рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)ред рдпрджрд┐ рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣реА рдорд╛рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рдирджрдВрдб рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╡рд╣ рд╕рдм рд╣реИ! рд╕рд░рд▓, рд╕рд╣реА?

рдХреНрдпрд╛ рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдирд╣реАрдВ! рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рд╣реИ: рдХрдИ рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдкреНрд░рд┐рдВрдЯрд░реЛрдВ рдХреЛ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ bInterfaceClass рдкрд░ рд╕реЗрдЯ рд╣реИред 7. рдпрджрд┐ рдЖрдк рдореЗрд░реА рддрд░рд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрдпрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрд░: рд╣рд╛рдВ, рд╡рд╣ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рднреА рдЬреБрдбрд╝реЗ рдкреНрд░рд┐рдВрдЯрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:

 import usb.core import usb.util import sys class find_class(object): def __init__(self, class_): self._class = class_ def __call__(self, device): #  ,   if device.bDeviceClass == self._class: return True # ,   ,   # ,     for cfg in device: # find_descriptor:  ? intf = usb.util.find_descriptor( cfg, bInterfaceClass=self._class ) if intf is not None: return True return False printers = usb.core.find(find_all=1, custom_match=find_class(7)) 

Custom_match рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдиреБрдЪрд┐рдд рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде custom_match рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 #   ,    : printers = usb.core.find(find_all=1, custom_match=find_class(7), idVendor=0xfffe) 

рдпрд╣рд╛рдВ рд╣рдо рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ 0xfffe рдХреЗ рдкреНрд░рд┐рдВрдЯрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

рдЕрдкрдирд╛ рд╡рд░реНрдгрди рдХреАрдЬрд┐рдП


рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдвреВрдВрдв рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╡реИрд╕реЗ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкреНрд░рдХрд╛рд░ ...
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ, рддреЛ рдЖрдк рдЙрдкрдХрд░рдг рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 >>> dev.bLength >>> dev.bNumConfigurations >>> dev.bDeviceClass >>> # ... 

рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 for cfg in dev: sys.stdout.write(str(cfg.bConfigurationValue) + '\n') 

рдЙрд╕реА рддрд░рд╣, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╡рд░рдгрдХ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 for cfg in dev: sys.stdout.write(str(cfg.bConfigurationValue) + '\n') for intf in cfg: sys.stdout.write('\t' + \ str(intf.bInterfaceNumber) + \ ',' + \ str(intf.bAlternateSetting) + \ '\n') for ep in intf: sys.stdout.write('\t\t' + \ str(ep.bEndpointAddress) + \ '\n') 

рдЖрдк рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдБ рд╣реИ:

 >>> #      >>> cfg = dev[1] >>> #      >>> intf = cfg[(0,0)] >>> #    >>> ep = intf[2] 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ 0. рд╕реЗ рдЧрд┐рдиреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ! рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╣реИ ... рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдХреНрд╕ рджреЛ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╣рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╣рдо cfg [(0,1)] рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЕрдм рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрд░реАрдХрд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ - рдПрдХ рдЙрдкрдпреЛрдЧреА find_descriptor рдлрд╝рдВрдХреНрд╢рдиред рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд┐рдВрдЯрд░ рдЦреЛрдЬ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВред find_descriptor рджреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде, рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  • find_descriptor рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд░реЛрдд рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЦреЛрдЬреЗрдВрдЧреЗ ред
  • рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмреИрдХреЗрдВрдб рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ [реи] ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ cfg рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдФрд░ рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ 1 рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рдХрд░реЗрдВрдЧреЗ:

 import usb.util alt = usb.util.find_descriptor(cfg, find_all=True, bInterfaceNumber=1) 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ find_descriptor usb.util рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП custom_match рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдХрдИ рд╕рдорд╛рди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВ

рдХрднреА-рдХрднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рджреЛ рд╕рдорд╛рди рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬреЛ USB рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВ: рдмрд╕ рдФрд░ рдкрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдмреИрдХрдПрдВрдб рд╕реЗ рдЖрддреА рд╣реИрдВ, рдФрд░ рдмреИрдХрдПрдВрдб рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗ рдХрд┐рд╕реА рднреА рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдбрд┐рд╡рд╛рдЗрд╕ рдмрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкрддреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВ рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдПрдХ рд╣реА idVendor рдФрд░ idProduct рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?


рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, USB рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдХреБрдЫ рдорд╛рдирдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдореИрдВрдиреЗ USB рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рд╡рд░реНрдгрдирдХрд░реНрддрд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЗрдВрдЯрд░рдлреЗрд╕, рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрди рд╕рднреА рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ... рдФрд░ рд╕рдмрд╕реЗ рдмреБрд░реА рдмрд╛рдд, рдЖрдк рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ: рдбрд┐рд╡рд╛рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдПрдХ рд╣реЛ! PyUSB рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ set_configuration рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реИ bConfigurationValue рд╣реИ ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдП рдЧрдП рджреЗрдЦрд╛ рдерд╛)ред рдЗрд╕рд▓рд┐рдП, PyUSB рдореЗрдВ, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдПрдХ set_configuration рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ bConfigurationValue рдлрд╝реАрд▓реНрдб 5 рд╣реИ [рей] , рдмрд╛рдж рдХреЗ рдкреНрд░рд╢реНрди рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ:

 >>> dev.set_configuration(5) #  >>> dev.set_configuration() #  ,   5 -  #  >>> cfg = util.find_descriptor(dev, bConfigurationValue=5) >>> cfg.set() #  >>> cfg = util.find_descriptor(dev, bConfigurationValue=5) >>> dev.set_configuration(cfg) 

рд╡рд╛рд╣! рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ set_configuration рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд╣рд╛рдВ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рднреА рд╣реИред

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рд╣реИ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдкред рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХреНрд░рд┐рдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдорд▓реНрдЯреАрдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд┐рдВрдЯрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдкреНрд░рд┐рдВрдЯрд░ рдФрд░ рдПрдХ рд╕реНрдХреИрдирд░ рджреЛрдиреЛрдВ рд╣реИред рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдПрдВ), рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд┐рдВрдЯрд░ рдФрд░ рд╕реНрдХреИрдирд░ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ 2 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВ: рдПрдХ рдкреНрд░рд┐рдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╕реНрдХреИрдирд░ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХрдВрдкреЛрдЬрд┐рдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдорд▓реНрдЯреАрдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд┐рдВрдЯрд░ рдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛: рдкреНрд░рддреНрдпреЗрдХ "рддрд╛рд░реНрдХрд┐рдХ" рдкрд░рд┐рдзреАрдп рдбрд┐рд╡рд╛рдЗрд╕ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ [рек] ред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдЖрдкрдиреЗ рдкреВрдЫрд╛ред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреЛрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ [рел] рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╕рдХреНрд░рд┐рдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, USB рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕рдордХрд╛рд▓рд┐рдХ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ [рем] , рддрд╛рдХрд┐ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдВ, рдПрдХ рджреВрд╕рд░реА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╕рдордХрд╛рд▓рд┐рдХ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЗрд╡рд▓ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ []] ред рдЖрдк set_interface_altsetting рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ:

 >>> dev.set_interface_altsetting(interface = 0, alternate_setting = 0) 

рдЪреЗрддрд╛рд╡рдиреА

USB рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП SET_INTERFACE рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рд╣реИрдВ рдпрд╛ рдпрд╣ SET_INTERFACE рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ set_interface_altsetting рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

 try: dev.set_interface_altsetting(...) except USBError: pass 

рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ_рд╕реЗрдЯрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ bInterfaceNumber рдФрд░ bAlternateSetting рдлрд╝реАрд▓реНрдб рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ ред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 >>> intf = find_descriptor(...) >>> dev.set_interface_altsetting(intf) >>> intf.set_altsetting() # !        

рдЪреЗрддрд╛рд╡рдиреА

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдХреНрд░рд┐рдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭрд╕реЗ рдмрд╛рдд рдХрд░реЛ рдордзреБ


рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдпреВрдПрд╕рдмреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреИрд╕реЗ рдХрд░реЗрдВред USB рдореЗрдВ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╣реИрдВ: рдмрд▓реНрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░, рдЗрдВрдЯрд░рдкреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░, рдЖрдЗрд╕реЛрдХреНрд░реЛрдирд╕ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ рдХрдВрдЯреНрд░реЛрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрддреНрд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ USB рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╣реИред

рдирд┐рдпрдВрддреНрд░рдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдПрдХрдорд╛рддреНрд░ рд╕реНрдЯреНрд░реАрдо рд╣реИ рдЬрд┐рд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдмрд╛рдХреА рдмрд╕ рдпреВрдПрд╕рдмреА рдмрд┐рдВрджреБ рд╕реЗ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдкреНрд░рд╡рд╛рд╣ рдЙрд╕реА рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЖрдк ctrl_transfer рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ (OUT) рдФрд░ рдЗрдирдХрдорд┐рдВрдЧ (IN) рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд╡рд╛рд╣ рдХреА рджрд┐рд╢рд╛ bmRequestType рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдкреИрд░рд╛рдореАрдЯрд░ ctrl_transfer рдирд┐рдпрдВрддреНрд░рдг рдЕрдиреБрд░реЛрдз рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред []] :

 >>> msg = 'test' >>> assert dev.ctrl_transfer(0x40, CTRL_LOOPBACK_WRITE, 0, 0, msg) == len(msg) >>> ret = dev.ctrl_transfer(0xC0, CTRL_LOOPBACK_READ, 0, 0, len(msg)) >>> sret = ''.join([chr(x) for x in ret]) >>> assert sret == msg 

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЕрдиреБрд░реЛрдз рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд▓реВрдкрдмреИрдХ рдкрд╛рдЗрдк рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдк CTRL_LOOPBACK_WRITE рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЖрдк CTRL_LOOPBACK_READ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╣рд▓реЗ рдЪрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ - bmRequestType , bmRequest , wValue рдФрд░ wIndex - рдХрдВрдЯреНрд░реЛрд▓ рд╕реНрдЯреНрд░реАрдо рдХреА рдорд╛рдирдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рдкрд╛рдВрдЪрд╡рд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рддреЛ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдбреЗрдЯрд╛ рд╣реИ рдпрд╛ рдЗрдирдХрдорд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрдврд╝реЗ рдЬрд╛ рд░рд╣реЗ рдбреЗрдЯрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП __in____ рд╡рд┐рдзрд┐ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрд┐рд╕реА рднреА (рдпрд╛ рдЖрдиреЗ рд╡рд╛рд▓реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ 0) рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдСрдкрд░реЗрд╢рди рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ, рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЗрдирдХрдорд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдиреНрдп рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдХреЗ рдкрддреЗ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рд▓реВрдкрдмреИрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ 1 рдкрд░ рдПрдХ рд▓реВрдкрдмреИрдХ рдкрд╛рдЗрдк рд╣реЛ:

 >>> msg = 'test' >>> assert len(dev.write(1, msg, 100)) == len(msg) >>> ret = dev.read(0x81, len(msg), 100) >>> sret = ''.join([chr(x) for x in ret]) >>> assert sret == msg 

рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВ - рдпрд╣ рдХреНрд░рдорд╢рдГ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдкрддрд╛ рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ (рд▓рд┐рдЦрдирд╛) рдпрд╛ рдкрдврд╝рдиреЗ (рдкрдврд╝рдиреЗ) рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдпрд╛ рддреЛ рдкрдврд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛, рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдмреАрдЯрд╛ 2 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд░реАрдб рдпрд╛ ctrl_transfer рдПрдХ рдРрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ array.itemsize рдХреЗ рдорд╛рди рдХреЗ рд╕рд░рдгреА рд╕рдордп рдХреА рд▓рдВрдмрд╛рдИ рд╣реЛрдЧреАред

Ctrl_transfer рдореЗрдВ , рдЯрд╛рдЗрдордЖрдЙрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдЬрдм рдЯрд╛рдЗрдордЖрдЙрдЯ рдЫреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Device.default_timeout рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдСрдкрд░реЗрд╢рдирд▓ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦреБрдж рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦреЗрдВ


рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, usb.control рдореЙрдбреНрдпреВрд▓ рдорд╛рдирдХ USB рдирд┐рдпрдВрддреНрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ usb.util рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ get_string рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╖рдп


рд╣рд░ рдорд╣рд╛рди рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдкреАрдЫреЗ рдПрдХ рдорд╣рд╛рди рдЕрд╣рд╕рд╛рд╕ рд╣реИ


рдкрд╣рд▓реЗ, рдХреЗрд╡рд▓ рд▓рд┐рдмрд╛рд╕ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж libusb 1.0 рдЖрдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 0.1 рдФрд░ 1.0 libusb рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдУрдкрдирдпреВрдПрд╕рдмреА рдмрдирд╛рдпрд╛ рдФрд░ рдЕрдм рд╣рдо рдпреВрдПрд╕рдмреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЯреЙрд╡рд░ рдСрдл рдмреЗрдмрд▓ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ [реп] ред PyUSB рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ? рдЦреИрд░, PyUSB рдПрдХ рд▓реЛрдХрддрд╛рдВрддреНрд░рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдХреМрди рд╕рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА USB рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PyUSB рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ред рдпрд╣ рдмреИрдХрдПрдВрдб рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмреИрдХрдПрдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмреИрдХрдПрдВрдб usb.backend.IBackend рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ USB рдЬрдВрдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдмрд┐рд▓реНрдЯ-рдЗрди рд▓рд┐рдмрд╛рд╕ 0.1, рд▓рд┐рдмрд╕рдм 1.0 рдФрд░ рдУрдкрдирдпреВрдПрд╕рдмреА рдмреИрдХрдПрдВрдб рд╣реИрдВред

рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдмреИрдХрдПрдВрдб рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ IBackend рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ usb.backend рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╕реНрд╡рд╛рд░реНрдереА рдордд рдмрдиреЛ


рдкрд╛рдпрдерди рдХреЗ рдкрд╛рд╕ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХрд╣рддреЗ рд╣реИрдВ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдпрд╣ рддрдп рдХрд░реЗрдЧреА рдХрд┐ рдореЗрдореЛрд░реА рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрдм рдЙрддрд╛рд░рдирд╛ рд╣реИред рд╣реБрдб рдХреЗ рддрд╣рдд, PyUSB рдЙрди рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрд╡реАрдХреГрдд рдХрд░рдирд╛, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛, рдЖрджрд┐) рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдкрд╛рдпрдерди рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рдирд╛рд╢ рдХреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрди рдХрдм рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐: рд╢реБрд▓реНрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, usb.util рдореЙрдбреНрдпреВрд▓ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдФрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреНрд▓реЗрдо_рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд░рд┐рд▓реАрдЬрд╝_рдЗрдирдлрд╝рд░реНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред claim_interface , . , . release_interface , . , . , libusb .

( ), dispose_resources . ( ) , find .


, тАФ , API USB. -, ctypes find_library() . Linux Unix- , find_library ( /sbin/ldconfig , gcc objdump ) .

/ , . , PyUSB find_library() .

:

 >>> import usb.core >>> import usb.backend.libusb1 >>> >>> backend = usb.backend.libusb1.get_backend(find_library=lambda x: "/usr/lib/libusb-1.0.so") >>> dev = usb.core.find(..., backend=backend) 

, find_library тАФ get_backend(), , .


API PyUSB (0.--), , , API. , , . PyUSB 1.0 usb.legacy . API API. ┬л , import usb import usb.legacy as usb ?┬╗, . тАФ , , . , import usb usb.legacy . тАФ .

,


, e-mail , . PyUSB .

[1] True False ( ), Python. (true) (false), Python, . ( . тАФ .. ) :

[2] .

[3] USB - . .

[4] , .

[5] , .

[6] , , .

[7] , .

[8] PyUSB 0. ( ).

[9] , . , .

Source: https://habr.com/ru/post/hi430528/


All Articles