MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensのRestAPIをコンソールアプリ(.NET Framework)で実行する その1(HoloLensの情報取得)

本日は HoloLens の調査枠です。
HoloLens は開発者モードで DevicePortal がONになっているとき、RestAPI が利用できます。
前回、Python を用いて、RestAPI で HoloLens の情報取得を行いました。
bluebirdofoz.hatenablog.com
今回はこれをコンソールアプリ(.NET Framework)で試してみます。
f:id:bluebirdofoz:20190302182526j:plain

なお、HoloLens で利用可能な API は以下の公式ページにまとめられています。
・デバイス ポータル コア API リファレンス(すべての Windows 10 デバイスに共通する API)
docs.microsoft.com
・デバイス ポータル Mixed Reality API リファレンス(HoloLens で利用できるすべての REST API の拡張リスト)
docs.microsoft.com

コンソールアプリ(.NET Framework)の作成

コンソールアプリ(.NET Framework)の作成は VisualStudio で行います。
bluebirdofoz.hatenablog.com

VisualStudio を起動し、メニューから ファイル -> 新規作成 -> プロジェクト を選択します。
f:id:bluebirdofoz:20190302182540j:plain

「新しいプロジェクト」ダイアログが開きます。
[Visual C#]の[コンソールアプリ(.NET Framework)]を選択します。
HoloLens の開発環境を整えたPCであれば、追加インストールが不要で利用できます。
[名前]、[場所]を設定して[OK]ボタンをクリックします。
f:id:bluebirdofoz:20190302182550j:plain

すると、新規プロジェクトが作成されます。
自動生成される Program.cs が処理の開始位置である main 関数を持っています。
f:id:bluebirdofoz:20190302182601j:plain

サンプルコード

試しに HoloLens のバッテリー情報を取得するサンプルコードを作成します。
バッテリー情報を取得する API は以下の /api/power/battery です。
f:id:bluebirdofoz:20190302182827j:plain

RestAPI へのアクセスには HttpClient クラスを利用します。
以下の通り、Program.cs を修正しました。
・Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// HttpClient を利用するための追加
using System.Net.Http;

namespace HoloLensAPIConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            // バッテリー情報の取得処理を呼び出す
            HttpHoloAccess access = new HttpHoloAccess();
            access.GetBattery();

            return;
        }

        /// <summary>
        /// HoloLensのRestAPIへのアクセスクラス
        /// </summary>
        class HttpHoloAccess
        {
            // HoloLensの接続設定
            // IPアドレス、ユーザー名、パスワード
            string Target_ipaddress { get; }
            string Target_username { get; }
            string Target_password { get; }

            /// <summary>
            /// インスタンス生成(指定無し)
            /// </summary>
            public HttpHoloAccess()
            {
                // 指定がなければデフォルト設定を利用する
                Target_ipaddress = "127.0.0.1:10080";
                Target_username = "USERNAME";
                Target_password = "PASSWORD";
            }

            /// <summary>
            /// インスタンス生成(接続先設定あり)
            /// </summary>
            /// <param name="a_ipaddress">HoloLesnのIPアドレス</param>
            /// <param name="a_username">DevicePortalのユーザー名</param>
            /// <param name="a_password">DevicePortalのパスワード</param>
            public HttpHoloAccess(string a_ipaddress, string a_username, string a_password)
            {
                // 接続先の指定があれば設定を行う
                Target_ipaddress = a_ipaddress;
                Target_username = a_username;
                Target_password = a_password;
            }

            /// <summary>
            /// インスタンス生成(接続先設定あり)
            /// </summary>
            /// <param name="a_ipaddress">HoloLesnのIPアドレス</param>
            /// <param name="a_username">DevicePortalのユーザー名</param>
            /// <param name="a_password">DevicePortalのパスワード</param>
            public HttpHoloAccess(string a_ipaddress, string a_username, string a_password)
            {
                // 接続先の指定があれば設定を行う
                target_ipaddress = a_ipaddress;
                target_username = a_username;
                target_password = a_password;
            }

            /// <summary>
            /// バッテリー情報の取得関数
            /// (結果はログ出力)
            /// </summary>
            public async void GetBattery()
            {
                // 利用するAPIを指定(バッテリー情報)してURLを作成する
                string api = "/api/power/battery";
                string url = "http://" + Target_ipaddress + api;

                // Http アクセスに HttpClient を利用する
                HttpClient client = new HttpClient();
                string urlRequest = string.Format("{0}", url);

                // GETメソッドのリクエストメッセージを作成
                HttpRequestMessage request = new HttpRequestMessage
                {
                    Method = HttpMethod.Get,
                    RequestUri = new Uri(urlRequest)
                };

                // ヘッダに Basic 認証を設定
                // ユーザー名とパスワードを指定
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue
                (
                    "Basic",
                    Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", Target_username, Target_password)))
                );

                // リクエストの実行
                HttpResponseMessage response = client.SendAsync(request).Result;

                // 戻り値の文字列を取得する
                string json = await response.Content.ReadAsStringAsync();

                // レスポンスコードを表示
                // リクエスト成功時は OK (200=正常)が表示される
                LogMessage(response.StatusCode.ToString());

                // 戻り値をログ出力する
                LogMessage(json);
            }

            /// <summary>
            /// ログメッセージの処理関数
            /// </summary>
            /// <param name="message">ログメッセージ</param>
            private void LogMessage(string message)
            {
                // ログメッセージはコンソールに表示する
                System.Diagnostics.Trace.WriteLine(message);
                Console.WriteLine(message);
            }
        }
    }
}

アクセスする HoloLens に合わせて以下の変数は変更してください。

target_ipaddress = "127.0.0.1:10080";
target_username = "USERNAME";
target_password = "PASSWORD";

127.0.0.1:10080 のアドレス(USB接続)で HoloLens にアクセスする方法は以下を参照ください。
bluebirdofoz.hatenablog.com

修正を行ったらメニューから デバッグ -> デバッグなしで開始 を選択します。
f:id:bluebirdofoz:20190302182845j:plain

コンソールが開き、HoloLens から取得した情報が表示されます。
f:id:bluebirdofoz:20190302182857j:plain

コンソールアプリの実行

作成したアプリケーションはプロジェクトフォルダの bin ディレクトリ配下に exe ファイルの形式で出力されています。
f:id:bluebirdofoz:20190302182907j:plain

PowerShell などで実行可能です。
f:id:bluebirdofoz:20190302182915j:plain

次はGETメッセージにパラメータを追加し、ファイルをダウンロードしてみます。
bluebirdofoz.hatenablog.com