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対応センサーリスト

image

これらは、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 です。これを使って実装していきます。

image

ただその場合でも、このWindows API Code Packは.NET用ですので、Silverlightからは利用できません。そこで、弊社の太田寛(エンベデッドエバンジェリスト)が、これをラップする Sensor7.NET というものを創りました。まだ未公開ですが、近日中にCodePlexに公開されます。どうぞよろしくお願いします。

センサーを使ったアプリケーションの開発

Sensors名前空間

一通りご覧ください。ここで重要なのは、AmbientLightSensor(=照度センサー)、BooleanSwitchArray(=タッチセンサー)、 そしてAccelerometer3D(=3次元加速度センサー) というそれぞれの名前です。

image

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)

下記に一覧を示します。image

実際にこれらのデバイスを使った実装及びデモに関しては、下記のURLより、**デモ及びソースコード**を入手してください。

Windows 7 で実現する新しいアプリケーションの世界を動画でみよう

4 . ロケーションプラットフォームによる位置情報の取得

ロケーションを取得するには、.NET Framework 4で提供されるSystem.Device.Location名前空間を使用できます。これはセンサーとは違い、C#やVB等のマネージドコードでのプログラミングが可能です。

System.Device.Location

image

ここで取得できる位置情報としては、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上に時間データとともに表示するというような処理も可能です。

以上です。いかがでしょうか?

それでは、皆様の投稿をお待ちしております。ぜひよろしくお願いします!

鈴木 章太郎