Detecção de teclado do Ubuntu a partir do script bash

5

Desculpe a minha ignorância sobre problemas de SO / hardware do Linux ... Eu sou apenas um programador:)

Eu tenho um aplicativo que chama alguns scripts bash para iniciar aplicativos externos, neste caso o Firefox. O aplicativo é executado em um quiosque com capacidade de tela sensível ao toque. Ao iniciar o Firefox, eu também inicio um aplicativo de teclado virtual que permite ao usuário inserir o teclado.

No entanto, o quiosque também possui slots PS / 2 e USB que permitem que um usuário conecte um teclado. Se um teclado estivesse conectado, seria bom se eu não precisasse iniciar o teclado virtual e fornecer mais espaço na tela para a janela do Firefox.

Existe uma maneira de detectar se um teclado está plugado no script? Ele apareceria em / dev e, em caso afirmativo, apareceria em um local consistente? Faria diferença se o usuário usasse um teclado PS / 2 ou USB?

Obrigado!

    
por Ryan Brubaker 25.03.2010 / 17:02

5 respostas

2

Para um dispositivo USB, você pode usar lsusb e procurar um dispositivo de interface humana (classe de interface 3) com o protocolo de teclado (protocolo de interface 1), por exemplo,

$ lsusb -v
... loads of stuff deleted ...
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
... loads of stuff deleted ...

Além disso, você pode deixar udev ajudar você. Listar os dispositivos em /dev/input/by-path/ e os dispositivos de teclado terminam em -kdb (pelo menos no Ubuntu, onde as regras do udev especificam), por exemplo

$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2010-03-25 09:14 /dev/input/by-path/pci-0000:00:1a.2-usb-0:1:1.0-event-kbd -> ../event4

$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2009-08-29 09:46 /dev/input/by-path/platform-i8042-serio-0-event-kbd -> ../event1
    
por 25.03.2010 / 18:09
2

Para teclados USB, geralmente encontro o teclado simplesmente pesquisando a saída "lsusb -v" para a palavra "Keyboard":

lsusb -v 2>/dev/null | egrep '(^Bus|Keyboard)' | grep -B1 Keyboard

Exemplo de saída:

Bus 001 Device 004: ID 413c:2006 Dell Computer Corp. 
  bInterfaceProtocol      1 Keyboard

Um método mais genérico é pesquisar / sys / bus para qualquer dispositivo que seja bInterfaceClass 03 e bInterfaceProtocol 01. Como você precisa detectar dispositivos não-USB e deseja usar a saída em um script, esse método provavelmente funciona melhor para você:

grep -l 03 /sys/bus/*/*/*/bInterfaceClass |
sed 's/Class$/Protocol/' |
xargs grep -l 01 |
xargs dirname

Exemplo de saída:

/sys/bus/usb/devices/1-4.1:1.0

Advertência: Não consigo encontrar um teclado PS / 2 para testar esse script. Já que esse segmento tem mais de sete anos agora, acredito que o autor da pergunta original há muito já se mudou e não precisa mais da detecção de PS / 2. De qualquer forma, deixarei esta resposta na esperança de que alguém a ache útil, mas saiba que não testei isso com dispositivos não-USB.

    
por 08.06.2017 / 18:44
1

Um caminho seria fazer isso:

dmesg | grep keyboard

Você também pode usar Upstart e udev para detectar e agir sobre a presença de um teclado.

    
por 25.03.2010 / 17:10
0

Para USB, você pode procurar / sys / bus / usb / devices por um dispositivo com uma configuração com uma interface com a classe HID (0x03) e protocolo Keyboard (0x01).

Script de bash:

#!/bin/bash
for dev in /sys/bus/usb/devices/*-*:*
do
  if [ -f $dev/bInterfaceClass ]
  then
    if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat $dev/bInterfaceProtocol)" == "01" ]]
    then
      echo "Keyboard detected: $dev"
    fi
  fi
done
    
por 25.03.2010 / 18:30
0

Os teclados PS / 2 estão listados entre /sys/class/input devices. Teclados USB podem estar presentes também, porque o mouse abaixo é um USB:

$ grep "" /sys/class/input/*/name
/sys/class/input/input0/name:Power Button
/sys/class/input/input1/name:Power Button
/sys/class/input/input2/name:AT Translated Set 2 keyboard
/sys/class/input/input3/name:Microsoft Comfort Mouse 6000

$ grep keyboard /sys/class/input/*/name
/sys/class/input/input2/name

Outra descoberta é que os diretórios do teclado contêm subdiretórios para chaves de status:

$ ls -d /sys/class/input/*/*::capslock
/sys/class/input/input2/input2::capslock
    
por 07.01.2018 / 13:20