Мы поддерживаем нечто подобное в нашем программном обеспечении для управления записями. Наше приложение предназначено для работы со считывателем клинов, поскольку их легче всего запустить и запустить (никаких специальных драйверов не требуется). При считывании карты считыватель отправляет нажатия клавиш в ОС для каждого символа, закодированного на магнитной полосе, с имитированным нажатием клавиши Enter
между каждой дорожкой (лицензия, соответствующая AAMVA, имеет 3 дорожки данных).
Это немного раздражает, потому что ведет себя точно , как будто кто-то печатает данные вручную, поэтому нет простого способа узнать, когда у вас есть все данные (вы можете просто подождать, чтобы получить 3 строки информации, но тогда трудно обнаружить недействительные карточки, например, когда кто-то пытается смахнуть удостоверение студента, на котором может быть закодировано менее 3 дорожек, в этом случае приложение навсегда зависает в ожидании несуществующей третьей дорожки, чтобы быть полученным). Чтобы справиться с этим, мы используем подход «быстрый отказ»: каждый раз, когда мы получаем Enter
нажатие клавиши, мы немедленно обрабатываем текущую строку, сохраняя запись того, какой трек мы ожидаем в этой точке (1, 2 или 3). Если текущая дорожка не может быть обработана (например, на дорожке появляется другой начальный символ, отличный от того, что задокументировано для водительских прав в формате AAMVA), мы предполагаем, что пользователь провел пальцем что-то, кроме водительских прав.
Я не уверен, поддерживает ли читатель, который мы используем, чтение данных изображения или нет. Его можно запрограммировать так, чтобы он возвращал подмножество данных на карте, но мы просто используем заводские настройки по умолчанию, которые, по-видимому, возвращают только первые три дорожки данных (и на самом деле я считаю, что данные изображения закодированы в двумерном штрих-коде, найденном на некоторых лицензии, а не на магнитной полосе, но я могу ошибаться).
Подробнее о формате дорожки AAMVA, который используется на магнитных полосах водительских прав, см. В Приложении F к действующему стандарту .
Базовый подход, который мы используем:
Отображение модального диалога со скрытым текстовым полем, которому уделяется внимание. Диалоговое окно просто говорит пользователю, чтобы провести карту через считыватель.
Пользователь сильно удаляет карточку, и читатель начинает отправлять события нажатия клавиш в скрытое текстовое поле.
Обработчик событий нажатия клавиш для текстового поля отслеживает нажатия клавиш Enter
. Когда одна из них обнаружена, мы берем последнюю строку, сохраненную в данный момент в текстовом поле, и передаем ее анализатору дорожек, который пытается проанализировать дорожку в соответствии с форматом AAMVA.
Если этот шаг «fast-fast» не выполняется для текущей дорожки, мы меняем сообщение о состоянии диалога на сообщение о том, что карта не может быть прочитана. На этом этапе текстовое поле будет по-прежнему получать дополнительные события нажатия клавиш, но это нормально, поскольку последующие треки имеют достаточно высокий шанс того, что пользователь все равно увидит сообщение об ошибке всякий раз, когда считыватель прекращает отправку данных.
Если синтаксический анализ выполнен успешно, мы увеличиваем счетчик, который сообщает анализатору, какую дорожку он должен обработать следующим.
Если текущее количество треков больше 3, мы знаем, что обработали 3 трека. На этом этапе мы анализируем 3 дорожки (которые уже разбили большую часть полей, но на данный момент все еще сохраняется как строки) в более удобный для использования объект DriversLicense
, который выполняет дополнительные проверки данных дорожки и делает их больше расходных материалов из нашего приложения (преобразование поля DOB
из строки в реальный объект Date, разбор подполей в поле AAMVA Name
в имя, отчество, фамилию, суффикс имени и т. д.). Если эта вторая фаза разбора не пройдена, мы сообщаем пользователю, что нужно переписать карту. Если это удается, мы закрываем диалоговое окно и передаем объект DriversLicense
нашему основному приложению для дальнейшей обработки.