📑

Androidスマホ + SORACOM Arc + Node-REDでお手軽PoC

2021/08/12に公開
1

これは

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であれば、これで十分というケースは非常に多いのではないでしょうか?

GitHubで編集を提案

Discussion

しょーちゃんしょーちゃん

apt install termux-apiがないとtermux-sensorコマンドがうまく動かない事を失念していました。
2021/8/13 13:40に追記しています。