Отправить команду на USB-устройство (сканер отпечатков пальцев) без драйвера для Linux.

Вопрос или проблема

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

Оцените материал
Добавить комментарий

Капча загружается...