Androidスマホ + SORACOM Arc + Node-REDでお手軽PoC
これは
SORACOM ArcとNode-RED(RedMobileまたはTermux)を使い、Androidアプリのセンサーデータを可視化してお手軽にPoCをしようという記事です。
構成図
今回の全体の構成はこんな感じになります。
Androidスマートフォン上でTermux + Node-RED(またはRedMobile)を動かしてセンサーデータを取得し、SORACOM Arcを使ってSORACOM Harvestにデータを送り込んで可視化します。
本記事では例として、3軸加速度センサーのデータを可視化します。
SORACOM Arcで接続する
最初にWireGuardを設定して、SORACOM Arcを使ってスマートフォンをSORACOMプラットフォームに接続します。
まずplaystoreからWireGuardをインストールします。
次に、SORACOMコンソールから仮想SIMを発行します。登録手順は公式ページを参照してください。
発行すると、以下のようにWireGuard用の設定ならびにQRコードが発行されます。この情報を保存または表示したままにしておきます。
先ほどスマートフォンにインストールしたWireGuardアプリを起動し、青い+マークボタンを押してトンネルを追加します。以下のような画面が出るので「QRコードをスキャン」を選びます。
カメラが起動するので、先ほど発行されたQRコードを読み込んでください。
QRコードを読み込むとトンネルが追加されるので、スライダーを右に動かしてONにします。初回はこの時にトンネルを作る権限の警告が出ると思いますが、許可してください。
pingを打てる適当なソフトを使ってpong.soracom.io
にpingを打ってみます。
無事に接続できました。
Termux/Termux:APIをインストールする
Termuxは、Android上でLinuxのコマンドを使えるようにするためのソフトです。root化などは不要で、普通にplaystoreからインストールするだけで無料で使えます。
playstoreからインストールしてください。
Termux:APIはTermuxのアドオンで、Androidスマホの機能をTermuxのコンソールからコマンドで扱えるようにするためのソフトです。root化などは不要で、普通にplaystoreからインストールするだけで無料で使えます。
同じくplaystoreからインストールしてください。
インストールが終わったら、Termuxを起動します。Termux:APIを使えるようにするために以下のコマンドを実行します。
$apt install termux-api
その後、termux-sensor -l
コマンドを実行し、利用できるセンサーを検索します。
センサー名はご利用のスマートフォンによって異なりますが、3軸センサーは「Gyro」とかそれっぽい名前があるのでは無いかと思います。
上図は私のOppo RenoAでの実行例ですが、lsm6ds3c Gyroscope Non-wakeup
が該当します。
では続いてこのセンサーからデータを取得してみます。termux-sensor -s "lsm6ds3c Gyroscope Non-wakeup" -d 3000
コマンドを実行すると以下のようにJSONでコンソールにデータが出力されます。
-s
オプションでセンサーを指定し、-d
オプションで読み取り間隔をミリ秒で指定します。
他のセンサーを指定したり、データを取得しながらスマートフォンを動かしてみたりと色々試してみてください。
Node-REDのインストール
次に、TermuxにNode-REDをインストールします。
Node-REDはNode.JSで動くアプリケーションで、ブラウザから接続して、準備されたコネクターを繋いでいくだけで色々な処理を作ることができます。
以下の一連のコマンドをTermuxで入力してインストールします。
$apt update
$apt upgrade
$apt install nodejs
$npm i –g –unsafe-perm node-red node-red
インストールに成功したら、Node-REDを起動します。
$node-red
Node-REDに接続してフローを作成する
Node-REDを起動したままでスマートフォンのブラウザからhttp://localhost:1880/
にアクセスしてフローを作成することも可能ですが、流石にスマートフォンの画面で操作するのは辛いのでPCからアクセスします。
スマートフォンのIPアドレスを確認し、PCのブラウザからhttp://(スマートフォンのアドレス):1880/
にアクセスします。
以下のようなNode-REDの画面に接続できたら成功です。
フローは以下のように作成します。
- フローのスタート地点として
inject
ノードを置く -
inject
ノードからexec
ノードに接続する。exec
ノードでは先ほどのtermux-sensor
コマンドを実行する -
exec
ノードの標準出力(右の一番上のコネクタ)から、json
パーサノードに接続し、出力をjsonに変換する -
change
ノードでjsonの中から必要な物だけ取り出す -
template
ノードでUnified Endpointに投げるjsonの形に整形する -
http request
ノードを使い、SORACOM Unified endpoint(http://uni.soracom.io
)にHTTP POSTで送信する
exec
ノードの設定は以下の通りです。
change
ノードの設定は以下の通りです。センサーの値の部分だけを取り出しています。
template
ノードの設定は以下の通りです。配列で渡されたデータを、x,y,zのプロパティに置き換えています。
最終的にはこんな形になります(右上に動作確認用のデバッグノードを入れてます)。
template
を使ってるのでexchange
は不要かなとも思いましたが、とりあえずこれで動いたのでこのまま先に進みます。
SORACOM Harvest Dataでデータを確認する
Node-REDの画面でinject
ノードのボタンをクリックしてフローを動かし、SORACOMコンソールからHarvest Dataでデータを確認してみます。
無事に取得・可視化できました。
RedMobileでさらにお手軽に
有料アプリ(2021年8月11日現在500円)ですが、RedMobileを利用すると、TermuxとTermux:APIをインストールせずさらにお手軽に試すことができます。
RedMobileはAndroid上でNode-REDを動かすアプリなのですが、なんと「センサーデータを取得する」という独自のノードがインストールされています。
RedMobileを起動すると以下のように接続先が表示されるので、先ほどと同じようにPCのブラウザからアクセスします。
以下のようなセンサーノードが準備されているのが分かります。
この中からsensor subscribe
(どのセンサーのデータを取得するか)とgyroscope
を組み合わせると、termux-sensor
コマンドでやったのと同じ事が実現できます。
あとは同じくHTTP POSTしてやればいいので、以下のようなフローになります。ノードに設定することもほとんど無く、非常に簡単に実現できます。
他のセンサーの例では、location
(位置情報)のノードを以下のように使うと位置情報を送信することができます。
まとめ
Termux + Termux:API + Node-RED(またはRedMobile)を使うと、Androidスマホを使って簡単にセンサーデータを取得することができます。そして、そのデータを保存・可視化したりクラウドに送り込むのも、スマホでSORACOM Arcを使えばSORACOMプラットホームで簡単に行うことができます。
ちょっとしたアイデアのPoCであれば、これで十分というケースは非常に多いのではないでしょうか?
Discussion
apt install termux-api
がないとtermux-sensor
コマンドがうまく動かない事を失念していました。2021/8/13 13:40に追記しています。