Android ThingsをRaspberry Pi3で使ってみた

## 概要
* **Android Things** をRaspberry Pi3(以後ラズパイ)に入れてみる
* [ボタンでLチカサンプル](https://github.com/androidthings/sample-button)までやってみた内容を記載します

## 前提
* Android Studioはインストール済み
* adbコマンドを実行するためのパスを通し済み

## Android Thingsをラズパイに入れて動かしてみる
* [公式ページ](https://developer.android.com/things/hardware/raspberrypi.html)を参考にしながらインストール
* インストールに必要なものは「[Raspberry Pi 3を購入してからMacでssh接続するまでの道のり](http://qiita.com/yumatsud/items/83732a5be3fe80b1054b)」で用意したものを利用
    * Raspberry Pi3
    * HDMI端子
* 下記に詳細な手順を示す

### Android Thingsの準備
* Android Thingsのラズパイ用最新イメージを[公式のPreview Downloadページ](https://developer.android.com/things/preview/download.html)からダウンロード
* [Raspbian JessieをSDカードへ書き込む手順](http://qiita.com/yumatsud/items/83732a5be3fe80b1054b#%E6%89%8B%E9%A0%86)と同じ手順でダウンロードしたAndroid ThingsのイメージをSDカードへ書き込む

### 周辺機器と接続してみる
* ラズパイにSDカードを挿入し、ラズパイを下記のように周辺機器と接続
    * TV <-> HDMI端子 <-> Raspberry Pi3
    * 電源アダプタ <-> Raspberry Pi3 
* 電源を入れると、下記のような画面になる
![IMG_8225.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/e78c2f3d-b643-4d97-cb3d-678a3d0eda2b.jpeg)


* しばらく経ち、下記のような画面になればOK
![IMG_1670.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/de243d2d-a773-c656-28e8-3150baaa6155.jpeg)


### ネットワーク接続
* 有線で接続していれば上記画像の「Not Connected」の箇所にIPアドレスが表示されるので下記コマンドで接続可能(ただし、PCも同一ネットワーク上にないといけないので注意)

```
$ adb connect <ip-address>
connected to <ip-address>:5555

※MDNSをサポートしていれば下記でもいけるみたい
$ adb connect Android.local
```

* デバイスの接続確認は下記コマンド実施

```
$ adb devices
List of devices attached
<ip-address>:5555 device

```


> 有線がない場合 (ポケットWifiしかないときや、外でWifiしか繋げないなど)はどうすれば良いのか。。
> 色々と探してみたが、やはり一度は有線に繋ぐ必要がある模様。
> もし有線に一度も繋がなくて良い方法をご存知の方いらっしゃいましたら、教えてくださいmm


* Wifiで接続するには、上記で一度「adb connect」で接続した後に下記コマンドを実行

```
$ adb shell am startservice \
    -n com.google.wifisetup/.WifiSetupService \
    -a WifiSetupService.Connect \
    -e ssid <Network_SSID> \
    -e passphrase <Network_Passcode>
```
* 接続を確認するには下記コマンド実施し、下記の様な項目が出てくればOK

```
$ adb logcat -d | grep Wifi
...
04-10 12:30:35.265  1287  1287 V WifiWatcher: Network state changed to CONNECTED
04-10 12:30:35.266  1287  1287 V WifiWatcher: SSID changed: "SSID"
04-10 12:30:35.268  1287  1379 I WifiConfigurator: Successfully connected to SSID
```
* Wifiに接続されると、画面上にもWifi接続の情報が出てくるので、有線を外して再度WifiのIPアドレスで接続し、接続状況を確認(ここもPCは同一ネットワーク上にある必要がある)

```
■WifitのIPアドレス指定で接続
$ adb connect <ip-address>
connected to <ip-address>

■Pingで接続確認
$ adb shell ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=6.67 ms
```
* Wifiの設定をリセットする場合は下記コマンドを実施

```
$ adb shell am startservice \
    -n com.google.wifisetup/.WifiSetupService \
    -a WifiSetupService.Reset
```

## Lチカサンプルをやってみる
* [ボタンでLチカサンプル](https://github.com/androidthings/sample-button)をcloneしてくる(今回はforkした後のものにしております)

```
$ git clone git@github.com:beta-yumatsud/sample-button.git
```
* Android Studioを起動後、「Open an existing Android Studio project」を選択し、cloneしてきたプロジェクト開く
* githubに記載のある[配線図](https://github.com/beta-yumatsud/sample-button/blob/attendance-contact-button/rpi3_schematics.png)通りに配線を接続 (下記は接続してみた図)
![IMG_2741.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/690c5385-ce2c-b17d-93b0-9a8b5e97d4f7.jpeg)

* Androidアプリと同様、Runボタンからアプリを実行。正しくAndroid Thingsを入れたラズパイと繋がっていると下記のようにConnected Devicesに出てくるので、こちらで実行
![IMG_8255.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/3667b765-af9b-405d-bd7b-8c7cd40afabd.jpeg)

* Android Studio上でエラーなどが出なければ正しくインストールされるので、早速ボタンを押してみる。ボタンを押してLEDが光れば成功!!
![IMG_6643.JPG](https://qiita-image-store.s3.amazonaws.com/0/71637/54143a92-e399-ed86-2de8-349ac509ffd0.jpeg)

ここまでできれば、ボタンを押したら通信するようにすることも可能なので、このサンプルをベースに色々とやってみると面白いかもですね。

## 開発メモ
* アプリケーションのlogは通常のアプリと同様logcatから見ることができる
* Android Device Monitorを起動すると通常のAndroidデバイスと同様にデバイスの中身が確認可能
* Android Studioで新規にアプリケーションを実装するときは、一旦[Template](https://github.com/androidthings/new-project-template)をimportしてからから実装し始める必要あり(多分)

## コマンドメモ

```
■接続
$ adb connect <ip-address>

■接続デバイス確認
$ adb devices

■ラズパイにログイン
$ adb shell

■バックボタンイベント
$ adb shell input keyevent KEYCODE_BACK

■ホームボタンイベント
$ adb shell input keyevent KEYCODE_HOME

■強制終了
$ adb shell am force-stop <パッケージ名>

■インストールされているパッケージ一覧確認
$ adb shell pm list package
```

## 個人的感想
* 一度ネットワークに接続してしまえば、ラズパイをモニタに接続する必要はないのは良し
* Androidアプリのデプロイは、deviceに接続された状態でAndroid StudioからデプロイすればOKなのは楽ちん
* ネットワーク無しの場合、PCとUSB接続してビルドする開発ができないのは残念
* 理想は、ネットワーク無しでもArduinoの様にPCと接続してアプリの開発ができると嬉しい(Androidアプリと同様)

## Next
* 過去にやった「[勤怠連絡ボタンを作ってみる](http://qiita.com/yumatsud/items/3b766b2997b411633ff5)」をAndroid Thingsでやってみる
* その際、Google Cloud Pub/Sub、Functionsを使ってみる