環境センサviewerというAndroidアプリを作った

どういうアプリ?

Omronの環境センサ2JCIE-BL01の測定データの読み取り、測定データのグラフ表示、測定データのエクスポートができるアプリです。

環境センサ2JCIE-BL01を使ったデータ観測の例では、環境センサの動作モードをデータ保存なしのビーコンモード(IM/EP)に変更して観測する例が多いのですが、他のアプリとの同時利用も想定してデータ保存ありのモードでの運用ができるようにしました。

play.google.com

できること

  • 環境センサの現在の測定データの読み取り
  • 環境センサ内の過去の測定データの読み出し
  • アプリ内に取り込んだ測定データのグラフ表示(最大二週間まで)
  • アプリ内に取り込んだ測定データのTSVエクスポート
  • 環境センサの測定間隔の変更&内部タイマー設定

f:id:cnaos:20191204230551p:plainf:id:cnaos:20191204230607p:plainf:id:cnaos:20191204230628p:plainf:id:cnaos:20191204230634p:plain
スクリーンショット

作った動機

  • スキルアップ
    • 仕事でAndroidアプリのメンテナンスをしてるけど、機能追加などの開発が乏しく積極的にコストをかけてJetpackの導入やKotlinへの置き換えができないため、新しい技術のスキルが積めない。
  • KotlinでAndroidアプリを1本つくってみたい。
  • 既存アプリへの不満
    • 複数の環境センサーのデータが読めない。
    • データのエクスポートができない。
    • 動作が不安定
    • わざわざアカウントつくらないと使えない
    • 日時設定にタイムゾーン周りのバグがあるらしく、時刻が9時間ずれる。

アプリを作る過程で習得したこと

  • Kotlinをそこそこ使えるようになった
    • Javaと比べていろいろと書きやすい気がする。
      • 匿名クラスまわり
      • いちいちgetter, setterを書かなくていい。
      • mapやlistをリテラルで書ける
    • Kotlinイイね。
    • Kotlin coroutine
      • なんとか使えてるという程度
  • AndroidでBLEデバイスを扱えるようになった
  • Omronの環境センサを扱えるようにった
    • 環境センサから測定データを読み出す
    • 環境センサから読みだしたデータを加工して表示する
    • 環境センサから読みだしたデータをアプリ内DB(Room)に保存する
    • アプリ内DBに保存したデータを利用して測定データの差分読み込みを行う
  • Android Jetpackを扱えるようになった
    • DataBinding
    • LiveData
    • Room
    • Navigation
  • その他
    • グラフ描画ライブラリandroidplotの利用

必要になりそうな新しい技術を、別の実験的なプロジェクトで試してみて、おおよその使い方が分かって行けそうだと思ったらアプリに組み込むという事を繰り返していました。

苦労したところ

測定データの差分取り込み

とくに何も考慮しない、アプリ内の取り込み済みのデータと、環境センサの現在の測定データまでの差分取り込みだけは割と楽に実装できましたが、 環境センサのリングバッファ構造を考慮した差分取り込みのための工夫とか、 環境センサが測定間隔の変更などを行うと最新ページが0にリセットされるので、その後どうやって差分取り込みを行うかとかで2,3回くらい内部の方式を変更しました。

グラフ表示に使ったAndroidplot

サンプルは豊富にあったんですが、日時でグラフを表示する例がなくて試行錯誤が必要でした。 まだ表示に改良の余地があるかなと思います。

Android BLEの133エラー

やっぱりよくわからん。 端末のbluetoothのON/OFF切り替えで直るときもあるし、だめなときはだめだし。

アプリに組み込んだ便利だったライブラリ

  • peko
    • https://github.com/deva666/Peko
    • AndroidPermission用のライブラリ
    • Perrmission関係のコールバックをcoroutineやLiveDataなどに置き換えられる。神
    • 特にViewModel側でPermissionが必要な処理を一旦Activityに戻して処理する必要がある場合に便利。
  • able
  • androidpolot
    • http://androidplot.com/
    • グラフの表示用
    • MPAndroidChartでは精度がfloatしか使えず、今回の用途には不十分だったので。
  • databinding-ktx

つくってみて

ちょっとずつですが、機能が増えていくのが楽しかったです。