AndroidThings & Raspberry Pi3 で猫用扇風機を作る（2）

2017年9月2日に実施された「[東北Tech道場 郡山道場 第5回](https://medium.com/@koriyamadojo/%E6%9D%B1%E5%8C%97tech%E9%81%93%E5%A0%B4-%E9%83%A1%E5%B1%B1%E9%81%93%E5%A0%B4-%E7%AC%AC%EF%BC%93%E6%9C%9F-%E7%AC%AC%EF%BC%95%E5%9B%9E%E9%96%8B%E5%82%AC-e9119f42b50f)」の作業内容をまとめます。

前回の道場で「猫用扇風機」の作成を決定し、おおよその仕様も決まりましたが、実はAndroid Things も Raspberry Pi3 も、Android Studioでさえ、全く経験がありません。まずはカメラ機能を実装しないと何もできないので、Android Thingsでカメラを利用するサンプルソースを探しました。すぐに「Doorbell」という公式のサンプルアプリがヒットしました。というか、「Doorbell」しか見つけられませんでした。

このDoorbellアプリ、「ボタンを押すとカメラで画像を撮影し、その画像をGoogleのCloud Vision APIで解析し、画像および何が写っているかをFirebaceにアップロードし、スマホから確認できる」というものです。猫用扇風機のためのアプリみたいな仕様です。

早速、下記のページを参考にDoorbellを動かしてみることにしました。
「[Building a Cloud Doorbell](https://developer.android.com/things/training/doorbell/index.html)」（公式ページ）
「[Android ThingsのサンプルDoorBellアプリを試してみた](https://qiita.com/ryoyakawai/items/ac014fec77af68741e05)」
「[Android Thingsのdoorbellアプリを試す](https://qiita.com/tatsu/items/fbd4a118899576c97643)」

なお、開発環境はWindows10です。

#(1) Raspberry Pi3の準備
- 参考サイトのようにRaspberry Pi3を準備する。
![27.jpg](https://qiita-image-store.s3.amazonaws.com/0/222292/60084a4a-de7a-15a3-368f-bdded03eecd1.jpeg)
こんな感じにつなぎました。

#(2) doorbellプロジェクトのダウンロード
- GitHubからプロジェクトのzipをダウンロードする。
  https://github.com/androidthings/doorbell

- zipを解凍し、プロジェクトファイルごと「C:\Users\ユーザ名\AndroidStudioProjects」の中に置く。

- Android Studio起動後の画面で、「Open an existing Android Studio Project」を選択し、配置したプロジェクトフォルダを選ぶとインポートされる。 「[AndroidStudioで既存のプロジェクトをインポートする](http://mio.yokohama/?p=380)」を参考。
- 自動的にビルドすると
`Error:Execution failed for task ':app:processDebugGoogleServices'.
　File google-services.json is missing. The Google Services Plugin cannot function without it. 
   Searched Location: `
というエラーが出るが、jsonファイルは後から入れるので気にしない。

#(3) GCP(Google Cloud Platform)の準備
[参考サイト](https://qiita.com/ryoyakawai/items/ac014fec77af68741e05)の要領でAPIキーを作成し、
app/src/main/java/com/example/androidthings/doorbell/CloudVisionUtils.java
にコピーする。

#(4) Firebaseの準備
- [プロジェクトの作成]
- [Databaseの設定]-[RULESの設定]
- google-service.jsonをダウンロードしてコピー

この辺は、[参考サイト](https://qiita.com/ryoyakawai/items/ac014fec77af68741e05)の説明の通り。

google-service.jsonを「app/」と「companionApp/」の直下にコピーしてリビルド。
これで、(2)で出ていたエラーは消えた。

#(5) スマホでアプリを起動する
- PCとスマホをケーブルで接続し、スマホの「USBデバッグ」を有効にしておく。
- android studioでRunボタン（右向き△）の隣を「companionApp」にして、Runする。「Sony SOV34」（私のXperia）を選んで「OK」する。

#(6) ラズパイでアプリを起動する
- ラズパイとPCは無線LANでつながっている状態なので、
`$amd connect <ipアドレス>`
で接続する。
- android studioでRunボタン（右向き△）の隣を「app」にして、Runする。「Raspberry3」を選んで「OK」する。

とりあえず、これでラズパイ側とスマホ側のアプリの起動までは確認できました。

#(7) FirebaseとCloud Vision APIで認証エラー
実は、(1)～(6)の作業は自宅で試しています。これを東北Tech道場が開催された学校で稼働させると、FirebaceとCloud Vision APIでエラーになるという珍事態に見舞われました。片方ずつコメントアウトすると、両方でエラーが出ていることがわかりました。出力されるのは、「Unacceptable certificate」（認証エラー）です。自宅で正常稼働するのに、なぜエラーが出るのか？これは学校のネットワークに問題があるに違いないと、ネットワーク管理の先生に訴えますが首をひねられるばかり。

散々悩んで調べて、ふとAndroid Thingsの起動画面をモニタで見ると、時刻が「1970.01.01」。原因はこれか～～～～。2mほど離れたモニタとラズパイをつないでいたので気が付きませんでした。

学校の環境では、学校のNTPサーバを使っていて、Android Thingsが自動でNTPサーバと同期しないので、時刻が1970-01-01になってしまい、FireBaseやCloudのAPIが認証エラーになるようです。

#(8) Android Thingsの時刻設定
調べたところ、adbでの時刻設定は以下のようにやったら成功しました。
`adb shell su root date MMDDhhmmYYYY.ss`
たとえば　2017年11月16日13時43分30秒の場合
`adb shell su root date 111613432017.30`
のようにコマンドを打ち込みます。なお、再起動すると時刻はリセットされるので面倒だけど再入力が必要です。これで、FireBaseもCloud Vision APIも使えるようになった。万歳！

と喜んでいたらネットワーク管理の先生が、Android Things タイムゾーンの設定は
`adb shell su root setprop persist.sys.timezone "Asia/Tokyo"`
のように打ち込めば、電源を落としても保持されると調べてくれました。更に、自動でAndroid Things と学校のサーバが同期できるようにサーバを設定してくれました。めでたしめでたし。

第6回に続きます。