37
Windowsストアアプリでシリアル通信 @garicchi

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Windowsストアアプリでシリアル通信

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

@garicchi

Page 2: Windowsストアアプリでシリアル通信

自己紹介

がりっちです

栂井良太(Togai Ryota)

Microsoft MVP for Windows Platform Development

http://garicchi.com

Page 3: Windowsストアアプリでシリアル通信

セッションの目的

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

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

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

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

Page 4: Windowsストアアプリでシリアル通信

WindowsRuntimeのデバイスAPI

WindowsRuntimeの標準デバイス制御API

プリンター スキャナー HID

シリアル通信

ソケット通信

既存のデバイス向けの

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

デバイスとの通信API

Bluetooth GATT

Bluetooth Rfcomm

Page 5: Windowsストアアプリでシリアル通信

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

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

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

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

Page 6: Windowsストアアプリでシリアル通信

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

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

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

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

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

Page 7: Windowsストアアプリでシリアル通信

デバイス列挙

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

能動的なデバイス決定

DeviceInformation

W

I

N

D

O

W

S

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

Page 8: Windowsストアアプリでシリアル通信

デバイスウォッチャー

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

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

受動的なデバイス決定

DeviceInformation

W

I

N

D

O

W

S

接続 イベント発生!

Page 9: Windowsストアアプリでシリアル通信

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

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

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

Page 10: Windowsストアアプリでシリアル通信

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

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

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

プリンター

スキャナー HID

Bluetoothシリアル通信

ソケット通信

ImageScanner HidDevice

UsbDevice Rfcomm or GATT

PrintDocument StreamSocket

DeviceInformation

ID

Page 11: Windowsストアアプリでシリアル通信

シリアル通信

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

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

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

Page 12: Windowsストアアプリでシリアル通信

WindowsRuntimeとシリアル通信

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

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

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

WinUSB

Page 13: Windowsストアアプリでシリアル通信

WindowsRuntimeとシリアル通信

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

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

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

Page 14: Windowsストアアプリでシリアル通信

WinUSBでのデバイス認識

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

GUIDの登録方法は2つ

Windows

VendorIDProductID

VendorID,ProductID GUID

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

Page 15: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 16: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 17: Windowsストアアプリでシリアル通信

GUIDの作成

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

レジストリ形式

Page 18: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 19: Windowsストアアプリでシリアル通信

VendorIDとProductID

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

4桁の値をそれぞれ取得

Page 20: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 21: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 22: Windowsストアアプリでシリアル通信

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

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

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

Page 23: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 24: Windowsストアアプリでシリアル通信

カスタムinfファイル作成

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

VendorID、ProductIDを登録、GUIDを登録

Page 25: Windowsストアアプリでシリアル通信

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

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

Page 26: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 27: Windowsストアアプリでシリアル通信

レジストリにGUIDを登録

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

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

Page 28: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 29: Windowsストアアプリでシリアル通信

ドライバの適用

標準のArduinoドライバを削除

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

Page 30: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 31: Windowsストアアプリでシリアル通信

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

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

classIDは02 * *

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

Page 32: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 33: Windowsストアアプリでシリアル通信

デバイス特定

取得したIDからDeviceInformationを取得

vendorID productID

Page 34: Windowsストアアプリでシリアル通信

WindowsRuntimeのシリアル通信の流れ

キーボードがついている

yes

no

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

レジストリにGUID登録

GUID値作成vendorID

productID取得

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

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

デバイス列挙USBDevice API

で制御

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

&インストール

スタート

ゴール

Page 35: Windowsストアアプリでシリアル通信

UsbDevice

標準APIはUsbDeviceクラスを使う

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

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

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

Page 36: Windowsストアアプリでシリアル通信

DEMO

Page 37: Windowsストアアプリでシリアル通信

まとめ

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

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

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

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