センサーのデータを SignalR でホストする (1)

WinRT API と ASP.NET SignalR を組み合わせたサンプルを作成してみました。
内容は次の通りです。

(1) (Windows ストア アプリからでなく) コンソール アプリケーションから WinRT API を呼び出して、
     Windows 端末のセンサーのデータをトラッキングする。

(2) そのデータを ASP.NET SignalR でセルフホストして、プッシュ送信する

(3) ブラウザーから (2) のサービスにアクセスしてデータを受け取る

(4) コンソール アプリケーションから (2) のサービスにアクセスしてデータを受け取る

(5) (2) のサービスをタスクバーの通知領域に常駐させる

ちなみに、このようにセンサーのデータをローカルでホストしてブラウザーからも利用できるようにする仕組みは、
Kinect for Windows や Leap Motion でも実現されています。
(Kinect for Windows SDK では、1.8 でサンプルとして追加)
ASP.NET SignalR を利用すれば、任意のデータをこれらと同様にホストすることができます。

ソースコードは WinRT-SignalR-Sample (GitHub) にあります。
以下では、これらの作成手順について順番に解説していきます。

 

(1) コンソール アプリケーションから WinRT API を呼び出す

(追記: Windows 8.1 向けにデスクトップ アプリから WinRT API を呼び出す (Windows 8.1) を、
Windows 10 向けにデスクトップ アプリから WinRT API を呼び出す (Windows 10) を書きました。)

まずは Visual Studio でソリューションを作成し、コンソール アプリケーション プロジェクトを作成します。

Windows 端末のセンサー情報を利用するための準備として、WinRT API への参照を追加します。
しかし WinRT API は、初期状態では Visual Studio 2012 の参照マネージャーに現れません。

次のようにプロジェクト ファイルを編集する必要があります。
プロジェクトを右クリックして、[プロジェクトのアンロード] をクリックします。

プロジェクトのアンロード

プロジェクトを右クリックして、[編集 (ProjectName).csproj] をクリックします。

プロジェクト ファイルの編集

プロジェクト ファイル (.csproj) を直接編集できるようになるので、最初の <PropertyGroup> に次の行を追加します。

<TargetPlatformVersion>8.0</TargetPlatformVersion>

TargetPlatformVersion を追加

編集が終わったら、このファイルを閉じます。
プロジェクトを右クリックして、[プロジェクトの再読み込み] をクリックします。

すると、参照マネージャーの左側に「Windows」が現れるようになるので、その中の「Windows」を追加します。

WinRT API を追加

 

さらに、参照マネージャーの右下の [参照] から、次のパスに存在する System.Runtime.WindowsRuntime.dll を追加します。

%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

これで、参照の準備は完了です。

なお、この手順の代わりに、最初に手動で編集したときに次のものを追加してもかまいません。

<Reference Include="Windows" />
<Reference Include="System.Runtime.WindowsRuntime">
  <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll</HintPath>
</Reference>

 

では、WinRT API を呼び出してセンサーのデータを取得するコードを記述します。
LightSensor クラスを利用して照度を、Compass クラスを利用して方位をトラッキングすることにします。

最初に

using Windows.Devices.Sensors;

を追加し、Main メソッドを実装します。


static void Main(string[] args)
{
    var lightSensor = LightSensor.GetDefault();
    lightSensor.ReportInterval = 500;
    Action<LightSensorReading> notifyLight =
        r => Console.WriteLine("Light: {0} lx", r.IlluminanceInLux);
    notifyLight(lightSensor.GetCurrentReading());
    lightSensor.ReadingChanged += (o, e) => notifyLight(e.Reading);

    var compass = Compass.GetDefault();
    Action<CompassReading> notifyCompass =
        r => Console.WriteLine("Compass: {0:N3} °", r.HeadingMagneticNorth);
    notifyCompass(compass.GetCurrentReading());
    compass.ReadingChanged += (o, e) => notifyCompass(e.Reading);

    Console.WriteLine("Press [Enter] to exit.");
    Console.ReadLine();
}


 

実行します。
端末に手をかざしたり端末を回転したりすれば、照度や方位が変化したことがレポートされます。

SensorsHost

このようにして、Windows ストア アプリでなくても、通常の .NET のアプリで WinRT API を利用できます。

 

ちなみに、System.Runtime.WindowsRuntime.dll への参照を追加しないで実装した場合、コンパイラ エラーとなります。
コンパイラが出力するメッセージに従うと、

  • System.Runtime.dll
  • System.Runtime.InteropServices.WindowsRuntime.dll

への参照を追加することでも解決できます。

 

つづく

次: センサーのデータを SignalR でホストする (2)

作成したサンプル
WinRT-SignalR-Sample (GitHub) (今回までの分)
WinRT-SignalR-Sample (GitHub)

バージョン情報
Visual Studio 2012
.NET Framework 4.5

参照
How to call WinRT APIs in Windows 8 from C# Desktop Applications
デスクトップ アプリからのWinRT API利用

カテゴリー: .NET Framework. タグ: , . 4 Comments »

コメント / トラックバック4件 to “センサーのデータを SignalR でホストする (1)”

  1. センサーのデータを SignalR でホストする (2) | Do Design Space Says:

    […] 前回のセンサーのデータを SignalR でホストする (1) では、 センサーのデータをトラッキングするコンソール アプリケーションを作成しました。 […]

  2. デスクトップ アプリから WinRT API を呼び出す (Windows 8.1) | Do Design Space Says:

    […] 以前に、センサーのデータを SignalR でホストする (1) という記事で、 Windows 8.0 の環境でデスクトップ アプリから WinRT API を呼び出す方法について書きましたが、 Windows 8.1 の環境の場合はその方法が少し異なるようです。 […]

  3. デスクトップ アプリから WinRT API を呼び出す (Windows 10) | Do Design Space Says:

    […] アプリから WinRT API を呼び出す方法について、 Windows 8.0 ではセンサーのデータを SignalR でホストする (1) という記事で、 Windows 8.1 ではデスクトップ アプリから WinRT API […]

  4. デスクトップ アプリから WinRT API を呼び出す (Windows 8.1) | Do Design Space Says:

    […] 以前に、センサーのデータを SignalR でホストする (1) という記事で、 Windows 8.0 の環境でデスクトップ アプリから WinRT API を呼び出す方法について書きましたが、 Windows 8.1 の環境でも同様に設定します。 (追記: Windows 10 向けにデスクトップ アプリから WinRT API を呼び出す (Windows 10) を書きました。) […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。