SORACOMプラットフォームを活用したiPhoneGPSトラッカー

# 概要
ソラコム社の提供する[GPSマルチユニット](https://soracom.jp/store/5235/)は購入後、簡単な作業と設定で[GPSトラッキング](https://soracom.jp/recipes_index/2962/)が可能となります。
ただ、デバイス（1万円強）とSIM（1000円くらい）を購入し、月額料金（300円くらい）を払うとなった場合、少々ハードルが上がってしまいます。
でもiPhoneユーザーであればデバイスとSIM購入せず、条件次第ではランニングコストゼロでお手持ちのiPhoneでGPSトラッカーを作ることができそうなので、その方法をご紹介できればと思います。

# 準備
## SORACOM Arcの利用設定
[SORACOM Arc](https://soracom.jp/services/arc/)というサービスを利用するとSIMを購入することなく、お手持ちのデバイスでSORACOMプラットフォームへの接続と通信が可能となります。
SORACOM Arcを利用するには、[WireGuard](https://www.wireguard.com/)というアプリをインストールし、SORACOMコンソールでの設定が必要となりますが、難しいことは置いておいて、以下の手順で利用できます。

https://zenn.dev/showm001/articles/2021-06-24-01#iphone%E3%81%A7%E7%B9%8B%E3%81%84%E3%81%A7%E3%81%BF%E3%82%8B

この作業でSORACOMプラットフォームへの接続環境が準備完了です。
**※ちなみにSORACOM Arcは1アカウント1回線は無料で、2回線めから有料となります。**

## Node-PAD
Node-REDという神開発ツールがあり、（無償ではないですが）[Node-PAD](
https://apps.apple.com/jp/app/node-pad/id1534470128)いうアプリをインストールすることでiPhoneで自作アプリを作れるようになります。
ただ、**iPhoneの小さい画面でノードを置き、繋ぎ、文字を打ち込むのは結構な修行**なので、挑まれる方はその点あらかじめご覚悟ください。

# 実装
ここから実装方法です。
結論から言うと、以下のようなフローで実装できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/0c313086-4b08-d71c-cc5d-f3b4c048b8ac.png)
①locationノード（ios deviceグループ）…位置情報の取得
②changeノード（機能グループ）…①で取得した位置情報を変数に格納
③injectノード（共通グループ）…定周期でイベントを発生させる
④functionノード（機能グループ）…送信データの作成
⑤http requestノード（ネットワークグループ）…データの送信
その他はデバッグ用で必須ではないため、説明は省きます。

設定については以下となります。

## ①locationノード（ios deviceグループ）…位置情報の取得
こちらは置くだけです。
位置情報を定周期（？）で取得します。

## ②changeノード（機能グループ）…①で取得した位置情報を変数に格納
①で取得した緯度と経度がmsg.payload.locationのlatとlonに入っているので、それぞれflow変数lat、lonにセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/53853b8b-9e84-1a25-2753-f5e691de03e0.png)

## ③injectノード（共通グループ）…定周期でイベントを発生させる
ここがポイントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/179656ee-e302-35eb-6349-7ab548ba103e.png)
初回起動（図の3秒）は適当に設定して、繰り返しの時間間隔で送信の間隔（インターバル）を設置します。
図では15秒としていますが、位置情報として取得したい時間間隔を設定してください。
ソラコムのGPSマルチユニットでは最短1分間隔でしか設定できませんでしたが、最短１秒での設定が可能です。
**※短くしすぎると通信量が増え、場合によっては通信料が追加で発生しますのでご注意ください。**

## ④functionノード（機能グループ）…送信データの作成
ノーコードを目指しましたが、ここは少しプログラムっぽく・・
②でセットしたflow変数を送信用のJSONデータにまとめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/8dc19c17-68c1-3195-98c6-4cd34a44f1b7.png)

```javascript
var data = {};
data["lat"]=flow.get("lat");
data["lon"]=flow.get("lon");
msg.payload = data;
return msg;
```

## ⑤http requestノード（ネットワークグループ）…データの送信
あとはPOSTで「http://uni.soracom.io」に送信するだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/e3eb5240-2b7a-d63c-68ba-189ae264b942.png)

作業としては以上です。
デプロイしてください。

WireGuardに接続した状態で、このフローを動かし、[前述のレシピ](https://soracom.jp/recipes_index/2962/#SORACOM_Harvest_Data)を参考に[SORACOM Harvest Data](https://soracom.jp/services/harvest/)の設定をすると、以下のように地図上にマッピングが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/a43fe6dd-15d1-b892-f34b-ce4e5d13b2f1.png)

SORACOM Harvest Dataにアップロードされたデータは[SORACOM Lagoon](https://soracom.jp/services/lagoon/)でいい感じに可視化できます（設定は割愛させていただきます）。
**※SORACOM Lagoonも無償のFreeプランがあります。**

# データ収集時の注意
私の知る限り、Node-PADが常にアクティブでなければフローが動かないようです（違っていればツッコミお願いします）。
なので、設定>画面表示と明るさ>自動ロックで「なし」に設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916611/1ce5aa04-1dc9-ea58-1040-b1115dab494f.png)

さらに他のアプリも使わず、画面に触らないように気を付けなければいけませんので、ご注意ください。

# Androidでの実装
今回はiPhoneでの実装を紹介していますが、AndroidでもRedMobileというツールを使うことで実装は可能です。
以下を参考にしていただければと思います。

https://fugiters.net/blog/index.php/2021/12/23/bus_tracker2/