Windows 8.1 ストアアプリと連携できる周辺機器概要

@ITさん主催の「2013流行語アプリ選手権&総選挙」というコンテスト(https://www.atmarkit.co.jp/ait/subtop/features/kwd/wintabcontest.html)始まりました。その一部門に「デバイスと大連携でしょ」ってのがあります。ガジェット好きのみんなには是非応募してほしい!!!

ということで、Windows 8.1のストアアプリから連携できる周辺機器達を紹介します。そういえばもう再来週には8.1の正式リリースですねぇ。
紹介すると簡単に言っても、つながるデバイスは星の数ほどあって全てを紹介するのは無理…なので、つながるデバイスの種別と一部のデバイスについて紹介していきますね。

Windows 8.1ストアアプリで周辺機器を制御する方法を大別すると以下の3種類になります。

  1. WinRT APIで機器種別ごとに提供されるAPIで制御
  2. USBやBluetoothで接続されたデバイスを制御
  3. Windows ストアデバイスアプリとしてアプリを作りデバイスを制御

3番目のタイプは、Windows 8時代からもあった方法で、デバイスメーカーが、自社製品のコンパニオン的なストアアプリを開発&提供する際に使うプロフェッショナルな方法なのでこの投稿では割愛します。興味のある人はhttps://msdn.microsoft.com/ja-jp/library/windows/hardware/dn265141(v=vs.85).aspx を見てください。

 

 

1番目の「WinRT APIで機器種別ごとに提供されるAPIで制御」というのは、各種別ごとに名前空間が用意され操作用のAPが提供されている周辺機器です。

名前空間と種別を列記すると、

  • Windows.Devices.Portable Windows ポータブルデバイス メディアデバイスやストレージデバイス等
  • Windows.Graphics.Printing プリンター
  • Windows.Devices.Scanners イメージスキャナー
  • Windows.Devices.PointOfService バーコードリーダー、磁気カードリーダー
  • Windows.Media.Devices オーディオ、ビデオ機器

となっています。以上の機器でも素敵なアプリであれば十分コンテストの表彰対象になるので、周辺機器お持ちの方、チャレンジしてみてください。
…あれ?3D Printerがない?と思った方、大丈夫ですよ~。3D Printerは、通常(2D)のプリンターへの印刷の拡張として機能追加されていて、特に3D Printer用のWinRT APIはなく、Win32 and COM APIから提供されているIXpsDocumentPackageTarget3DやiXpsOMPackageWriter3D等も使って3D Printerへのデータを送ります。3D Printerの活用を考えている方は、https://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#printer を参考にしてチャレンジしてください。

 

 

次に2番目の「USBやBluetoothで接続されたデバイスを制御」について解説します。

USB接続の周辺機器でストアアプリから制御可能なのは、

  • HID(Human Interface Device)クラスで接続されるデバイス
  • WinUSBクラスで接続されるデバイス

の2種類です。HIDデバイスは、元々はキーボードやマウス、タッチパッドなどをつなぐクラスですが、データの入出力が簡単なので色々な周辺機器で利用されています。異色なところでは、https://www.dreamcheeky.com/thunder-missile-launcher のミサイルラウンチャーもHIDでPCにつながります。(ってことはストアアプリで制御可能ってことですな)。https://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#one の辺りを参考にしながらトライしてみてください。機会があればこのネタの投稿も今後しようと思ってます。

2番目のWinUSBクラスについては、https://msdn.microsoft.com/ja-jp/library/windows/apps/bg182882.aspx#three を参考にしてください。USBでつないで仮想COMポートにマップして.NET FrameworkのSerialPortクラスを使ってデスクトップアプリを開発していた方も多いと思います。SerialPortクラスのようにダイレクトにはストアアプリからは使えませんが、一旦WinUSBのデバイスとして認識させてしまえば、Windows.Devices.Usbのクラス群を使っての制御が可能です。RS232CでPCと通信するデバイスをもっている方は、エレコムのUC-SGT(USB To シリアルケーブル)を介して接続して試してみてください。 https://www2.elecom.co.jp/search/link/search.asp?group=/cable/usb/uc-s/gt/&link_type=3 で公開されているWindows 8.1でWinUSBとして認識させるためのInfファイルを使えば、ストアアプリからの制御が可能です。

Windows.Devices.HumanInterfaceDevice、Windows.Devices.Usbで提供されるAPIで制御可能な周辺機器は、元々Windowsにインストールされているインハウスドライバーで接続できるデバイスでないと駄目です。私個人の希望としては、シリアル通信のUSBで仮想COMポートで接続するタイプの周辺機器を販売しているメーカー企業の皆さんには、是非、WinUSBクラスとして周辺機器を認識させるINFファイルを提供していただきたいなと、思っている次第です。

さて、Bluetoothで接続されるデバイスです。最近はBluetoothでつながる周辺機器が増えているので、制御できるデバイスは多そうです。Bluetoothには、Bluetooth LE(4.0)と昔ながらのBluetooth 2.0系の2種類があります。Windows 8の時からBluetooth LEはストアアプリから制御できたのですが、健康機器をはじめとする様々なデバイス用に多くのプロファイル(GATT)が規定されていて、Windows 8.1では、GATT(Generic Attribute Profile)対応機能が大幅に強化されました。https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.devices.bluetooth.genericattributeprofile.aspx のGetCharacteristicUuidsクラスの定義を見てみましょう。実に多くの種類が規定されています。 これらはすべて標準ものなので、対応するGATTをサポートしている機器なら、どのメーカーから販売されているデバイスでもストアアプリから制御が可能です。https://msdn.microsoft.com/en-us/library/windows/apps/dn264576.aspx などにサンプル解説もあるので、デバイスを探して試してみてください。https://code.msdn.microsoft.com/windowsapps/USB-CDC-Control-sample-5ba19caa のサンプルは、そのまま動きます。

 

Bluetooth 2.0でSerial Port Profileでつながるデバイス(仮想COMポートにマップされる機器)は、結構多いです。例えば、Lego Mindstorms NXT/EV3 やNeuroSkyの脳波センサーもこの形式でつながります。Spheroもこのタイプ。Lego Mindstormsの場合は、私の一つ前のポストとhttps://nxtnet.codeplex.com を参考にするとほぼ動かせるはずです。詳細な解説も今後ブログで書いていく予定。Spheroは、既にWindows 8.1用のSDK https://github.com/orbotix/Sphero-Win-SDK が公開されています。サンプルもhttps://code.msdn.microsoft.com/windowsapps/Sphero-SDK-Sample-2b18913c から公開されてます。

 

 

最後に、デバイス連携アプリのストア申請ですが、審査チームにデバイスを送る必要はありません。以下を満たせばOKです。

  • アプリ申請時、アプリの説明で、どんな周辺機器、ハードウェアを接続するか、アプリを動かすために何か設定が必要ならそれも含めて、きちんと記載する。
  • 周辺機器がつながっていない場合にもちゃんと動く事。周辺機器の手に入れ方や、アプリの説明を表示するページなどをアプリに組み込んでおく

「デバイスと大連携でしょ」部門は、ここで解説した方法で接続できる周辺機器を活用したアプリなら何でもOKです。応募要項で紹介されているデバイスには特にこだわる必要はありません。好きなデバイスでスゲーアプリ、期待してます。