Несколько дискретных клавиатурных входов на одной машине
Фон:
В октябре я провожу крупное мероприятие и планирую следить за тем, кто посещает и где люди находятся в здании в целях безопасности, используя систему, которая считывает карточки mifare, которые есть у всех в моей организации. Для этого я нашел дешевый mifare-ридер, который считывает определенный сектор карты и возвращает данные в шестнадцатеричном виде, которые я могу преобразовать в строку, а затем отправить на сервер для обработки и записи. Все идет нормально. Тем не менее, около 20000 человек посещают это мероприятие, а это означает, что нужно много сканировать и, таким образом, много читателей mifare, каждый из которых должен быть подключен к компьютеру, чтобы читать данные и отправлять их. В идеале, я хотел бы подключить около 3 или 4 считывателей к машине, и иметь около трех или четырех из них, по одному на каждый вход / выход на мероприятии.
Что мне нужно сделать помощь:
Мои устройства считывания карт действуют как общие клавиатуры для Windows и Android (и я предполагаю, что Linux, но я собираюсь это проверить), по сути, компьютер работает так, как будто он имеет несколько клавиатур, каждая из которых может вводить данные одновременно, но только в одну программу (т. е. на экране всегда есть одна каретка). Это может вызвать проблемы, если две карточки сканируются одновременно, а нажатия клавиш на каждой карточке "перепутаны" и, следовательно, возникают проблемы при обработке.
То, что я хотел бы сделать, это настроить один linux-бокс, чтобы иметь несколько кареток, чтобы я мог сказать, что все четыре командной строки идут одновременно, принимая данные от одного кард-ридера каждая.
Например: если Джон и Сайра сканировали в одно и то же время, в данный момент получаемый результат может быть следующим:
д е о х а н ра
Принимая во внимание, что я хотел бы, чтобы это было:
CLI 1:
Джон
CLI2:
Сайра
и т. д. для CLI3, CLI4
Я знаю, что это должно быть возможно, я рассмотрел возможность установки многопользовательского дистрибутива Linux, но я чувствую, что будет использовать кувалду для решения проблемы, и создаст новую проблему, так как она вводит необходимость в мониторах, мышах, так далее.
В идеале я хотел бы, чтобы вся эта система была максимально упрощена, либо работала на ноутбуке, либо просто на компьютере с Linux, который я мог подключить, загрузить и запустить автоматически (без необходимости в мониторах, мышах или других громоздких элементах и куски!).
У кого-нибудь есть опыт или совет, который они могут предложить? Любая помощь приветствуется!
Спасибо,
Дом
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()