Windows 7の Sensor and Location プラットフォームを C#で使う
はじめに
PC は、各種デバイスとのコネクティビティに関してかなり用途が広い。たとえば、USB だけでも数千種類ものデバイスに接続することができる。そして、その多くは何らかのセンサだと考えることができる。だが、実際のところセンサとは何なのだろうか?
Windows 7で言うセンサは、物理的な外の世界を測定可能なデバイスを指す。たとえば、センサは現在の温度、周辺光のレベル、位置(GPS のようなもの)、三次元方向の加速度などを検知することができる。全般的に見て、多くのデバイスがこの幅広い定義に収まる。
本稿では、Windows 7の一部となっている Sensor and Location Platform について考えたい。また、.NET や C#の開発者が自分の.NET アプリケーションからこのプラットフォームの機能を利用する方法も学ぶ。たとえば、.NET 4.0は便利なマネージコード API を使って位置センサを直接利用可能ににする新しいネームスペースを提供する。
本稿では、Microsoft Visual Studio 2010 Release Candidate (RC)以降のバージョンを使っているものと仮定する。.NET 4.0の新しい位置クラスは先の Beta 2リリースするから変わっているため、古いベータ版を使っている場合は、コードをを修正する必要が出てくる。Windows API Code Pack のセンサの例ではバージョン v1.0.1を使用した。コードパックは Microsoft Visual Studio 2008と2010の両方(Beta 2と RC の両バージョンを含む)と一緒に利用できることを覚えておきたい。
Sensor and Location Platform のアーキテクチャ
Windows 7が登場する前、数百種類もの各種センサデバイスをコードからコントロールする場合は、どれも多かれ少なかれ独自の方法を使っていた。デバイスは物理インターフェースが異なり、コントロールコマンドが異なり、出力フォーマットも異なっていた。これにより、デバイスごとに異なるプログラミングを強いられ、開発者は難しい対応を迫られた。
Windows 7が搭載する Sensor and Location Platform (SLP)は、(位置センサも含め)すべてのセンサデバイスに共通のプログラムモデルとドライバインターフェースを提供することでこの状況を変えようとしている(図1)。デバイスが Windows 7 SLP 互換のドライバを用意していれば(これらのドライバはユーザーモードベースであるため、カーネルベースのドライバよりも簡単に書くことができる)、Windows 7がデバイスをセンサとして適切に検知し、SLP API がデバイスにアクセスできるようにする。
図1 - Windows 7はセンサと位置デバイスを表示する新しいコントロールパネルアプレットを搭載
互換デバイスが存在する場合は、もっと低いレベルで SLP でサポートされる COM API を使ってそのデバイスとコミュニケーションを取ることができる。SLP はさまざまなタイプのデバイスをサポートし、これらのデバイスは GUID 値で特定できる。
.NET における Sensors and Location のサポート
Windows 7では、新しい Sensor and Location Platform API が COM ベースとなっているため、API はネイティブとマネージコードアプリケーションの両方で利用できる。.NET 開発者としては、これらの COM クラスやインターフェースを中心に独自のラッパを作成するか、既製のコードを使うことができる。
現在、基本的には2つのオプションがあり、無償の Windows API Code Pack を使って SLP 機能を利用するか、既に Visual Studio 2010で.NET 4.0を使っている場合は.NET 4.0の新機能を使って SLP が提供する機能のパーツを利用することができる。
.NET 4.0の方を使いたい場合は、System.Device.Locationという新しいネームスペースがある。このネームスペースは Windows 7の Location API のサポートを搭載しているが、(少なくとも今のところは) Sensor プラットフォームを直接サポートしない。したがって、.NET 4.0単体では位置サービス(GPS など)を使えるが、残りの機能については Windows API Code Pack を使い続ける必要がある。
実際のところ、System.Device.Locationは.NET 4.0のパーツであるため、技術的には、Windows XP マシンでもクラスやメソッドにアクセスできる。しかし、.NET クラスが使えても、これらは Windows 7を使っていない限り位置システムのステータスを常に Disabled として報告する。したがって、.NET のクラスが使えても、OS がそれをサポートしているわけではない。
デバイスのプログラミングをしている開発者が抱く共通の疑問は、「手元に本物のハードウェアがなくても開発に着手し、あとから本物のデバイスを使ってテストを始めることはできるのだろうか? 」というものだ。そして、その答えはセンサが接続されている限りは「イエス」だ。Windows 7 SDK には物理光センサをエミュレートする仮想デバイスが含まれており、Windows 7にそれを本物の デバイスだと思わせるドライバも搭載されている。これにより、開発を始めるのが簡単になる。
ただ、位置ベースサービスに関しては今のところ物理デバイスを用意する必要がある。もちろん、GPS デバイスを内蔵し、Windows 7互換の SLP ドライバを搭載したノート PC などがあれば、それでもうまくいく。しかし、一般的に言えば大半の GPS デバイスは外付けになっている。
センサ開発への着手
Microsoft Visual Studio を使って新しい Sensor and Location Platform 用のセンサアプリケーションの開発を始めるには、2008もしくは2010のいずれかのバージョン(執筆時点のリリース候補は最新の2010バージョン)、Windows API Code Pack、そして言うまでもなく Windows 7が必要になる。
手元の PC に接続できる物理センサデバイスがあれば何も心配ない。ない場合も、Microsoft が Freescale Semiconductor を紹介してくれる。彼らは「Flexis JM Badge Board」というハードウェアを49ドルで販売している。これは Freescale から直接注文することが可能で、これを自分のテスト基盤として使うことができる。
手元に物理デバイスがなくても開発に着手したいという開発者には、Windows 7 SDK キット(図2)をダウンロードしてインストールする必要がある。このキットのインストールは時間がかかる(x86と x64のどちらのバージョンが必要なのか調べておくこと)が、いったん作業が終了すれば、SDK インストレーションパス(デフォルトではC:?Program Files?Microsoft SDKs?Windows?v7.0)の下の Bin フォルダからVirtualLightSensor.exeアプリケーションを実行することができる。これでプログラムで使う仮想センサが手に入った。
図2 - コードのテスト時に便利な仮想光センサを利用可能にする Windows 7 SDK キット
仮想光センサアプリケーションをうまく実行するには、その前に適切なドライバを Windows 7にインストールする必要があることに注意したい。これは、管理者特権のコマンドプロンプトで「pnputil -a VirtualLightSensorDriver.inf」コマンドを使うことで可能になる。.INFファイルは SDK キットの Bin ディレクトリにある(図3).
図3 - PnpUtilを使った仮想光センサ用ドライバのインストール
使っているのが物理センサであろうと、Windows 7 SDK によって提供される仮想センサであろうと、デバイスはコントロールパネルの「位置センサーとその他のセンサー」で見えるはずだ。ここで自分のデバイスが見えたら、プログラミングを開始することができる。
まず最初は、Windows Forms や Windows Presentation Foundation (WPF)アプリケーションなど、Microsoft Visual Studio でプロジェクトを作成もしくは開くことからだ。次に、Windows API Code Pack (ダウンロード先の URL は「参考文献」の項参照)に参照を追加すれば準備完了だ。参照しなければならない DLL の名前は、Microsoft.WindowsAPICodePack.dllおよびMicrosoft.WindowsAPICodePack.Sensors.dllだ。参照がそろったら、Microsoft.WindowsAPICodePack.Sensorsネームスペースを使い始めることができる。
このネームスペースには、システムでサポートされるセンサ全体の情報を入手できるSensorManagerという名前のクラスが含まれる。以下に例を示す。
SensorList<Sensor> sensors =
SensorManager.GetAllSensors();
MessageBox.Show("There are " + sensors.Count +
" sensor(s) installed on the system.");
http://japaninternetcom.pheedo.jp/click.phdo?i=5edc4fbe05828dca4eb982b9d5b2209a
今日はこの当たりは雨が降っています、、、。
雨が降る日はたいがい憂鬱ですが、そうでない日もまれにあります。
雨が降らなければ生きていけないものもいるのですもんね。。
人間何が起こってもそれをどうとらえるかで違う人生になります。
PICKUP
債務整理は専門家へ相談しようサラ金からの借金を任意整理探偵に浮気調査子供の返済問題を解決 個人民事再生東京メトロ東西線葛西駅家出人捜索の依頼料相場フランダース・レッド・エールオペラ森はるか アイドル情報調査報酬 盗聴・盗撮器発見PR