2016-12-10 1 views
6

J'ai écrit un script python qui interroge evdev pour un scanner de codes à barres HID (émule un clavier): le script fonctionne bien sur les plateformes Linux (Ubuntu). Existe-t-il un équivalent OS X Python pour evdev qui permettrait un portage mineur du script python existant?Python evdev equivalent pour OSX

Si vous possédez une expérience Python et que vous l'avez configurée pour une entrée de périphérique HID, veuillez l'indiquer dans votre réponse.

+0

Pas une réponse, mais j'ai trouvé [this] (http://www.signal11.us/oss/hidapi/) et la commande 'ioreg -rtn IOHIDKeyboard'. – Potatoswatter

+1

Avez-vous essayé https://github.com/apmorton/pyhidapi? – pigletfly

Répondre

2

Je suppose qu'il n'y a pas de port evdev pour mac os car le dernier dépend du noyau linux. Si vous voulez implémenter une logique métier sur un HID dans Mac OS, vous devez utiliser comme dans les commentaires suggérés une abstraction de haut niveau. Mais si vous voulez evdev sur le bas niveau, je pense que la façon facile de le faire using the Docker. Je n'ai aucune expérience avec les périphériques HID sur Mac OS, mais j'ai résolu le même problème avec l'autre pilote.

4

J'ai eu un test simple fonctionnant en utilisant cython-hidapi (installable comme pip install hidapi - notez ceci est différent de celui lié dans les commentaires mais semble être fonction semblable). J'avais également installé hidapi-devel de macports mais je ne suis pas sûr que cela soit nécessaire car il continue à fonctionner après la désactivation du port.

En modifiant l'exemple try.py utiliser le VID/PID d'un clavier sans fil USB Microsoft/périphérique de la souris comme suit

from __future__ import print_function 

import hid 
import time 

print("Opening the device") 

h = hid.device() 
h.open(1118, 2048) # A Microsoft wireless combo keyboard & mouse 

print("Manufacturer: %s" % h.get_manufacturer_string()) 
print("Product: %s" % h.get_product_string()) 
print("Serial No: %s" % h.get_serial_number_string()) 

try: 
    while True: 
     d = h.read(64) 
     if d: 
      print('read: "{}"'.format(d)) 
finally: 
    print("Closing the device") 
    h.close() 

Et en cours d'exécution avec $ sudo python try.py j'ai pu obtenir le résultat suivant:

Opening the device 
Manufacturer: Microsoft 
Product: Microsoft® Nano Transceiver v2.0 
Serial No: None 
read: "[0, 0, 0, 0, 0, 0, 0, 0]" 
read: "[0, 0, 0, 0, 0, 0, 0, 0]" 
read: "[0, 0, 0, 0, 0, 0, 0, 0]" 

--8<-- snip lots of repeated lines --8<-- 

read: "[0, 0, 0, 0, 0, 0, 0, 0]" 
read: "[0, 0, 0, 0, 0, 0, 0, 0]" 
read: "[0, 0, 21, 0, 0, 0, 0, 0]" 
read: "[0, 0, 21, 0, 0, 0, 0, 0]" 
read: "[0, 0, 21, 0, 0, 0, 0, 0]" 
read: "[0, 0, 21, 0, 0, 0, 0, 0]" 
read: "[0, 0, 0, 0, 0, 0, 0, 0]" 
read: "[0, 0, 4, 0, 0, 0, 0, 0]" 
read: "[0, 0, 4, 22, 0, 0, 0, 0]" 
read: "[0, 0, 4, 22, 0, 0, 0, 0]" 
read: "[0, 0, 4, 22, 0, 0, 0, 0]" 
read: "[0, 0, 4, 22, 0, 0, 0, 0]" 
read: "[0, 0, 4, 22, 0, 0, 0, 0]" 
read: "[0, 0, 4, 0, 0, 0, 0, 0]" 
read: "[0, 0, 4, 0, 0, 0, 0, 0]" 
read: "[0, 0, 4, 9, 0, 0, 0, 0]" 
read: "[0, 0, 4, 9, 0, 0, 0, 0]" 
read: "[0, 0, 4, 9, 0, 0, 0, 0]" 
read: "[0, 0, 4, 9, 0, 0, 0, 0]" 
read: "[0, 0, 4, 9, 7, 0, 0, 0]" 
read: "[0, 0, 4, 9, 7, 0, 0, 0]" 
read: "[0, 0, 7, 0, 0, 0, 0, 0]" 
^CClosing the device 
Traceback (most recent call last): 
    File "try.py", line 17, in <module> 
    d = h.read(64) 
KeyboardInterrupt 

Le périphérique particulier que j'utilise semble énumérer plusieurs périphériques HID pour la souris & souris parmi d'autres choses, donc il semble être un peu aléatoire que vous obtenez, mais pour un scanner de codes à barres ça devrait être plutôt simple.