Upload
ryota-togai
View
945
Download
5
Embed Size (px)
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ストアアプリとマイコンを連携させて、デバイス連携するタッチアプリを作ろう!