MRが楽しい

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

HoloLensのRestAPIをコンソールアプリ(.NET Framework)で実行する その2(ファイルのダウンロード)

本日は HoloLens の調査枠です。
前回記事の続きです。
bluebirdofoz.hatenablog.com

今回はパラメータを用いて、HoloLensの特定のディレクトリのファイルをダウンロードしてみます。
f:id:bluebirdofoz:20190303114658j:plain

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

サンプルコード

HoloLens の特定ディレクトリのファイルを取得するサンプルコードを作成します。
ファイルアクセスの API は以下の /api/filesystem/apps/file です。
f:id:bluebirdofoz:20190303114516j:plain

/api/filesystem/apps/file は knownfolderid や filename をパラメータとして指定する必要があります
Picuture フォルダから TestImage.jpg を取得するサンプルコードを作成してみました。

以下の通り、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)
        {
            // 実行例 "HoloLensAPIConsole.exe TestImage.jpg D:\WORK\HoloLensAPITest\Download"
            // ダウンロードするファイル名とダウンロード先ディレクトリは引数で指定する
            if (args.Length == 2)
            {
                // 1つ目の引数をファイル名、2つ目の引数をダウンロード先ディレクトリとして取得する
                string downloadFileName = args[0];
                string downloadDir = args[1];

                // ファイルの取得処理を呼び出す
                HttpHoloAccess access = new HttpHoloAccess();
                access.GetFile(downloadFileName, downloadDir);
            }

            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>
            /// ファイルの取得関数
            /// (Picturesフォルダ直下のファイルを取得する)
            /// </summary>
            /// <param name="a_DownloadFileName">ダウンロードするファイル名</param>
            /// <param name="a_DownloadDir">ダウンロード先ディレクトリ</param>
            public async void GetFile(string a_DownloadFileName, string a_DownloadDir)
            {
                // 利用するAPIを指定(ファイル取得)してURLを作成する
                string api = "/api/filesystem/apps/file";
                string url = "http://" + Target_ipaddress + api;
                
                // リクエストに設定するパラメータを指定する
                Dictionary<string, string> parameters = new Dictionary<string, string>()
                {
                     { "knownfolderid", "Pictures" },
                     { "packagefullname", "\\\\" },
                     { "path", "\\\\" },
                     { "filename", a_DownloadFileName }
                };

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

                // 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;

                // 戻り値をバイト配列として取得する
                byte[] contentBytes = await response.Content.ReadAsByteArrayAsync();

                // バイト配列をファイルとして書き出し
                string downloadFilePath = a_DownloadDir + "\\" + a_DownloadFileName;
                System.IO.File.WriteAllBytes(downloadFilePath, contentBytes);

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

            /// <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

本プログラムは引数で、ダウンロードするファイル名とダウンロード先ディレクトリを指定します。
VisualStudio 上で動作させる場合は以下の手順で、実行時の引数を指定します。

メニューから デバッグ -> HoloLensAPIConsoleのプロパティ を選択します。
f:id:bluebirdofoz:20190303114646j:plain

プロパティ画面が開くので、[デバッグ]タブを選択します。
[開始オプション]の[コマンドライン引数]に、実行時の引数を書き込みます。
f:id:bluebirdofoz:20190303114727j:plain

このとき、ダウンロードするファイル名は HoloLens の Picuture フォルダ直下に存在するファイル名を指定します。
f:id:bluebirdofoz:20190303114738j:plain

これで引数の設定は完了です。
メニューから デバッグ -> デバッグなしで開始 を選択して処理を実行します。
f:id:bluebirdofoz:20190303114747j:plain

コンソールが開き、プログラムが実行されます。
処理が成功すれば「OK」の文字がコンソールに出力されます。
f:id:bluebirdofoz:20190303114756j:plain

指定したダウンロード先ディレクトリを確認すると、ファイルがダウンロードされています。
f:id:bluebirdofoz:20190303114807j:plain

コンソールアプリの実行

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

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

次はPOSTメッセージを利用してファイルをアップロードします。
bluebirdofoz.hatenablog.com