원격 제어 애플리케이션을 만들려고 합니다.지문 센서(링크에 포함된 가이드) 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_TEMPLATE
SDK_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 대용량 저장 인터페이스를 제공하는 경우 출력에는 또는 bDeviceClass
및 bInterfaceClass
값이 있는 줄이 포함됩니다 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의 전체 기능 세트를 사용할 수 있지만 이로 인해 실제로 스크립트에서 사용할 수 없습니다. 기본적으로 이러한 장치 노드는 단순히 데이터를 주고받는 것이 아니라 특정 시스템 호출의 대상으로 존재합니다.