Si vous utilisez Linux, la meilleure façon de distinguer les périphériques d'entrée est d'utiliser l'interface d'événement Linux. Une fois que l'entrée spécifique au matériel d'un périphérique est décodée, elle est convertie en une structure d'événement intermédiaire spécifique à Linux et rendue disponible en lisant un ou plusieurs des périphériques de caractères sous /dev/input/
. Ceci est complètement indépendant du langage de programmation que vous utilisez, soit dit en passant.
Chaque périphérique matériel obtient son propre /dev/input/eventX
périphérique, et il existe également des agrégats (par exemple, /dev/input/mice
qui représente le mouvement de toutes les souris du système). Votre système peut également avoir /dev/input/by-path
et /dev/input/by-id
.
Il y a un ioctl
appelé EVIOCGNAME
qui renvoie le nom de l'appareil sous la forme d'une chaîne lisible par l'homme, ou vous pouvez utiliser quelque chose comme /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse
.
Vous ouvrez l'appareil et chaque fois qu'un événement arrive du matériel d'entrée, vous obtenez un paquet de données. Si vous savez lire le C, vous pouvez étudier le fichier /usr/include/linux/input.h
qui montre exactement comment ce truc fonctionne. Si ce n'est pas le cas, vous pouvez lire cette question qui fournit toutes les informations dont vous avez besoin.
La bonne chose à propos de l'interface d'événement est que vous découvrez simplement de quel périphérique vous avez besoin et que vous pouvez lire l'entrée de ce périphérique d'entrée uniquement , ignorant tous les autres. Vous recevrez également des notifications sur les touches, les boutons et les commandes que vous n'obtiendriez pas normalement en lisant simplement le flux de caractères "cuit" à partir d'un terminal :même les touches mortes comme Maj , etc.
La mauvaise chose est que l'interface d'événement ne renvoie pas de caractères "cuisinés", elle utilise simplement des codes numériques pour les clés (les codes correspondant à chaque clé se trouvent dans le fichier d'en-tête susmentionné - mais aussi dans la source Python de event.py. Si votre périphérique d'entrée a des touches/boutons inhabituels, vous devrez peut-être expérimenter un peu jusqu'à ce que vous obteniez les bons chiffres.
Une approche alternative (si votre "clavier" n'a pas beaucoup de touches - de nombreux appareils prétendent être des claviers) consiste à appliquer un mappage de touches à chaque clavier spécifiquement et à s'assurer que les touches sont distinguées.
Ceci est décrit ici :https://superuser.com/questions/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only. Le point principal étant le setxkbmap
prend un argument de périphérique.
Si vous utilisez l'approche d'entrée brute, lsinput trouvera votre périphérique brut pour vous.