USB デバイスとのやり取りのすべて (Windows ストア アプリ)

Windows 8.1 で導入された Windows ランタイム API を使って、USB 周辺機器へのアクセスをユーザーに許可する Windows ストア アプリを記述します。そのようなアプリは、ユーザーが指定した条件に基づくデバイスへの接続、デバイスに関する情報の取得、デバイスへのデータの送信 (逆に言うと、デバイスからのデータ ストリームの取得)、デバイスでの割り込みデータのポーリングを行うことができます。

ここでは、C++、C#、または Visual Basic アプリを使った Windows ストア アプリがそれらのタスクを実装する方法について説明し、Windows.Devices.Usb に含まれるクラスの使用方法を紹介する例のリンクを示します。アプリ マニフェストで必要なデバイス機能についてと、デバイスが接続されているときにアプリを起動する方法について考えます。さらに、バッテリ寿命を節約するためにアプリが一時停止しているときでも、バックグラウンドでデータ転送タスクを実行する方法について説明します。

このセクションの手順に従うか、カスタム USB デバイス アクセスのサンプルに直接移動します。対応するサンプルには、ここでの手順がすべて実装されていますが、説明を進めるためコードについては詳細に説明しません。手順によっては、「サンプルで確認しましょう」セクションがあり、コードですばやく見つけることができます。 サンプルのソース ファイルの構造はシンプルかつフラットなため、ソース ファイルの複数の層をドリルダウンしなくてもコードを簡単に見つけることができます。しかし、自身のプロジェクトは細かく分けて、異なる仕方で整理することができます。

このセクションの内容

チュートリアル: —USB デバイス対応 Windows ストア アプリの記述

ステップ説明

Step 1—Microsoft が提供する WinUSB ドライバーをデバイスの機能ドライバーとしてインストールする。

クイック スタート: WinUSB (Winusb.sys) のインストール

Winusb.sys は以下の方法でインストールできます。

  • デバイスを接続すると、Windows によって Winusb.sys が自動的に読み込まれる (WinUSB デバイスである場合)。
  • システムに用意されているデバイス クラスをデバイス マネージャーで指定してドライバーをインストールする。
  • カスタム INF を使ってドライバーをインストールする。INF は、次のいずれかの方法で入手できます。
    • ハードウェア ベンダーから INF を入手します。
    • Microsoft が提供する Winusb.inf ファイルを参照するカスタム INF を記述します。詳しくは、 「WinUSB (Winusb.sys) のインストール」をご覧ください。

Step 2—デバイスのインターフェイス GUID、ハードウェア ID、デバイスに関するデバイス クラス情報を取得する。

この情報は、デバイスの製造元から入手できます。

  • ベンダーと製品の識別子

    デバイス マネージャーで、デバイスのプロパティを表示します。[詳細] タブで、[ハードウェア ID] プロパティ値を参照します。この値は 2 つの識別子の組み合わせです。たとえば、SuperMUTT デバイスの場合、[ハードウェア ID] は "USB\VID_045E&PID_F001" で、ベンダー ID が "0x045E"、製品 ID が "0xF001" であることを示します。

  • デバイスのクラス、サブクラス、プロトコル コード
  • デバイス インターフェイス GUID
または、レジストリの情報を参照することもできます。詳しくは、「USB デバイスのレジストリ エントリ」をご覧ください。

Step 3—デバイスのクラス、サブクラス、プロトコルが Windows ランタイム USB API セットにより許容されるかどうかを判断する。

デバイスのクラス、サブクラス、デバイスのプロトコル コードが次のいずれかの場合は、Windows ストア アプリを記述できます。

  • name:cdcControl, classId:02 * *
  • name:physical, classId:05 * *
  • name:personalHealthcare, classId:0f 00 00
  • name:activeSync, classId:ef 01 01
  • name:palmSync, classId:ef 01 02
  • name:deviceFirmwareUpdate, classId:fe 01 01
  • name:irda, classId:fe 02 00
  • name:measurement, classId:fe 03 *
  • name:vendorSpecific, classId:ff * *

Step 4—このチュートリアルで拡張する基本的な Visual Studio 2013 プロジェクトを作る。

詳しくは、「Windows ストア アプリの概要」をご覧ください。

Step 5—USB デバイス機能をアプリ マニフェストに追加する。

クイック スタート: USB デバイス機能をアプリ マニフェストに追加する方法

Package.appxmanifest ファイルをテキスト エディターで開き、この例に示すように Name 属性が "usb" に設定された DeviceCapability 要素を追加します。

  USB デバイス機能は Visual Studio 2013 では変更できません。ソリューション エクスプローラーで Package.appxmanifest ファイルを右クリックし、[プログラムから開く] をクリックして、[XML (テキスト) エディター] を選ぶ必要があります。ファイルがプレーン XML で開きます。

<Capabilities>
      <!--When the device's classId is FF * *, there is a predefined name for the class. 
          You can use the name instead of the class id. 
          There are also other predefined names that correspond to a classId.-->
      <m2:DeviceCapability Name="usb">
          <!--SuperMutt Device-->
          <m2:Device Id="vidpid:045E 0611">
              <!--<wb:Function Type="classId:ff * *"/>-->
              <m2:Function Type="name:vendorSpecific"/>
          </m2:Device>
      </m2:DeviceCapability>
  </Capabilities>

サンプルで確認しましょう: Package.appxmanifest ファイルで USB デバイス機能が追加されます。

Step 6— アプリを拡張し、通信するためにデバイスを開く。

クイック スタート: USB デバイスに接続する方法 (Windows ストア アプリ)

  1. 列挙されたデバイス コレクションでデバイスを見つける検索基準が含まれる高度なクエリ構文 (AQS) 文字列を作成して、デバイスを見つけます。
  2. 次の2 つの方法のどちらかでデバイスを開きます。
  3. DeviceInformation.Id プロパティからデバイス インスタンスを取得します。
  4. デバイス インスタンス文字列を渡すことによって FromIdAsync を呼び出して、UsbDevice オブジェクトを取得します。

サンプルで確認しましょう: Scenario1_DeviceConnect という名前のファイルを確認します。

Step 7(推奨)—USB デバイスのレイアウトについて知る。

すべての USB 開発者のための概念」で、デバイスの構成とデータ転送の実行に関する基本的な USB の概念について確認します。

デバイスの構成記述子、サポートされる各代替設定のインターフェイス記述子、その設定のエンドポイント記述子を確認します。USBView を使うと、すべての USB コントローラーとそのコントローラーに接続されている USB デバイスを参照できるほか、デバイス構成も調べることができます。

Step 8— アプリを拡張し、USB 記述子を取得して UI に表示する。

クイック スタート: USB 記述子を取得する方法 (Windows ストア アプリ)

サンプルで確認しましょう: Scenario5_UsbDescriptors という名前のファイルを確認します。

Step 9— アプリを拡張し、ベンダーによって定義された USB 制御転送を送信する。

クイック スタート: USB 制御転送要求を送信する方法 (Windows ストア アプリ)

  1. デバイスのハードウェア仕様からベンダー コマンドを取得します。
  2. UsbSetupPacket オブジェクトを作成し、各種プロパティを設定することでセットアップ パケットに値を入力します。
  3. 転送の方向に応じて次のメソッドにより、制御転送を送信する非同期操作を開始します。

サンプルで確認しましょう: Scenario2_ControlTransfer という名前のファイルを確認します。

Step 10— アプリを拡張し、バルク データの読み取り/書き込みを行う。

クイック スタート: USB バルク転送要求を送信する方法 (Windows ストア アプリ)

  1. バルク パイプ オブジェクト (UsbBulkOutPipe または UsbBulkInPipe) を取得します。
  2. バルク パイプを構成してポリシー パラメーターを設定します。
  3. DataReader オブジェクトまたは DataWriter オブジェクトを使って、データ ストリームを設定します。
  4. DataReader.LoadAsync または DataWriter.StoreAsync を呼び出して、非同期転送操作を開始します。
  5. 転送操作の結果を取得します。

サンプルで確認しましょう: Scenario4_BulkPipes という名前のファイルを確認します。

Step 11— アプリを拡張し、ハードウェア割り込みデータを取得する。

クイック スタート: USB 割り込み転送要求を送信する方法 (Windows ストア アプリ)

  1. 割り込みパイプ オブジェクト (UsbInterruptInPipe または UsbInterruptOutPipe) を取得します。
  2. DataReceived イベントの割り込みハンドラーを実装します。
  3. イベント ハンドラーを登録して、データの受信を開始します。
  4. イベント ハンドラーの登録を解除して、データの受信を停止します。

サンプルで確認しましょう: Scenario3_InterruptPipes という名前のファイルを確認します。

Step 12— アプリを拡張し、現在アクティブでないインターフェイス設定を選択する。

クイック スタート: USB インターフェイスの設定を選ぶ方法 (Windows ストア アプリ)

通信のためにデバイスを開くと、既定のインターフェイスとその最初の設定が選択されます。その設定を変更する場合、次の手順に従います。

  1. UsbInterfaceSetting.Selected 値を使って USB インターフェイスのアクティブな設定を取得します。
  2. UsbInterfaceSetting.SelectSettingAsync を呼び出すことで非同期操作を開始して、USB インターフェイスを設定します。

Step 13— デバイスを閉じる。

クイック スタート: USB デバイスに接続する方法 (Windows ストア アプリ)

UsbDevice オブジェクトを使い終わったら、デバイスを閉じます。

C++ アプリでは、delete キーワードを使って参照を解放する必要があります。C#/VB アプリでは、UsbDevice.Dispose メソッドを呼び出す必要があります。JavaScript アプリでは、UsbDevice.Close を呼び出す必要があります。

サンプルで確認しましょう: Scenario1_DeviceConnect という名前のファイルを確認します。

Step 14—アプリのデバイス メタデータ パッケージを作成する。

ツール: Device Metadata Authoring (デバイス メタデータの作成) ウィザード
  • Windows Driver Kit (WDK) がインストールされている場合、[Driver] (ドライバー)、[Device Metadata] (デバイス メタデータ)、[Authoring] (オーサリング) の順に開きます。
  • スタンドアロン SDK がインストールされている場合、ツールは <install_path>\bin\x86\DeviceMetadataWizardexe にあります。

ウィザードの手順に従って、アプリとデバイスを関連付けます。デバイスに関する次の情報を入力します。

  • [Device Info] (デバイス情報) ページで、モデル名製造元説明を入力します。
  • [Hardware Info] (ハードウェア情報) ページで、デバイスのハードウェア ID を入力します。

Dn312121.wedge(ja-jp,VS.85).gifアプリをデバイスの特権アプリとして宣言するには、次の手順に従います。

  1. [App Info] (アプリ情報) ページの [Privileged application] (特権アプリケーション) グループで、パッケージ名発行者名Windows ストア アプリ ID を入力します。

    特権アプリのデバイス メタデータ

      [Access custom driver] (カスタム ドライバーにアクセスする) オプションはオンにしないでください。

  2. [Finish] (完了) タブを開きます。[Copy packages to your system's local metadata store] (パッケージをシステムのローカル メタデータ ストアにコピーする) チェック ボックスをオンにします。
  3. デバイスを接続し、コントロール パネルで [デバイスとプリンターの表示] を開いて、デバイスのアイコンが正しいことを確認します。

サンプルで確認しましょう: DeviceMetadata フォルダーを確認します。

Step 15—アプリを拡張し、デバイスがシステムに接続されたときにアプリが起動するように自動再生アクティブ化を実装する。

クイック スタート: 自動再生デバイスにアプリを登録する

デバイスがシステムに接続されたときにアプリが起動するように、自動再生機能を追加することができます。自動再生は、すべての Windows ストア アプリ (特権アプリでもそれ以外のアプリでも) で有効にできます。

  1. デバイス メタデータ パッケージで、デバイスが自動再生通知に反応する方法を指定する必要があります。[Windows Info] (Windows 情報) タブで、[Windows Store device app] (Windows ストア デバイス アプリ) オプションを選択し、ここに示すアプリ情報を入力します。
  2. アプリ マニフェストで、ここに示す自動再生デバイス宣言と起動情報を追加します。

    自動再生

  3. App クラスの OnActivated メソッドで、アプリがデバイスによりアクティブ化されるかどうかを確認します。アクティブ化される場合、このメソッドは DeviceInformation.Id プロパティ値を含む DeviceEventArgs パラメーター値を受け取ります。これは、「Step 6—アプリを拡張し、通信するためにデバイスを開く」で説明されている値と同じです。

サンプルで確認しましょう: Autoplay という名前のファイルを確認します。JavaScript の場合は、default.js をご覧ください。

Step 16—アプリを拡張し、デバイスへの非常に長い USB 転送を実行するバックグラウンド タスクを実装する (アプリを一時停止せずにファームウェアの更新を行うなど)。

バックグラウンド タスクを実装するには、2 つのクラスが必要です。

バックグラウンド タスク クラスは、IBackgroundTask インターフェイスを実装し、周辺機器を同期または更新するために作成した実際のコードが含まれています。バックグラウンド タスク クラスが実行されるのは、アプリのアプリケーション マニフェストに用意されたエントリ ポイントからバックグラウンド タスクがトリガーされたときです。

  デバイスのバックグラウンド タスク インフラストラクチャは Windows 8.1 に用意されています。Windows バックグラウンド タスクについて詳しくは、「バックグラウンド タスクによるアプリのサポート」をご覧ください。

Dn312121.wedge(ja-jp,VS.85).gifバックグラウンド タスク クラス

  1. Windows バックグラウンド タスクのインフラストラクチャにより要求される IBackgroundTask インターフェイスを実装します。
  2. Run メソッド内のクラスに渡された DeviceUseDetails インスタンスを取得し、このインスタンスを使って Windows ストア アプリへの進捗状況の報告とキャンセル イベントの登録を行います。
  3. Run メソッドは、バックグラウンド デバイス同期コードを実装するプライベート OpenDevice メソッドおよび WriteToDeviceAsync メソッドも呼び出します。

Windows ストア アプリは DeviceUseTrigger バックグラウンド タスクを登録してトリガーします。アプリは、バックグラウンド タスクで進捗状況を登録、トリガー、処理します。

  次のサンプル コードは、対応するオブジェクトを使用することで DeviceServicingTrigger バックグラウンド タスクに適用できます。2 つのトリガー オブジェクトと対応する API の唯一の違いは、ポリシー チェックが Windows によって行われる点です。

  1. DeviceUseTrigger オブジェクトと BackgroundTaskRegistration オブジェクトを作成します。
  2. このサンプル アプリケーションにより以前に登録されたバックグラウンド タスクがあるかどうかを確認し、タスクで Unregister メソッドを呼び出すことでキャンセルします。
  3. デバイスと同期されるバックグラウンド タスクを登録します。SetupBackgroundTask メソッドは、次のステップで SyncWithDeviceAsync メソッドから呼び出されます。
    1. DeviceUseTrigger を初期化して、後で使用できるように保存します。
    2. BackgroundTaskBuilder オブジェクトを作成し、その Name、TaskEntryPoint、SetTrigger の各プロパティとメソッドを使ってアプリの DeviceUseTrigger オブジェクトとバックグラウンド タスク名を登録します。BackgroundTaskBuilder オブジェクトの TaskEntryPoint プロパティは、バックグラウンド タスクがトリガーされたときに実行されるバックグラウンド タスク クラスの完全な名前に設定されます。
    3. バックグラウンド タスクから completion イベントと progress イベントを登録し、Windows ストア アプリが完了と進捗状況の更新情報をユーザーに提供できるようになります。
  4. プライベート SyncWithDeviceAsync メソッドが、デバイスと同期されるバックグラウンド タスクを登録し、バックグラウンド同期を開始します。
    1. 前の手順の SetupBackgroundTask メソッドを呼び出し、デバイスと同期されるバックグラウンド タスクを登録します。
    2. バックグラウンド タスクを開始するプライベート StartSyncBackgroundTaskAsync メソッドを呼び出します。
    3. デバイスへのアプリのハンドルを閉じ、開始されるデバイスをバックグラウンド タスクが開くことができることを確認します。

        バックグラウンド タスクがデバイスを開いて更新を実行する必要が生じるため、RequestAsync を呼び出す前に Windows ストア アプリはデバイスへの接続を閉じる必要があります。

    4. DeviceUseTrigger オブジェクトの RequestAsync メソッド (バックグラウンド タスクをトリガーします) を呼び出し、バックグラウンド タスクが正常に開始されたかどうかの判断に使われる RequestAsync から DeviceTriggerResults オブジェクトを返します。

        必要なタスク開始ポリシー チェックがすべて完了したことを Windows がチェックします。すべてのポリシー チェックが完了している場合、更新操作が Windows ストア アプリの外部でバックグラウンド タスクとして実行されるようになるため、操作の進行中アプリを安全に一時停止できます。さらに、Windows は、実行時の要件があればすべて適用し、それらの要件を満たさなくなった場合はバックグラウンド タスクをキャンセルします。

    5. StartSyncBackgroundTaskAsync から返された DeviceTriggerResults オブジェクトを使って、バックグラウンド タスクが正常に開始されたかどうかを判断します。DeviceTriggerResults の結果を調べるため、switch ステートメントが使われます。
  5. バックグラウンド タスクの進捗状況でアプリ UI を更新するプライベート OnSyncWithDeviceProgress イベント ハンドラーを実装します。
  6. プライベート OnSyncWithDeviceCompleted イベント ハンドラーを実装し、バックグラウンド タスクが完了したときにバックグラウンド タスクからフォアグラウンド アプリへの移行を処理します。
    1. BackgroundTaskCompletedEventArgs オブジェクトの CheckResults メソッドを使って、バックグラウンド タスクにより例外がスローされたかどうかを判断します。
    2. アプリは、バックグラウンド タスクが完了したためフォアグラウンド アプリにより使用されるデバイスを再度開き、UI を更新してユーザーに知らせます。
  7. UI からプライベート ボタン クリック イベント ハンドラーを実装し、バックグラウンド タスクを開始およびキャンセルします。
    1. プライベート Sync_Click イベント ハンドラーが、前の手順で説明した SyncWithDeviceAsync メソッドを呼び出します。
    2. プライベート CancelSync_Click イベント ハンドラーが、プライベート CancelSyncWithDevice メソッドを呼び出してバックグラウンド タスクをキャンセルします。
  8. プライベート CancelSyncWithDevice メソッドが、アクティブなデバイス同期があれば登録を解除してキャンセルするため、BackgroundTaskRegistration オブジェクトで Unregister メソッドを使ってデバイスを再度開くことができます。

サンプルで確認しましょう: Scenario7_Sync files という名前のファイルを確認します。バックグラウンド クラスは IoSyncBackgroundTask で実装されます。

Step 17—Windows アプリ認定キットを実行する。

Windows アプリ認定キットの使用

推奨。WACK を実行すると、アプリが Windows ストアの要件を満たしているかどうかを確認できます。アプリに主要な機能を追加したときは、これを実行してください。

 

その他の情報

その他の情報については、関連するサンプルをご覧ください。

関連するサンプル

Windows ストア アプリ UI 設計と作成の概要に関するトピック

Windows ストア アプリ UI の設計について説明されています。

C# および Visual Basic を使った Windows ストア アプリのためのロードマップC++ を使った Windows ストア アプリのためのロードマップ

C++、C#、または Visual Basic を使った Windows ストア アプリの作成の概要が説明されています。

非同期プログラミング (Windows ストア アプリ)

アプリが時間がかかる可能性がある操作を実行しているときでも、アプリの応答性を保つ方法について説明されています。

 

 

表示:
© 2014 Microsoft