mfoc для ридера RD-03AB

В связи с полной сменой API на V2.0 для ридеров RD-03AB, часто задают вопросы, типа, как переделать mfoc и т.п., что мол горе-горькое в том, что ридер не поддерживается официально libnfc, и т.д. и т.п.. Не переживайте: libnfc — это «тупиковая ветвь эволюции», которую губит попытка объять необъятное. libnfc сложен в понимании даже на уровне примеров, и что-то делать на нём не так просто, даже когда находишься в теме, ИМХО. Поэтому, отсутствие официальной поддержки libnfc для RD-03AB скорее фича, чем трабл, тем более, что ридер работает как под Windows, так и под Linux без драйверов.

На самом деле, никакой проблемы при переносе кода mfoc — нет, ниже приводится пример для Windows. Все исходники традиционно открыты 🙂

За основу сборки был взят апрельский git-образ mfoc — это что-то между V0.10.7 и будущей V0.10.8. Всё API ридера заключено в двух файлах — mf0xAB.cpp и rd0xAB.cpp. Софт прекрасно компилируется как в WinDDK 7, так и в VS, правда, для работы с проектом в VS в папке исходников следует создать каталог ddk со следующей структурой (файлы следует перенести из соотв. каталогов WinDDK).

 Содержимое папки ..\ddk
[inc]
[lib]

 Содержимое папки ..\ddk\inc
basetsd.h       hidpi.h         hidsdi.h        hidusage.h      intsafe.h
poppack.h       pshpack1.h      pshpack2.h      pshpack4.h      pshpack8.h
pshpck16.h      setupapi.h      specstrings.h

 Содержимое папки ..\ddk\lib
[amd64]
[i386]

 Содержимое папки ..\ddk\lib\amd64
setupapi.lib

 Содержимое папки ..\ddk\lib\i386
hid.lib        setupapi.lib

 Содержимое папки ..\ddk\lib\ia64
setupapi.lib

В данном примере ключ искался около минуты. Результат работы mfoc64.exe приведён на скриншоте, процесс поиска ключа занял около минуты.
mfoc64 для RD-03AB - скриншот работы программы

Скачать исходники и исполняемые файлы можно здесь. Исходники собраны в WinDDK 7 в режимах «XP Free» и «x64 Free»; обе версии работают без вопросов. Ридер можно подключать как по USB так и по COM порту, синтаксис описан в «mfoc.exe -h».

P.S. Качество и время работы mfoc очень сильно зависит 1) от дистанции — чем короче, тем лучше, и 2) от нестабильности времени в местах, отмеченных в коде комментарием «ATTENTION!!! TIME for pseudo random generator rotation!!!!». Время на этих участках подбирается так, чтобы в режиме «distance» дистанция была минимальной, а время между операциями с ридером в режиме «recovery» было равно времени в режиме «distance». Если дисперсия дистанций велика (>100), то следует увеличивать параметр tolerance. Впрочем, для ридера RD-03AB в предлагаемом исходнике всё уже сделано.