- Вопрос или проблема
- Ответ или решение
- Управление USB-устройством (Сканером отпечатков) без драйвера в Linux
- Анализ ситуации
- Шаги к решению проблемы
- 1. Установка необходимых библиотек
- 2. Поиск устройства и получение идентификаторов
- 3. Проверка драйвера
- 4. Программирование с использованием Python и pyUSB
- 5. Обработка ошибок
- Заключение
Вопрос или проблема
Я пытаюсь создать приложение для удалённого управления датчиком отпечатков пальцев (руководство прикреплено по ссылке) для регистрации и идентификации отпечатков пальцев на нашей Raspberry Pi 3 Model. Существует SDK_DEMO для этой функциональности только на Windows, который вы можете найти в упомянутом выше руководстве.
- SDK_DEMO написан на C++ в Visual Studio, поэтому я не могу изменить код, чтобы запустить его на Raspberry Pi 3.
Из исходного кода SDK_DEMO я понял, какую команду нужно отправить для выполнения задач.
Команды
CMD_NONE = 0x00,
CMD_OPEN = 0x01,
CMD_CLOSE = 0x02,
CMD_USB_INTERNAL_CHECK = 0x03,
CMD_CHANGE_BAUDRATE = 0x04,
CMD_MODULE_INFO = 0x06,
CMD_CMOS_LED = 0x12,
CMD_ENROLL_COUNT = 0x20,
CMD_CHECK_ENROLLED = 0x21,
CMD_ENROLL_START = 0x22,
CMD_ENROLL = 0x23,
CMD_ENROLL1 = 0x23,
CMD_ENROLL2 = 0x24,
CMD_ENROLL3 = 0x25,
CMD_IS_PRESS_FINGER = 0x26,
CMD_DELETE = 0x40,
CMD_DELETE_ALL = 0x41,
CMD_VERIFY = 0x50,
CMD_IDENTIFY = 0x51,
CMD_VERIFY_TEMPLATE = 0x52,
CMD_IDENTIFY_TEMPLATE = 0x53,
CMD_CAPTURE = 0x60,
CMD_GET_IMAGE = 0x62,
CMD_GET_RAWIMAGE = 0x63,
CMD_GET_TEMPLATE = 0x70,
CMD_ADD_TEMPLATE = 0x71,
CMD_GET_DATABASE_START = 0x72,
CMD_GET_DATABASE_END = 0x73,
CMD_FW_UPDATE = 0x80,
CMD_ISO_UPDATE = 0x81,
CMD_FAKE_DETECTOR = 0x91,
CMD_SET_SECURITY_LEVEL = 0xF0,
CMD_GET_SECURITY_LEVEL = 0xF1,
ACK_OK = 0x30,
NACK_INFO = 0x31,
SDK_DEMO распознал датчик отпечатков пальцев как Mass Storage и каким-то образом выполнял команды таким образом.
В Ubuntu, однако, когда я подключаю USB устройство, я не получаю никакого монтирования Mass Storage и на lsusb
я получаю это:
Я искал информацию об этом и пытался
echo "0x12" >> /dev/bus/usb/001/008
Но я получил ошибку записи из-за недопустимого аргумента.
Вот команды терминала для попытки echo:
Существует ли способ, чтобы я мог отправлять необработанные команды в этом формате и выполнять действия без необходимости писать драйвер для этого USB устройства на Linux?
Я не думаю, что это может работать таким образом. Во-первых, echo "0x012...
отправляет буквальную строку символов ASCII 0x12
, которая является лишь представлением в шестнадцатеричном формате фактических двоичных данных, необходимых для общения с устройством.
Посмотрите на Python, возможно (вы также могли бы использовать много других языков для этого, однако Python обычно хорошее место для начала) и общение с USB-устройствами. Возможно, здесь: https://stackoverflow.com/questions/44290837/how-to-interact-with-usb-device-using-pyusb
Вы должны написать /dev/bus/usb/[vid:pid]
. vid
и pid
– это числа, написанные рядом с ID. В вашем случае вы можете попробовать эту команду:
echo "0x12" >> /dev/bus/usb/001/2009:7638
SDK_DEMO, похоже, использует COM-порт для подключения к сканеру отпечатков пальцев в Windows, и в руководстве указано, что использование USB-serial преобразователя является ожидаемым способом. Поскольку набор команд включает как CMD_GET_TEMPLATE
, так и CMD_ADD_TEMPLATE
, возможно, для чтения и записи шаблонов отпечатков пальцев в сканер соответственно, возможно, что SDK_DEMO на самом деле реализовывал эмуляцию Mass Storage.
На вашем изображении списка lsusb
(Кстати, пожалуйста, не прикрепляйте изображения текста; просто скопируйте и вставьте фактический текст, если это возможно) устройство Bus 001 Device 008
похоже имеет USB vendor & product IDs 2009:7638
.
К сожалению, USB vendor ID 2009
согласно раскладке, относится к iStorage, и у этого вендора известно, что существуют только несколько ID флеш-накопителей.
С другой стороны, ID чипов USB-to-serial преобразователей часто настраиваются, так как когда такой чип используется как часть более крупного продукта, вендор этого более крупного продукта, вероятно, пожелает, чтобы у него были свои собственные коды вендора и продукта. Поэтому сначала вам нужно выяснить, является ли USB-устройство с ID 2009:7638
на самом деле USB-serial преобразователем с пользовательским ID или это что-то другое.
Чтобы это сделать, пожалуйста, запустите команду lsusb -d 2009:7638 -v
, пока устройство подключено. Если вывод включает строки вроде этой, это определенно USB-to-serial преобразователь:
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 2 USB Serial Converter
Но если устройство на самом деле предоставляет интерфейс USB Mass Storage, то вывод будет включать либо строку bDeviceClass
, либо bInterfaceClass
со значением 8 Mass Storage
. Если это так, то устройство также должно появляться в выводе lsblk
.
Если чип USB-to-serial преобразователя является продуктом FTDI (как предполагается в руководстве, на которое вы сослались), правильный модуль драйвера для него вероятно ftdi_sio
. Чтобы загрузить модуль и сделать его осведомленным о пользовательских ID:
modprobe ftdi_sio
echo 2009 7638 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
Такая же стратегия может использоваться и с другими модулями драйверов USB-to-serial; просто замените имя модуля в обеих командах.
Если вы не можете определить правильный модуль драйвера, пожалуйста, выполните lsusb -d 2009:7638 -v > /tmp/usbserial-info.txt
и отредактируйте свой вопрос, чтобы добавить содержимое результирующего файла /tmp/usbserial-info.txt
в него.
Если драйвер USB-to-serial распознает устройство, теперь должен появиться узел устройства /dev/ttyUSB0
. Это устройство следует использовать для общения со сканером отпечатков пальцев.
Устройства /dev/bus/usb/xxx/yyy
, такие как /dev/bus/usb/001/008
, которые вы пытались использовать, предназначены для использования с libusb
, так как они требуют, чтобы приложение, использующее узел устройства, было осведомлено о различных USB endpoints и USB transfer modes. Одно USB устройство будет иметь как минимум один control endpoint и может иметь несколько interfaces, каждая с несколькими endpoints.
Узлы устройств /dev/bus/usb/...
позволяют использовать полный набор функций USB, но из-за этого они не подходят для использования скриптами; по сути, эти узлы устройств существуют как целевой объект для специальных системных вызовов, а не для простого перетаскивания данных внутрь и наружу из них.
Ответ или решение
Управление USB-устройством (Сканером отпечатков) без драйвера в Linux
Введение
Ваша задача заключается в создании приложения для удалённого управления сканером отпечатков пальцев на Raspberry Pi 3. Несмотря на наличие SDK_DEMO для Windows, которое позволяет отправлять команды устройству, использование данного SDK в Linux представляется невозможным. В этой статье мы рассмотрим, как отправлять команды USB-устройствам в Linux без специального драйвера, используя Python и библиотеку pyUSB.
Анализ ситуации
Из ваших описаний видно, что сканер отпечатков идентифицируется в Linux по другому, чем под Windows, принципу. Ваша попытка использовать команду echo
для отправки данных на устройство столкнулась с ошибкой, так как вывод русских букв не позволяет отправить необходимые байтовые данные. Для успешной коммуникации вам необходимо использовать программные интерфейсы, которые могут работать с USB устройствами напрямую, обращаясь к их конфигурации.
Шаги к решению проблемы
1. Установка необходимых библиотек
Для работы с USB-устройствами нам понадобится установить библиотеку pyusb
. Это можно сделать, воспользовавшись pip:
pip install pyusb
Также вам потребуется установить пакет libusb
, который является зависимостью для работы pyusb
:
sudo apt-get install libusb-1.0-0-dev
2. Поиск устройства и получение идентификаторов
Чтобы узнать, как именно ваше устройство регистрируется в системе, используйте lsusb
:
lsusb
Это даст вам список всех подключённых USB-устройств, и вы сможете определить Vendor ID (VID) и Product ID (PID) вашего сканера отпечатков.
Кроме того, выполните команду:
lsusb -d 2009:7638 -v
Это позволит вывести полную информацию о вашему устройстве, включая классы интерфейсов. Вам нужно увидеть, если ваше устройство действительно является USB-to-serial адаптером.
3. Проверка драйвера
Если ваше устройство поддерживает стандартные USB-to-serial драйверы, то вы можете попробовать загрузить их с помощью следующих команд:
sudo modprobe ftdi_sio
echo "2009 7638" | sudo tee /sys/bus/usb-serial/drivers/ftdi_sio/new_id
После успешной загрузки драйвера вы должны увидеть новое устройство в /dev/ttyUSB0
, которое можно использовать для вашей работы.
4. Программирование с использованием Python и pyUSB
Ниже приведён простой пример кода, который отправляет команду на сканер:
import usb.core
import usb.util
# Найти устройство по VID и PID
dev = usb.core.find(idVendor=0x2009, idProduct=0x7638)
if dev is None:
raise ValueError('Устройство не найдено')
# Отсоединение устройства от других драйверов
if dev.is_kernel_driver_active(0):
dev.detach_kernel_driver(0)
# Настройка устройства
dev.set_configuration()
# Определите необходимую команду
command = [0x12] # Пример: CMD_CMOS_LED
# Отправка команды
dev.write(1, command) # '1' — это номер первого интерфейса
# Чтение ответа (если необходимо)
response = dev.read(0x81, 64) # Считываем 64 байта из первого эндпоинта
print(response)
5. Обработка ошибок
Обязательно добавьте обработку исключений и вывод информации об ошибках, чтобы убедиться, что если что-то пойдёт не так, вы получите понимание проблемы.
Заключение
Работа с USB-устройствами без драйвера в Linux может показаться сложной задачей, однако с помощью правильных инструментов и подхода, вы сможете реализовать необходимую функциональность. Использование библиотеки pyUSB
позволяет не только взаимодействовать с устройством, но и управлять передачей данных на более высоком уровне без необходимости создания драйвера. Этот подход является гибким и эффективным для работы с сканерами отпечатков пальцев в вашей среде разработки.