Несколько дискретных вводов с клавиатуры на одном компьютере

Фон:

В октябре я провожу большое мероприятие и планирую следить за тем, кто его посещает и где находятся люди в целях безопасности, используя систему, которая считывает карты mifare, которые есть у всех в моей организации. Для этого я нашел дешевый считыватель mifare, который считывает определенный сектор карты и возвращает данные в виде шестнадцатеричных данных, которые я могу преобразовать в строку, а затем отправить на сервер для обработки и записи. Все идет нормально. Тем не менее, это мероприятие посещают около 20 000 человек, а это означает много сканирования и множество считывателей mifare, все из которых должны быть подключены к компьютеру для считывания данных и их отправки. В идеале я хотел бы подключить к машине около 3-4 считывателей и иметь их примерно 3-4, по одному на каждом входе/выходе на мероприятии.

В чем мне нужна помощь:

Мои устройства чтения карт работают как стандартные клавиатуры в Windows и Android (и я предполагаю, что это Linux, но я собираюсь это проверить), компьютер, по сути, просто ведет себя так, как если бы у него было несколько клавиатур, каждая из которых может вводить данные одновременно, но только одной программе (т. е. на экране всегда есть одна каретка). Это может вызвать проблемы, если две карты сканируются одновременно, а нажатия клавиш с каждой карты «смешиваются» и вызывают проблемы с обработкой.

Что я хотел бы сделать, так это настроить один linux-бокс на несколько кареток, чтобы я мог сказать, что четыре командные строки работают одновременно, беря данные с одного устройства чтения карт каждая.

Например: если Джон и Сайра сканировали одновременно, в данный момент результирующий ввод мог бы быть:

j s o a h i n r a

В то время как я хотел бы, чтобы это было:

CLI 1:

Джон

CLI2:

сайра

и т. д. и т. д. для CLI3, CLI4

Я знаю, что это должно быть возможно, я рассматривал возможность установки многопользовательского дистрибутива Linux, но я чувствую, что для решения проблемы будет использоваться кувалда, и это создает новую проблему, поскольку вводит необходимость в мониторах, мышах. , так далее.

В идеале я хотел бы, чтобы вся эта система была как можно более оптимизированной, работающей либо на ноутбуке, либо просто на Linux-боксе, который я могу подключить, загрузить и запустить автоматически (без необходимости в мониторах, мышах или других неуклюжих битах и частей!).

У кого-нибудь есть опыт в этом или совет, который они могут предложить? Любая помощь приветствуется!

Спасибо,

Дом


person Dom Weldon    schedule 24.08.2013    source источник
comment
Привет всем, я исследовал это дальше, основываясь на некоторых предложениях, которые появились в связанных сообщениях после того, как я отправил вопрос. Я чувствую, что мог подойти к этому слишком много с точки зрения веб-конвертов (вероятно, я должен объявить, что мой естественный дом здесь — php/ajax, так что извиняюсь за потенциально глупый вопрос!). Я понимаю, что лучший способ, вероятно, использовать C или python для чтения /dev. Если у кого-нибудь есть какие-либо советы по этому поводу или как это сделать на питоне, это было бы чрезвычайно полезно!   -  person Dom Weldon    schedule 25.08.2013


Ответы (1)


Дом снова здесь. Мне удалось решить это довольно легко, используя Python. Свяжитесь со мной, если вам нужен дополнительный совет, но основная суть заключается в использовании модуля evdev в Python для прямого доступа к оборудованию (в этом случае я создал класс ActiveReader для работы с каждым отдельным считывателем). Затем настройте различные процессы с помощью многопроцессорного модуля для отдельной обработки каждого устройства чтения карт.

Код для бита обработки приведен ниже - это ранний код, и он требует дополнительной работы, я намеренно оставил его здесь коротким и приятным, чтобы он служил справочным материалом для людей, пытающихся делать подобные вещи!

# imports etc
from evdev import InputDevice, categorize, ecodes
from ActiveReader import ActiveReader
from multiprocessing import Process

# for the reader
dev = InputDevice('/dev/input/event4')

def new_device_process(device_name):
    print device_name
    device  =   InputDevice (device_name)
    print device.name
    someDevice  =   ActiveReader(device)


if __name__ == "__main__":

    # put in a process here to work on updating the database

    # set this up with Monitoring module to detect when devices are plugged in/unplugged etc.
    p1      =   Process(target=new_device_process, args=('/dev/input/event4',))
    p1.start()
    p2      =   Process(target=new_device_process, args=('/dev/input/event5',))
    p2.start()
person Dom Weldon    schedule 25.08.2013
comment
Дом, ты продолжал работать над этим? Я делаю что-то очень похожее на то, что вы должны были сделать, и я хотел бы поковыряться в вашем мозгу и посмотреть, как вы в конечном итоге решили это? - person Gustavo Corona; 07.03.2015
comment
Привет Густаво. Я продолжил, в конце концов я решил эту проблему, используя привязку событий и библиотеку evdev python. Вы хотите, чтобы я прислал код, который я использовал? - person Dom Weldon; 08.03.2015
comment
Дом, это было бы здорово. Как я могу связаться с вами? Вы можете связаться со мной по адресу stackoverflow AT elgus.net - person Gustavo Corona; 09.03.2015