USB 장치(지문 스캐너)로 명령 보내기, Linux 드라이버 필요 없음

USB 장치(지문 스캐너)로 명령 보내기, Linux 드라이버 필요 없음

원격 제어 애플리케이션을 만들려고 합니다.지문 센서(링크에 포함된 가이드) Raspberry PI 3 모델에서 지문을 등록하고 식별하는 방법입니다. 이 특정 기능에 대한 SDK_DEMO는 Windows에만 있으며 위에서 언급한 Guile에서 찾을 수 있습니다.

  • SDK_DEMO는 Visual Studio에서 C++로 작성되었으므로 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,

SKD_DEMO는 지문 센서를 대용량 저장소로 인식하고 비슷한 명령을 실행합니다.

Ubuntu에서 대용량 저장 장치가 탑재되지 않은 상태에서 USB 장치를 연결하면 lsusb 다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하세요.

이것저것 찾아보고 시도해봤는데

echo "0x12" >> /dev/bus/usb/001/008

하지만 잘못된 매개변수로 인해 쓰기 오류가 발생합니다.

다음은 시도를 반영하는 터미널 명령입니다.

여기에 이미지 설명을 입력하세요.

Linux에서 이 USB 장치에 대한 드라이버를 작성하지 않고 이 형식으로 원시 명령을 보내고 작업을 수행할 수 있는 방법이 있습니까?

답변1

나는 그것이 그런 식으로 작동할 수 있다고 생각하지 않습니다. 한편으로는 echo "0x012...ASCII 문자의 리터럴 문자열이 전송되는데 0x12, 이는 장치와 통신하는 데 필요한 실제 이진 데이터를 Base-16으로 표현한 것입니다.

아마도 Python을 살펴보고(다른 많은 언어로도 이 작업을 수행할 수 있지만 일반적으로 Python이 시작하기에 좋은 곳임) USB 장치와 통신할 수 있습니다. 어쩌면 여기:https://stackoverflow.com/questions/44290837/how-to-interact-with-usb-device-using-pyusb

답변2

당신은 작성해야합니다 /dev/bus/usb/[vid:pid]. ID 옆에 숫자가 적혀있습니다 vid. pid귀하의 경우 다음 명령을 시도해 볼 수 있습니다.

echo "0x12" >> /dev/bus/usb/001/2009:7638

답변3

SDK_DEMO는 COM 포트를 사용하여 Windows의 지문 스캐너에 연결하는 것으로 보이며 튜토리얼에서는 USB-직렬 변환기를 사용하는 것이 예상되는 방법임을 나타냅니다. 명령 세트에는 각각 지문 템플릿을 읽고 스캐너에 쓰기 위한 CMD_GET_TEMPLATE및 가 포함되어 있으므로 CMD_ADD_TEMPLATESDK_DEMO는 실제로구현하다대용량 저장 시뮬레이션.

lsusb목록 사진(그런데 사진에 텍스트를 첨부하지 마세요. 가능하면 실제 텍스트를 복사하여 붙여넣으세요) 에서 Bus 001 Device 008장치에 USB 공급업체 및 제품 ID가 있는 것으로 나타납니다 2009:7638.

안타깝게도 USB 공급업체 ID2009 iStorage를 말하는 것 같습니다., 이 공급업체에는 소수의 플래시 드라이브 ID만 존재하는 것으로 알려져 있습니다.

반면, USB-직렬 변환기 칩의 ID는 일반적으로 구성 가능합니다. 왜냐하면 이러한 칩이 더 큰 제품의 일부로 사용될 때 더 큰 제품의 공급업체가 자체 공급업체 및 제품 코드를 갖기를 원하기 때문입니다. 따라서 먼저 해당 ID가 있는 USB 장치가 2009:7638실제로 사용자 지정 ID가 있는 USB 직렬 변환기인지 아니면 다른 문제가 발생하고 있는지 확인해야 합니다 .

이렇게 하려면 lsusb -d 2009:7638 -v장치가 연결되어 있는 동안 명령을 실행하세요. 출력에 다음과 같은 줄이 포함되어 있으면 확실히 USB-직렬 변환기입니다.

  bInterfaceClass       255 Vendor Specific Class
  bInterfaceSubClass    255 Vendor Specific Subclass
  bInterfaceProtocol    255 Vendor Specific Protocol
  iInterface              2 USB Serial Converter

그러나 장치가 실제로 USB 대용량 저장 인터페이스를 제공하는 경우 출력에는 또는 bDeviceClassbInterfaceClass값이 있는 줄이 포함됩니다 8 Mass Storage. 그렇다면 장치가 lsblk출력에도 나타나야 합니다.

USB-직렬 변환기 칩이 FTDI 제품인 경우(링크한 가이드에서 알 수 있듯이) 해당 드라이버 모듈은 아마도 ftdi_sio모듈을 로드하고 사용자 정의 ID를 인식하도록 하려면 다음과 같습니다.

modprobe ftdi_sio
echo 2009 7638 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id

다른 USB-직렬 드라이버 모듈에도 동일한 전략을 사용할 수 있습니다. 이 두 명령에서 모듈 이름을 바꾸면 됩니다.

올바른 드라이버 모듈을 식별할 수 없는 경우 lsusb -d 2009:7638 -v > /tmp/usbserial-info.txt질문을 실행하고 편집하여 결과 파일의 내용을 추가하십시오 /tmp/usbserial-info.txt.

USB-직렬 드라이버가 장치를 인식하면 /dev/ttyUSB0이제 장치 노드가 나타납니다. 이는 지문 스캐너와 통신하는 데 사용되는 장치입니다.

/dev/bus/usb/xxx/yyy사용하려는 장치는 다음 /dev/bus/usb/001/008과 함께 작동하도록 설계되었습니다.libusb, 서로 다른 것을 이해하려면 장치 노드를 사용하는 애플리케이션이 필요하기 때문입니다.USB 엔드포인트그리고USB 전송 모드. USB 장치에는 하나 이상의제어 엔드포인트그리고 여러 개가 있을 수 있습니다상호 작용, 각각에는 여러 개의 엔드포인트가 있습니다.

장치 /dev/bus/usb/...노드를 사용하면 USB의 전체 기능 세트를 사용할 수 있지만 이로 인해 실제로 스크립트에서 사용할 수 없습니다. 기본적으로 이러한 장치 노드는 단순히 데이터를 주고받는 것이 아니라 특정 시스템 호출의 대상으로 존재합니다.

관련 정보