#SORACOM LTE-M Button の簡易位置情報を Azure Functions (C#) で取得する

前の投稿で「LTE-M button の簡易位置情報をローカル PC で実行している C# アプリで取得」しました。

今回はそれの続き、Azure Functions にデプロイ してみます。SORACOM Beam ならローカルで動作確認したものを単にデプロイするだけです。
わざわざ分けて投稿するまでもないんですが、前回は途中で終わってしまった感があるので、今回は真面目に「クラウド連携」します。

今回は素直に Beam 経由です。

「Azure Functions、何それ?おいしいの?」という人もいるかもしれないので、動作確認、というかログの出し方についてもチラッと書きます。
(知っている人には当たり前すぎる内容ですが)

SORACOM Funk からだと位置情報を取れてません。多分何か間違ってるんですが、今のところ原因が分からず(恥
Funk で位置情報は、何か分かったら改めて。


Button の位置情報を受け取るようにコードを変更

前回の投稿 では、ngrok の Web Interface でヘッダーに位置情報が入っていることを確認したところで終わりました。

今回は関数の Run メソッド を以下のように変更して、位置情報を関数内で受け取ってみます。

[FunctionName("ButtonLoc")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string locResult = req.Headers["X-Soracom-Geo-Position-Query-Result"];
    if (locResult == "success")
    {
        var body = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(body);
        string clickTypeName = data?.clickTypeName ?? "(Unknown)";

        var loc = req.Headers["X-Soracom-Geo-Position"].ToString().Split(';');
        var latitude = float.Parse(loc[0]);
        var longitude = float.Parse(loc[1]);

        var message = $"{clickTypeName} on {DateTime.UtcNow:yyyy/MM/dd HH:mm:ss} at Latitude: {latitude}, Longitude: {longitude}";

        log.LogInformation(message);
        return (ActionResult)new OkObjectResult(message);
    }
    else
    {
        log.LogWarning("Get Location Failed");
        return (ActionResult)new OkObjectResult("Get Location Failed");
    }
}

Beam では位置情報はヘッダーに含まれているので、それを取り出しています。
req.Headers[“X-Soracom-Geo-Position”] の辺りがそれ。緯度経度がセミコロンで連結されているので、直後の行で分けています。

位置情報のほかに、日時とクリックの種類(シングル、ダブル、長押し)もログに出力してみます。ログ出力だけということで clickTypeName を読みました。

普通は、関数から外部に連携することが多いと思うので clickTypeName よりは clickType を読むほうがよさそうです。

clickTypeclickTypeName実際の操作
1SINGLEクリック
2DOUBLEダブルクリック
3LONG長押し

タイムスタンプについては、関数を実行するサーバーの日時を使うことにしました。

log.LogInformation, LogWarning メソッドなどでログ出力します。ここでは動作確認用の値を出しておきます。

コードを変更はこの程度。前回の手順を参考に、一旦ローカルで動作確認してもいいかも。


Visual Studio Code から Azure にデプロイ

前の投稿では

  • Visual Studio Code で Azure Functions プロジェクトを作成
  • 動作する最低限のコードでローカル実行
  • ngrok で localhost をインターネットに公開
  • 公開された URL などを使って SORACOM ユーザーコンソールで設定
  • ボタン押す
  • ngrok の Web Interface で位置情報が降ってきてることを確認

しました。

これを Azure にデプロイします。

デプロイも Visual Studio Code の環境内で行います。

  1. [Azure] – [FUNCTIONS] で [Deploy to Function App] を選択します。
  2. [Select Function App] で “Create New Function App in Azure” を選択します。
  3. 任意の関数名を入力します。例えば “ButtonLoc” に自分の名前や日付を追加したような名前など。
  4. 少し待つとデプロイが完了します。

簡単です。

ただし VS Code 内からデプロイするとリソースは “West US” リージョンに作成されるようです。
本番などで別のリージョンにデプロイしたい場合は、以下の手順ではなく、Azure ポータルで関数を作るのがいいです。

この後で使う「関数のURL」を [Copy Function URL] でコピーしてもいいのですが、VS Code で得られる値はエンコードされたものです。
つまらないミスで繋がらないのはうれしくないので、この後の手順通り Azure ポータルで URL をコピーすることにします。


Azure ポータルで関数の URL を確認

デプロイに成功たので、実際に動作していることを確認し、さらに関数の URL を見てみます。
関数の URL は SORACOM ユーザーコンソールの Beam の設定で必要です。

まずは関数の状態を確認します。

Azure ポータルで、上の手順で作った “Function App” のブレードを開きます。
状態は “Running” になっているはず。

次に、関数の URL を確認します。

“Function App” ブレードで “<関数名>” を選択してから [関数の URL の取得] をクリックして、URL をクリップボードにコピーしておきます。


SORACOM ユーザーコンソールで Beam の設定

動作まであともう一息。

SORACOM ユーザーコンソールで Beam の設定を行います。
前の投稿 に続いて操作していれば、Beam はすでに設定済みなので、それを変更します。

項目
ホスト名関数の URL のうち、<Function App 名>.azurewebsites.net
パス関数の URL のうち、”/api” 以降を最後まで
IMSI ヘッダON

デプロイから設定まで、ここですべて終了。

最後にもう一度 Azure ポータルに戻ってから、実際に LTE-M Button を操作してみます。


動作確認

Azure ポータルに戻り、”<関数名>” を開きます。

ここまでの流れに沿っていれば、今開いている状態、”関数の URL” をコピーしたブレードがそれ。

下にスクロールする必要があるかもしれませんが、[ログ] というタブがあるはず。これを広げます。

この状態で、LTE-M Button を操作してみます。

デプロイした Azure Functions でボタンの操作を取得できました。位置情報も付いています。

ここまで簡単ですね。(SORACOM Funk では出来てないけど /泣)

従来だとここまででもすでに苦労していたと思いますが、いくつか設定をしただけで簡単にボタンの操作、位置情報を取れました。

さあ、これを使ってどんなアイデアを実現しましょう?って感じですね。

#SORACOM LTE-M Button の簡易位置情報を Azure Functions (C#) で取得する」への1件のフィードバック

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中