формат / dev / input / event *? - PullRequest
       5

формат / dev / input / event *?

27 голосов
/ 21 февраля 2011

Каков «формат» символьных устройств, расположенных в /dev/input/event*?Другими словами, как я могу декодировать поток символов?Пример с питоном был бы очень признателен.

Я гуглял как сумасшедший, но безрезультатно ... пожалуйста, помогите.

Ответы [ 5 ]

35 голосов
/ 22 мая 2013

Простой и сырой читатель может быть просто сделан, используя:

#!/usr/bin/python
import struct
import time
import sys

infile_path = "/dev/input/event" + (sys.argv[1] if len(sys.argv) > 1 else "0")

#long int, long int, unsigned short, unsigned short, unsigned int
FORMAT = 'llHHI'
EVENT_SIZE = struct.calcsize(FORMAT)

#open file in binary mode
in_file = open(infile_path, "rb")

event = in_file.read(EVENT_SIZE)

while event:
    (tv_sec, tv_usec, type, code, value) = struct.unpack(FORMAT, event)

    if type != 0 or code != 0 or value != 0:
        print("Event type %u, code %u, value %u at %d.%d" % \
            (type, code, value, tv_sec, tv_usec))
    else:
        # Events with code, type and value == 0 are "separator" events
        print("===========================================")

    event = in_file.read(EVENT_SIZE)

in_file.close()
21 голосов
/ 21 февраля 2011

Формат описан в файле Documentation/input/input.txt в источнике Linux. В основном вы читаете из файла структуры следующей формы:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

type и code - значения, определенные в linux/input.h. Например, тип может быть EV_REL для относительного момента мыши или EV_KEY для нажатие клавиши, и code - это код клавиши, или REL_X или ABS_X для мышь.

11 голосов
/ 21 февраля 2011

прямо здесь, в модуле Input.py .Вам также понадобится модуль event.py .

9 голосов
/ 19 мая 2012

Пакет python-evdev обеспечивает привязки к интерфейсу устройства события.Краткий пример использования:

from evdev import InputDevice
from select import select

dev = InputDevice('/dev/input/event1')

while True:
   r,w,x = select([dev], [], [])
   for event in dev.read():
       print(event)

# event at 1337427573.061822, code 01, type 02, val 01
# event at 1337427573.061846, code 00, type 00, val 00

Имейте в виду, что, в отличие от упомянутых выше очень удобных, чисто питонических модулей, evdev содержит расширения C.Для их сборки необходимо, чтобы у вас были установлены python-разработка и заголовки ядра.

6 голосов
/ 21 февраля 2011

Данные представлены в виде input_event структур;см. http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/ для примера C.Определение структуры находится в (например) http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/input.h?v=2.6.11.8. Обратите внимание, что вам нужно будет использовать кучу вызовов ioctl для получения информации об устройстве перед чтением с него.

...