位于/dev/input/event*
的角色设备的“格式”是什么?换句话说,我该如何解码字符流?非常感谢python示例。
我一直在谷歌搜索疯狂无济于事......请帮助。
答案 0 :(得分:33)
一个简单的原始读者可以使用:
完成#!/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()
答案 1 :(得分:21)
该格式在Linux源代码的Documentation/input/input.txt
文件中描述。基本上,您从文件中读取以下形式的结构:
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
鼠标。
答案 2 :(得分:11)
答案 3 :(得分:9)
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
请记住,与目前提到的非常方便,纯粹的pythonic模块不同,evdev包含C扩展。构建它们需要安装python开发和内核头文件。
答案 4 :(得分:6)
数据采用input_event
结构的形式;有关C示例,请参阅http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/。结构定义位于(例如)http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/input.h?v=2.6.11.8。请注意,在阅读设备之前,您需要使用一堆ioctl
次调用来获取有关设备的信息。