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デバイス用のドライバを作成せずにこの形式でrawコマンドを送信して操作を実行する方法はありますか?

答え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の横に数字が記されていますvidpidあなたの場合は、次のコマンドを試すことができます。

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大容量ストレージインターフェイスを提供している場合、出力にはまたは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シリアルドライバモジュールにも同じ戦略を使用できます。これら2つのコマンドでモジュールの名前を変更するだけです。

正しいドライバモジュールを識別できない場合は、質問を実行して編集して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デバイスには1つ以上制御エンドポイントそしていくつかあるかもしれません相互作用、それぞれに複数のエンドポイントがあります。

デバイス/dev/bus/usb/...ノードを使用すると、USBのフル機能セットを使用できますが、これは実際にはスクリプトで使用できません。デフォルトでは、これらのデバイスノードは単にデータを送受信するのではなく、特定のシステムコールの宛先として存在します。

関連情報