В связи с полной сменой 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 приведён на скриншоте, процесс поиска ключа занял около минуты.
Скачать исходники и исполняемые файлы можно здесь. Исходники собраны в 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 в предлагаемом исходнике всё уже сделано.