GPS マルチユニット SORACOM Edition のデータを SORACOM Funk で Cloud Functions for Firebase に送って Firebase Cloud Firestore に記録するメモ

GPS マルチユニット SORACOM Edition のデータを SORACOM Funk で Cloud Functions for Firebase に送って Firebase Cloud Firestore に記録するメモです。

2021/02/19 時点の情報で進めます。

MacroDroid から受け取った位置情報データを Cloud Functions for Firebase 経由で Firebase Cloud Firestore に記録するメモ

MacroDroid から受け取った位置情報データを Cloud Functions for Firebase 経由で Firebase Cloud Firestore に記録 できたので、この仕組みをちょっと変えてGPS マルチユニット SORACOM Edition のデータを SORACOM Funk で Cloud Functions for Firebase に送るようにしてみます。

  • MacroDroid
    • GPS マルチユニット SORACOM Edition + SORACOM Funk に変更
  • 変更なし
    • Cloud Functions for Firebase
    • Firebase Cloud Firestore

といった技術構成になります。

SORACOM Funk を選んだ

SORACOM Beam と SORACOM Funk と SORACOM Funnel と悩んだんですが、今回はクラウドサービスの Function を直接実行できるサービスという用途で Funk が一番合っていると思ったので、これで試してみることにしました。

SORACOM Funk

SORACOM Funk(以下、Funk) は、クラウドサービスの Function を直接実行できるサービスです。クラウドリソースを活用することでデバイス側の実装をシンプルに保ち、処理のオフロードや低電力消費化が可能となります。

料金を見てみても、

SORACOM Funk のご利用料金

SORACOM Funk は無料利用枠をご提供しています。 1アカウントあたり月間 50,000 リクエストまで毎月無料とさせていただきます。 なお、リクエスト数が 50,000 リクエストに満たない場合でも翌月に持ち越されることはありません。

ちょっとした仕組みの検証なら無料利用枠で収まりそうですね。

image

実際、SORACOM Funk の設定を見てみてもそのまま Google Cloud Function がありました。

Cloud Functions for Firebase の設定

こちらの記事と仕組みは一緒ですが、入ってくるデータの内容変わるので別の Function を作ります。

Getting Started with SORACOM Funk には「Azure Functions / GCP Functions に渡されるデータ」という説明があり、

method : ‘POST’ が指定されます
body : 指定したデータ形式でリクエスト Body の値が設定されます。
headers : user-agent には ‘SORACOM Funk’ が指定されます。 content-type には’application/json’ が指定されます。 x-soracom-token には JWT 形式のトークンが指定されます。

とのことです。(2021/02/19 現在)

素直な仕様っぽくていいですね!

これに合わせて、書いたコードがこちらです。

const functions = require("firebase-functions");

// firebase-admin の初期設定
const admin = require("firebase-admin");
admin.initializeApp();

// Firestore を使えるようにする
const db = admin.firestore();

exports.soracomFunk = functions.https.onRequest(async (request, response) => {
  functions.logger.info("SORACOM Funk logs!", {structuredData: true});

  functions.logger.info(request.body, {structuredData: true});

  const d = new Date();
  const dateISO = d.toISOString();  // ISO タイプスタンプ

  // センサーデータ
  const datas = {
    sensors:request.body,
    CreateAt:dateISO
  };

  // Firestore への書き込み
  // soracom_funk コレクションにドキュメント ID は自動 ID で加える
  // soracom_funk が無くても自動で作られます
  const locationsRef = db.collection('soracom_funk').doc();
  await locationsRef.set(datas);

  // 返答
  response.send("OK!");
  
});

こちらをデプロイします。

POST の受け取りは。bodyParser的なものは必要かなと思ったのですが HTTP 関数  |  Google Cloud Functions に関するドキュメント を見る限り、不要で大丈夫でした。

image

デプロイできたら Firebase コンソールで Functions に移動します。

image

soracomFunk の関数ができているので、リクエストに書かれている URL をメモしておきます。

SORACOM Funk の設定

私の GPS マルチユニット SORACOM Edition では GPS マルチユニット SORACOM Edition と SORACOM Harvest Data で簡単に可視化する サンプルを試して、デバイス登録や基本的な SIM グループ設定などは済んでいます。

Getting Started with SORACOM Funk の記事をベースに進めていきます。

image

まず、GPS マルチユニット SORACOM Edition の登録された SIM グループで SORACOM Funk を ON にして、サービスを Google Cloud Functions に選択します。送信データ形式は JSON にしました。

image

関数の URL に、先ほどメモしておいた soracomFunk の関数の URL を記入します。

保存ボタンをクリックして設定を反映させます。

動かしてみる

GPS マルチユニット SORACOM Edition と SORACOM Harvest Data で簡単に可視化する にも紹介されていますが、ファンクションボタンの短押し(約 1 秒)で手動でデータを反映できます。

Cloud Functions for Firebase を見てみると soracom_funk のコレクションで反映されてます。

image

データの内容はパッと見でも結構分かりますが、詳細は GPS マルチユニット SORACOM Edition 機能の説明にある、GPS マルチユニットから送信されるペイロードを参考にしてみてください。

余談:データ送信のタイミング変更

私の GPS マルチユニット SORACOM Edition は、いろいろといじってしまったので正確には分かりませんが、デフォルト10分だったような気がするので、検証時は 1 分なりに早めたほうが検証しやすいかもしれません。

GPS マルチユニット SORACOM Edition : デバイスの使い方 にある「データの送信モード」「デバイス設定の変更」を参考に変更してみましょう。

デバイス設定の変更
送信モードを変更したい場合は ユーザーコンソールの GPS マルチユニットの一覧画面から「デバイス設定変更」を選択します。 設定変更を即座に変更したい場合はファンクションボタンを短押し (約 1 秒) します。

とあるように、すぐ変更したい場合はファンクションボタンを短押し (約 1 秒) しましょう。

しいていえば、充電時は ON の扱いなのでデータ送信を送りつ続けます。検証時に 1 分のような高頻度にしてしまうと、そのまま送られてしまうので、設定変更は気を付けて行いましょう!(実体験)