Rfcomm WindowsRuntimeではBluetoothの通信プロファイルの一つである、Rfcommをサポートしています。 Rfcommとは、通信上はBluetoothで接続されているデバイスと通信を行いますが、見かけ上はただのシリアル通信としてプログラミングできるプロファイルです。   シリアル通信とはCOMポートを使って有線で通信を行う方法ですが、RfcommではBluetoothで繋がったデバイスに仮想的なCOMポートを提供し、そのCOMポートにむかってシリアル通信をするだけで見かけ上のシリアル通信を無線で実現することができます。   RBT-001 今回は接続するデバイスとして、ArduinoとRBT-001というBluetoothモジュールを用いて通信を行います。 回路図はこんな感じです。 ArduinoのRXソケットをRBT-001のTXソケットに、TXソケットをRXソケットにつなぎます。     あらかじめArduino側にプログラムを書き込んでおきます。 シリアル通信でデータが流れてくるとそのままデータをシリアル通信で流し、LEDを1秒光らせる単純なものです。

ここまでできると、RBT-001からBluetoothの電波が飛ぶのでWindows側から認識できます。 ペアリングしておきましょう。PINコードはデフォルトで「0000」です。   SeviceGUID RBT-001でRfcommを使うとき、サービスを一意に特定するためにGUID値を利用します。 これはあらかじめRBT-001が提供するGUID値を使います。   コントロールパネルからEasyBTのプロパティを見ます。 ハードウエアのタブからBluetoothリンク経由の標準シリアルを選択し、「プロパティ」を押します。     詳細タブを開き、BluetoothサービスGUIDを見るとGUIDを取得できます。 このGUIDを使用するのでコピ-しておきます。   マニフェストファイルに書き込む Rfcommで通信するにはマニフェストファイルに書き込まなければいけません。 Package.manifestファイルを右クリックして「コードを表示」をおしましょう。   Capabilityタグ内に以下のタグを追加します。 m2:FunctionタグのType属性値は先ほど取得したGUIDに置き換えてください

    RfcommDeviceService WindowsRuntimeでRfcommを使うにはRfcommDeviceServiceAPIを使います。 まずBluetoothデバイスを特定しましょう。 先ほどのGUID値を使うので変数として宣言しておきます。 GUID値を先ほどコピーしたものと置き換えてください。

  RfcommDeviceServiceクラスのGetDeviceSelectorメソッドを使ってセレクターを作ります。 セレクターを使ってDeviceInformationのFromAsyncメソッドでデバイスを特定します。 あとはDeviceInformationのIDからRfcommDeviceServiceクラスを初期化します。

  次に作成したRfcommDeviceServiceクラスのConnectHostNameとConnectServiceNameを使ってStreamSocketを作ります。 StreamSocketができたらOutputStreamとInputStreamを使ってDataWriterとDataReaderを作ります。  

  […]

WinUSB WindowsRuntimeでは、サードパーティー製のドライバで接続されたデバイスとのシリアル通信が禁止されています。 基本的にWindowsストアアプリなどからUSBデバイスとシリアル通信を行うには、USBデバイスが「WinUSB.sys」というドライバで認識されていなければいけません。 たとえばエレコムのUC-SGTなどは、RS232C→USBの変換ケーブルですが、公式でWinUSBをインストールするドライバパッケージ(中身はinfファイル)が提供されているのでドライバを入れれば、UC-SGTで接続されたデバイスはWindowsストアアプリからシリアル通信が可能となります。 とにかく、WindowsRuntimeでシリアル通信を行うには、デバイスをWinUSBというドライバで認識できなければ使うことができません。   デバイスをWinUSBとして認識させる2つの方法 デバイスをWinUSBとして認識させるには2つの方法があります。 カスタムinfファイルを作成する方法 (条件 端末に物理キーボードが付いている場合) レジストリにGUIDを登録する方法 (条件 レジストリをいじっても問題無い場合)   1番目のカスタムinfファイルを作成する方法は、端末に物理キーボードが付いていることが条件になります。 なぜなら、オリジナルなinfファイルをつくり、インストールするためデジタル証明の無いドライバーをインストールする許可を端末に与えなければいけません。 Windows8.1でデジタル証明のないドライバをインストールする許可を与えるには、PCの設定→保守と管理→回復→PCの起動をカスタマイズする→トラブルシューティング→詳細オプション→その他の修復オプションを表示→スタートアップ設定に行き、 「7キー」を押してドライバー署名の強制を無効にするを押さなければいけません。     しかし端末に物理キーボードなどがついていない場合、7キーを押すことができません。USBキーボードを接続しても認識しない場合が多いので、ラップトップなど、PCに物理キーボードが標準で付いている場合はこちらのカスタムinfファイルを作成する方法をとれますが、端末に物理キーボードがついていない場合、レジストリをいじる必要があります。   2番目のレジストリにGUIDを登録する方法は、端末に物理キーボードがついていない場合使用します。 そもそもすべてのデバイスはデバイスマネージャからWinUSBドライバをドライバとして選択すればドライバを適用できます。 しかし、認識するときにシステムが登録されているGUIDにデバイスと一致するものがあるかどうか見に行くのですがその時にデバイスのGUIDがなくて認識できません。 そこで、レジストリにデバイスのGUIDを登録することでデバイスを認識することができます。 GUIDとはGlobally Unique Identifierの略でなにかを一意に決定する識別子(ID)です。 このような形をしています。{d53fa365-5ag4-4436-938b-9db4734c6ca3}   Arduinoを接続してみる Arduinoマイコンとは様々IOが標準で搭載されたAVRマイコンで非常に使い勝手がよく、シリアル通信をすることもできます。 今回はArduino UNOを接続してみたいと思います。   カスタムinfファイルを作成する方法 こちらの方法でデバイスが認識できればGUIDを追加する方法はしなくてもよいです。 infファイルとは、Windowsのソフトウエアをインストール用の設定が記述されたファイルのことです。 事前にOSにinfファイルをインストールしておくと、デバイスが接続されたときそのinfファイルを仲介してWinUSBドライバを読み込んでくれます。 カスタムinfファイルとは、そのinfファイルを自分で記述して事前にインストールしておくことを指します。   ではカスタムinfファイルを作成してみましょう。 以下のテキストデータをテキストエディタで書き込みます。

編集すべきところは %DeviceName% = と [Dev_AddReg] と ManufacturerName= と DeviceName= […]

ヒューマンインターフェイスデバイス ヒューマンインターフェイスデバイス(HID)とは、マウスやキーボードなど、人とPCとの基本的なやりとりをする装置を統一的なプロファイルで表したもので、HID対応デバイスならばどのようなデバイスであっても統一的な処理でアクセスすることができます。   どのようなHIDデバイスがあるのかはUSB.orgのサイトにあるHID Usage tableのPDFを見るとわかります。 非常に沢山あり、KeyboardやGame ControlsからVR Controlsまで、様々なデバイスをサポートしています。 自分のPCにどのようなHIDデバイスがあるのかは、デバイスマネージャーからヒューマンインターフェイスデバイスの項目を見るとわかります。     WindowsRuntimeでは標準でHIDデバイスの入出力をサポートしており、HIDDeviceクラスによって扱うことができます。 今回はHIDデバイスの一つであるXBOX360のコントローラを使って入力値をとってみたいと思います。   デバイスを特定するID HID対応のデバイスを特定するには4つのIDが必要となっています。 UsagePage(デバイスのカテゴリID) UsageId(デバイスの種類ID) VendorId(デバイスの製造者ID) ProductId(デバイスの製品ID) の4つが必要となります。   UsagePageとUsageIdについてはUSB.orgのサイトにあるHID Usage tableのPDFを見て調べます。 GamePadはGeneric DesktopPage(0x01)のGame Pad(0x05)なので UsagePageは0x01、UsageIdは0x05となります。   続いてVendorIdとProductIdです。 これはデバイスのプロパティを見るとわかる場合が多いです。 デバイスマネージャーからXBox360コントローラのプロパティを見て、詳細タブのプロパティからハードウエアIDの項目を見ると、VIDとPIDがわかります。 したがってこの場合、VendorIDはVIDのところを見て、0x045E、ProductIDはPIDのところを見て0x028Eということがわかります。   もしこの方法でVendorIDとProductIDが取得できない場合、取得ツールが公開されているのでMicrosoftの太田さんの記事を呼んでVendorIDとProductIDを取得してください。 WindowsストアアプリからHIDデバイスを制御する   マニフェストファイルを編集する 4つのIDを取得できたら、マニフェストファイルに4つのIDを書いておく必要があります。 ソリューションエクスプローラーからPackage.manifestファイルを右クリックして、コードを表示します。   Packageタグにxmlns:wb=”http://schemas.microsoft.com/appx/2013/manifest”属性を追加します。

そしてCapabilityタグ内に<wb:DeviceCapability>タグを追加します。 DeviceタグのId属性には”vidpid:{vendorId} {productID}”の形式でVendorIDとProductIDを入力します。 FunctionタグのType属性には”usage:{UsagePage} {UsageId}”の形でUsagePageとUsageIDを指定します。  

  今回の場合Package.manifestファイルはこのようになりました。

[…]

スキャナーを取得する WindowsRuntimeではイメージスキャナーを標準でサポートしています。 使用するスキャナーを決定するためにはDeviceInformationクラスのFindAllAsyncでDeviceClass列挙体のImageScannerを渡してスキャナーを列挙します。   コレクションからどのスキャナーを使うかを決定し、そのIdをImageScannerクラスのFromIdAsyncメソッドに渡してImageScannerを初期化します。

 

DeviceClassを使いましたがImageScannerのGetDeviceSelectorをFindAllAsyncメソッドにわたすことでフィルタリングも可能です。

  スキャンしてStorageFileに保存する スキャナーが決定できたらScanFileToStorageFolderAsyncメソッドによってスキャンを開始することができます。 今回は画像ライブラリに保存するのでマニフェストファイルの機能→画像ライブラリにチェックを入れましょう。

  スキャンしてプレビューする プレビュー機能のあるスキャナーならばスキャン結果をプレビューすることが可能です。 IsPreviewSupportedメソッドをつかって、プレビュー機能をスキャナーがサポートするかを判断し、 ScanPreviewToStreamAsyncメソッドつかってストリームにプレビューデータを流します。 あとはInMemoryRandomAccessStreamをつかってImageコントロールにストリームを流します。

  サンプルコード XAML

C#

 

プリンターへのアクセス WindowsRuntimeでは周辺機器へのアクセスはDeviceInformationクラスでデバイスを列挙して特定しますが、プリンターの場合はチャームのデバイス→印刷を表示することで現在アクセス可能なプリンター一覧が表示され、ユーザーが任意のプリンターを選択するという形になります。   したがって、プリンターで印刷をするために開発者側がすることは、プリントしたいドキュメントをPrintManagerクラスに投げるだけです。 どのプリンターで印刷するか、印刷をするかどうかはユーザーの選択に任せることになっています。   印刷用ページの作成 WindowsRuntimeで印刷を行うことができるものは、UIElementとそれを継承するクラスです。 UIElementはほとんどのXAMLコントロールの基底となるクラスですのでほとんどのコントロールは印刷が可能です。 したがって、画像やドキュメントなどを印刷したい場合、一度XAMLコントロール上に置きます。   今回は3ページ印刷するために一つ一つのページをCanvasコントロールで定義します。

  XAMLでページが定義できたら、一度コンストラクタでUIElementのコレクションに入れておきましょう。 ページは複数(今回は3ページ)なのでUIElementのコレクションにいれることで扱いやすくなります。

 PrintDocumentの作成 印刷するドキュメントはPrintDocumentというクラスで定義されます。 このクラスは少し特殊で、何かしらの要求が来た時、そのイベントを使って印刷するコンテンツを追加します。   PrintDocumentを使うには、まずPrintDocumentをnewします。

  つづいて、プレビュー要求がきたときのイベントを処理します。 Paginateイベントはプレビュー要求がきたときにプレビューページの最大数を設定する必要があります。

GetPreviewPageイベントはプレビュー要求がきたときにプレビューページをすべて設定します。

AddPagesイベントは印刷要求がきたときに印刷したいページをすべてAddPageします。 すべてAddできたらAddPagesCompleteメソッドを最後に呼んで印刷ページの追加を完了します。

これでPrintDocumentの処理は完了です。 PrintMangerでチャームに登録 先ほど作成したPrintDocumentをチャームに登録するにはPrintManagerクラスを使います。 このクラスもPrintDocument同様、要求イベントが来た時に応じで処理をします。   PrintTaskRequestedイベントはユーザーがチャームの印刷を押した時に発生します。 ここでCreatePrintTaskメソッドによってPrintDocumentのDocumentSourceプロパティを渡します。 CreatePrintTaskは別スレッドで呼び出されるのでDispatcher.RunAsyncメソッドでUIスレッドに戻します。   また、CreatePrintTaskメソッドは第一引数で印刷Paneに表示されるタイトルをかえることができます。

印刷する 以上で印刷ドキュメントの登録は完了しました。 あとは端末をプリンターに接続し、アプリからチャーム→デバイス→印刷を押すと印刷することができます。   印刷チャームを表示する 印刷チャームを表示することでユーザーに印刷を促すこともできます。 印刷チャームを表示するにはPrintMangerのShowPrintUIAsyncメソッドを使います。

  サンプルコード XAML

[…]