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(以下、Funk) は、クラウドサービスの Function を直接実行できるサービスです。クラウドリソースを活用することでデバイス側の実装をシンプルに保ち、処理のオフロードや低電力消費化が可能となります。
料金を見てみても、
SORACOM Funk は無料利用枠をご提供しています。 1アカウントあたり月間 50,000 リクエストまで毎月無料とさせていただきます。 なお、リクエスト数が 50,000 リクエストに満たない場合でも翌月に持ち越されることはありません。
ちょっとした仕組みの検証なら無料利用枠で収まりそうですね。
実際、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 に関するドキュメント を見る限り、不要で大丈夫でした。
デプロイできたら Firebase コンソールで Functions に移動します。
soracomFunk の関数ができているので、リクエストに書かれている URL をメモしておきます。
SORACOM Funk の設定
私の GPS マルチユニット SORACOM Edition では GPS マルチユニット SORACOM Edition と SORACOM Harvest Data で簡単に可視化する サンプルを試して、デバイス登録や基本的な SIM グループ設定などは済んでいます。
Getting Started with SORACOM Funk の記事をベースに進めていきます。
まず、GPS マルチユニット SORACOM Edition の登録された SIM グループで SORACOM Funk を ON にして、サービスを Google Cloud Functions に選択します。送信データ形式は JSON にしました。
関数の URL に、先ほどメモしておいた soracomFunk の関数の URL を記入します。
保存ボタンをクリックして設定を反映させます。
動かしてみる
GPS マルチユニット SORACOM Edition と SORACOM Harvest Data で簡単に可視化する にも紹介されていますが、ファンクションボタンの短押し(約 1 秒)で手動でデータを反映できます。
Cloud Functions for Firebase を見てみると soracom_funk のコレクションで反映されてます。
データの内容はパッと見でも結構分かりますが、詳細は GPS マルチユニット SORACOM Edition 機能の説明にある、GPS マルチユニットから送信されるペイロードを参考にしてみてください。
余談:データ送信のタイミング変更
私の GPS マルチユニット SORACOM Edition は、いろいろといじってしまったので正確には分かりませんが、デフォルト10分だったような気がするので、検証時は 1 分なりに早めたほうが検証しやすいかもしれません。
GPS マルチユニット SORACOM Edition : デバイスの使い方 にある「データの送信モード」「デバイス設定の変更」を参考に変更してみましょう。
デバイス設定の変更
送信モードを変更したい場合は ユーザーコンソールの GPS マルチユニットの一覧画面から「デバイス設定変更」を選択します。 設定変更を即座に変更したい場合はファンクションボタンを短押し (約 1 秒) します。
とあるように、すぐ変更したい場合はファンクションボタンを短押し (約 1 秒) しましょう。
しいていえば、充電時は ON の扱いなのでデータ送信を送りつ続けます。検証時に 1 分のような高頻度にしてしまうと、そのまま送られてしまうので、設定変更は気を付けて行いましょう!(実体験)