Windows 7 アプリ投稿キャンペーン連動企画 – Sensor & Location Platformにおける実装(WPF4/Silverlight4)
皆様、こんにちは!
本日は、Windows 7 アプリ投稿キャンペーン連動企画 - Windows 7最新機能実装アプリケーション開発セミナー に足を運んでいただき、誠に有難うございます。
私のセッション、ちょっと時間が押してしまい申し訳ありませんでしたが、使い方も、意外とハードルが低いことがお分かりいただけたのではないかと思います。
※こちらにスライドがありますので、ダウンロードしてみてください。ソースコードも(WPF及びSilverlight 4 OOBアプリケーション)公開しています。なお、SL4アプリケーションは、こちらのSensor7.NETをインストールする必要があります。
1.Webページのリンク
セッション内でご紹介した内容に関するWebページのリンクを下記にご紹介しておきます。
・Windows Sensor and Location プラットフォーム
https://www.microsoft.com/japan/whdc/device/sensors/default.mspx
・ Windows® API Code Pack for Microsoft® .NET Framework
https://code.msdn.microsoft.com/WindowsAPICodePack
・Windows 7 で実現する新しいアプリケーションの世界を動画でみよう
https://msdn.microsoft.com/ja-jp/windows/ff423757.aspx
2. センサー&ロケーションプラットフォーム解説
Windows 7に備わる「センサー&ロケーション」プラットフォームは、さまざまなセンサデバイスが取得した情報やGPSなどのロケーション情報を活用する共通の基盤であり、NET Framework 4やWPF 4で簡単にデータを活用できるAPI群を有しています。
従来のIT技術はどちらかというと、時間と空間の制約を極小化するという目的に進化してきました。それに対してセンサー&ロケーションプラットフォームは、多様な環境の情報を取り込み、バーチャルとリアルを融合することができます。当該データをBing Mapと組み合わせてマッシュアップしたり、Azureのクラウドストレージにデータをため込んで分析したり、という新しい取り組みが可能になります。
3.センサープラットフォームの利用とプログラミング
センサーでできること
センサーで広がるPCの可能性として、下記のようなものが挙げられます。
•人感センサー
◦オフィスの座席のプレゼンス情報
◦ディスプレイの自動OFF→エコにつなげる
•加速度センサー
◦モーションによる自然なユーザーインターフェイス
•温度センサー
◦室内温度計測と、パーソナル空調制御
•電力センサー
◦家電エコ
•脳波センサー
◦メンタルトレーニング
◦マーケティングの効果測定
従来、家電メーカーやセンサメーカー独自のSDK/APIが用意されていましたので、開発者は、各々のデバイスのためのソフトウェアを開発することになります。そのような場合、殆どはOEMメーカー等の技術者向けで、一般には非公開となるのが通例でした。
しかし、Windows 7のセンサー&ロケーションプラットフォームに対応して戴くことにより、業務アプリの開発者の方でも、趣味でプログラミングをしている方でも、学生さんでも、アプリケーションを作れるようになりました。
下記に、現在のセンサー&ロケーションプラットフォーム対応しているセンサーを表に纏めます。
Windows 7 SDK対応センサーリスト
これらは、Windows 7 SDKのSensors.hファイルで定義されています。勿論、独自のカテゴリやタイプを拡張することも可能です。サンプルアプリケーション(Silverlight 4のOOB)でも、これを実装しています。
センサー&ロケーションプラットフォームの利用
Windows API Code Packの利用
実際にアプリケーションを作成してみましょう。このセンサー&ロケーションプラットフォームは、COMのAPIで定義されています。
ただし、ロケーションは後述のとおり、.NET Framework 4の名前空間で定義されていますのでマネージドコードで記述できます。これに対してセンサーは、通常は、C++で開発することになります。
しかし、それではコーディングが大変だという方のため、またマネージドコードで開発したい開発者の方のために、Windows 7の新機能をC#やVBから利用できるように用意されたのが Windows API Code Pack です。これを使って実装していきます。
ただその場合でも、このWindows API Code Packは.NET用ですので、Silverlightからは利用できません。そこで、弊社の太田寛(エンベデッドエバンジェリスト)が、これをラップする Sensor7.NET というものを創りました。まだ未公開ですが、近日中にCodePlexに公開されます。どうぞよろしくお願いします。
センサーを使ったアプリケーションの開発
Sensors名前空間
一通りご覧ください。ここで重要なのは、AmbientLightSensor(=照度センサー)、BooleanSwitchArray(=タッチセンサー)、 そしてAccelerometer3D(=3次元加速度センサー) というそれぞれの名前です。
Windows API Code Packを使ってセンサーデータを取得する処理を書きます。
最初に、SensorManagerクラスのGetAllSensorsメソッドを利用し、Sensorクラスのインスタンスを取得します。その上で、SensorのStateプロパティがReadyのものだけをif文で取得していきます。そして、センサーの状態が変化したときのために、イベントハンドラSensorChangedを登録します。
センサデータを取得する
// 利用可能な全てのセンサーの取り出し
foreach (Sensor sensor in SensorManager.GetAllSensors())
{
if (sensor.State == SensorState.Ready)
{
…
}
}
// 繋がったセンサーの状態変更取得
SensorManager.SensorsChanged +=
new SensorsChangedEventHandler(ChangedHandler);
・・・
void ChangedHandler(SensorsChangedEventArgs e)
{
if (e.Changed==SensorAvailabilityChange.Addition)
これに対して、予めGetSensorByTypeIDメソッドでセンサのタイプを指定して使うこともできます。下記のソースコード例では、3次元加速度センサの現在値を取得し、DataReportChangedというイベントハンドラに登録しています。
特定のセンサーの取り出し
// 特定のセンサーの取り出し
foreach (Sensor sensor in SensorManager.GetSensorsByTypeId<Accelerometer3D>())
{
Accelerometer3D acc3d = sensor as Accelerometer3D;
// 現在値の取得
float currentX = acc3d.CurrentAcceleration[AccelerationAxis.X];
// 非同期ハンドラの登録
sensor.DataReportChanged +=
new DataReportChangedEventHandler(DataChanged);
}
・・・
void DataChanged(Sensor sensor, EventArgs e)
{
対応センサーデバイス一覧(PC)
下記に一覧を示します。
実際にこれらのデバイスを使った実装及びデモに関しては、下記のURLより、**デモ及びソースコード**を入手してください。
Windows 7 で実現する新しいアプリケーションの世界を動画でみよう
4 . ロケーションプラットフォームによる位置情報の取得
ロケーションを取得するには、.NET Framework 4で提供されるSystem.Device.Location名前空間を使用できます。これはセンサーとは違い、C#やVB等のマネージドコードでのプログラミングが可能です。
System.Device.Location
ここで取得できる位置情報としては、GPSなどで取得できる、緯度・経度といった物理的な情報に加えて、地名等、論理な情報も含まれます。
どのように実装するかを下記のソースでご紹介します。
まず、GeoCodinateWatcherのインスタンスを作ります。次いで、位置情報が変化したときを監視するオブジェクトを作り、位置情報の変化をイベントとするイベントハンドラを登録し、GeoCodinateWatcherを開始します。
位置情報を取得する
// Location情報の取得
GeoCodinateWatcher watcher = new GeoCodinateWatcher();
watcher.PositionChanged
+= new EventHandler
<GeoPositionChangedEventArgs<GeoCoodinate>>(PositionChanged);
provider.Start();
・・・
Void PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoodinate> e)
{
GeoCoordinate current = e.Position.Location;
double longitude = current.Longitude;
double latitude = current.Latitude;
DateTime changedTime = e.Position.Timestamp.DateTime;
}
位置情報が変わったとき、PositinChangedメソッドが呼び出され、引数のLocationプロパティをGeoCoodinateクラスのインスタンスに格納することになります。
その中からそこから、緯度(latitude)・経度(longitude)を取得できますし、Locationプロパティからは、位置情報が変わった時間も取得できます。これを利用すれば、GPSを利用して位置情報を取得して、Bing Maps上に時間データとともに表示するというような処理も可能です。
以上です。いかがでしょうか?
それでは、皆様の投稿をお待ちしております。ぜひよろしくお願いします!
鈴木 章太郎