Windowsストアアプリでシリアル通信

Preview:

DESCRIPTION

2014/11/22 Iot勉強会 feat.ワンチップマイコン会 at 長野で発表しました。

Citation preview

Windowsストアアプリでシリアル通信

@garicchi

自己紹介

がりっちです

栂井良太(Togai Ryota)

Microsoft MVP for Windows Platform Development

http://garicchi.com

セッションの目的

Windowsストアアプリとデバイス連携の概要を知る

Windowsストアアプリのシリアル通信を学ぶ

WindowsストアアプリとArduinoを通信させてみよう

Windowsストアアプリの開発に興味を持っていただけたら..

WindowsRuntimeのデバイスAPI

WindowsRuntimeの標準デバイス制御API

プリンター スキャナー HID

シリアル通信

ソケット通信

既存のデバイス向けの

制御API 通信インターフェースを持つ

デバイスとの通信API

Bluetooth GATT

Bluetooth Rfcomm

ストアアプリからデバイス制御の流れ

デバイスは基本的にIdで一意に定める

デバイス列挙して使用したいデバイスIdを取得→各種APIに渡す

使用デバイスの決定 デバイスIDの取得 各APIで制御

ストアアプリからデバイス制御の流れ

使用デバイスの決定方法は2つ

1. 能動的なデバイス決定(デバイス列挙)

2. 受動的なデバイス決定(デバイスウォッチャー)

使用デバイスの決定 デバイスIDの取得 各APIで制御

デバイス列挙

今使用可能なデバイス一覧から使いたいデバイスを一つ定める

能動的なデバイス決定

DeviceInformation

W

I

N

D

O

W

S

使いたいデバイスを一つ定める

デバイスウォッチャー

デバイスが接続or切断されたときをトリガーにイベント発動

デバイスが接続されたときに制御開始できる(アプリが起動している場合のみ)

受動的なデバイス決定

DeviceInformation

W

I

N

D

O

W

S

接続 イベント発生!

ストアアプリからデバイス制御の流れ

デバイス決定で取得したDeviceInformationを各種APIに渡す

使用デバイスの決定 デバイスIDの取得 各APIで制御

各種APIにIDを渡して制御開始

取得したDeviceInformationからIDを各種APIに渡す

プリンターとソケット通信は少し特殊

プリンター

スキャナー HID

Bluetoothシリアル通信

ソケット通信

ImageScanner HidDevice

UsbDevice Rfcomm or GATT

PrintDocument StreamSocket

DeviceInformation

ID

シリアル通信

データを1ビットずつ伝送経路に流していく通信方法

おもに物理接続で利用されている通信方法(RC232Cとか)

http://www.contec.co.jp/product/device/serial/basic.html

WindowsRuntimeとシリアル通信

Windowsストアアプリからシリアル通信するのはかなりめんどくさい

デスクトップアプリのシリアル通信は楽だった

WindowsRuntimeはセキュアなポリシーで設計

WinUSB

WindowsRuntimeとシリアル通信

WindowsRuntimeではCOMポート指定でのシリアル通信ができない

WinUSBドライバで接続させると便利

デバイスをWinUSBドライバで認識するためには?

WinUSBでのデバイス認識

デバイスが接続されたときに、VendorIDとProductIDから内部のGUIDを取得する→WinUSBで認識可能

GUIDの登録方法は2つ

Windows

VendorIDProductID

VendorID,ProductID GUID

1.カスタムinfファイル2.レジストリ直接編集

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

GUIDの作成

GUID=サービスを識別するための一意のID

レジストリ形式

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

VendorIDとProductID

VendorID=製作会社ID、ProductID=製品のID

4桁の値をそれぞれ取得

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

ドライバ署名の強制の無効化

PCの設定→保守と管理→回復→PCの起動をカスタマイズする→スタートアップ設定→7キーを押す

キーボードがないと7キーが押せない!

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

カスタムinfファイル作成

http://garicchi.com/?p=16711 に書いてあるinfファイルのテンプレートから.infファイルを作成

VendorID、ProductIDを登録、GUIDを登録

カスタムinfファイルインストール

作成したinfファイルを右クリックからインストール

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

レジストリにGUIDを登録

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_****&PID_*****>

の下の更に下の改装にDevice Parametersがあるので、その中に新規で文字列を追加

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

ドライバの適用

標準のArduinoドライバを削除

WinUSBドライバをインストール

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

マニフェストファイルを編集

マニフェストファイルにVendorIDとclassIDを記述

classIDは02 * *

http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/dn263144.aspx

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

デバイス特定

取得したIDからDeviceInformationを取得

vendorID productID

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

ドライバー署名の強制を無効化

レジストリにGUID登録

GUID値作成vendorID

productID取得

標準ドライバアンインストール

WinUSB適用マニフェストファイル編集

デバイス列挙USBDevice API

で制御

カスタムinfファイルの作成

&インストール

スタート

ゴール

UsbDevice

標準APIはUsbDeviceクラスを使う

ただしかなりめんどくさい

簡易化したUsbSerialクラスを作りました

http://garicchi.com/?p=16711

DEMO

まとめ

Windowsストアアプリとシリアル通信はかなりめんどくさい

可能ならBluetoothとかSocket通信とかにした方がいいかも?

詳しくはhttp://garicchi.com/?p=16711にまとめています

Windowsストアアプリとマイコンを連携させて、デバイス連携するタッチアプリを作ろう!

Recommended