Android ThingsのサンプルプログラムをRaspi3で動かしてみた

kinneko2016-12-15

その前に、昨日の続きを少し。

昨日のはこれ。
Android Thingsのディベロッパーリリースが出たので起動してみた
http://d.hatena.ne.jp/kinneko/20161214/p1

WiFiはできるのかな? (ドングル選ぶ感じ)

カニWiFiドングルがあったので、差し込んで見る。
Androidはデバイスのホットプラグには対応していないので、再起動する。

rpi3:/ $ reboot

$ ./adb connect 192.168.51.86
connected to 192.168.51.86:5555
$ ./adb shell
rpi3:/ $
rpi3:/ $ dmesg | grep wlan
[   31.638832] brcmfmac: brcmf_add_if: ERROR: netdev:wlan0 already exists

dmesgを眺めると、ドライバは入っているようだ。

[    3.048153] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[    3.149682] usb 1-1.2: New USB device found, idVendor=0bda, idProduct=8178
[    3.149693] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.149701] usb 1-1.2: Product: WN-G300UA
[    3.149708] usb 1-1.2: Manufacturer: I-O DATA DEVICE, INC.
[    3.149716] usb 1-1.2: SerialNumber: 00e04c000001
[    3.727092] console [ttyAMA0] enabled

/dev/socket/wpa_wlan0というのができているけど、これは違いそう。
logcatしてみると、WiFiは動こうとはしているようだ。
しかし、デバイスに対応したファームイメージがないので動いてない感じかな。

01-01 00:01:10.633   410   456 D WifiNative-HAL: Failing getSupportedFeatureset because HAL isn't started

ブロコム専用?

インストールされているアプリ

アプリのリスト。

rpi3:/ $ pm list packages
package:com.android.providers.telephony
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.externalstorage
package:com.android.htmlviewer
package:com.android.providers.downloads
package:com.google.android.iot.frameworkpackagestubs
package:com.android.defcontainer
package:com.android.pacprocessor
package:com.google.wifisetup
package:com.android.certinstaller
package:android
package:com.android.mtp
package:com.android.backupconfirm
package:com.android.provision
package:com.android.statementservice
package:com.android.providers.settings
package:com.android.sharedstoragebackup
package:com.android.webview
package:com.android.inputdevices
package:android.ext.shared
package:com.android.onetimeinitializer
package:com.android.keychain
package:com.google.android.gms
package:com.google.android.gsf
package:com.google.android.tts
package:android.ext.services
package:com.google.android.things.permissions
package:com.android.packageinstaller
package:com.android.proxyhandler
package:com.android.managedprovisioning
package:com.android.settings
package:com.android.iotlauncher
package:com.android.shell
package:com.android.wallpaperbackup
package:com.android.providers.userdictionary
package:com.android.location.fused
package:com.android.bluetoothmidiservice
package:com.android.bluetooth
package:com.android.providers.contacts
rpi3:/ $ ls /system/app/
AndroidThings        ExtShared                KeyChain               WifiSetup
Bluetooth            GoogleTTS                PacProcessor           webview
BluetoothMidiService HTMLViewer               UserDictionaryProvider
CertInstaller        IoTFrameworkPackageStubs WallpaperBackup

rpi3:/ $ find /system/app | grep apk
/system/app/AndroidThings/AndroidThings.apk
/system/app/Bluetooth/Bluetooth.apk
/system/app/BluetoothMidiService/BluetoothMidiService.apk
/system/app/CertInstaller/CertInstaller.apk
/system/app/ExtShared/ExtShared.apk
/system/app/GoogleTTS/GoogleTTS.apk
/system/app/HTMLViewer/HTMLViewer.apk
/system/app/IoTFrameworkPackageStubs/IoTFrameworkPackageStubs.apk
/system/app/KeyChain/KeyChain.apk
/system/app/PacProcessor/PacProcessor.apk
/system/app/UserDictionaryProvider/UserDictionaryProvider.apk
/system/app/WallpaperBackup/WallpaperBackup.apk
/system/app/WifiSetup/WifiSetup.apk
/system/app/webview/webview.apk


weave関係は、/system/etc/weaved/traits/metrics.json なんてのしか見当たらない。

サンプルアプリをビルドしてみる

簡単に試せるアプリは用意されていないようなので、サンプルソースからビルドするしかない。


手元のAndroid Studioが古いので、2.2.3にアップデートしておく。
Download Android Studio and SDK Tools | Android Studio
https://developer.android.com/studio/index.html


Studioを起動して、Terminaから、以下を入力しRaspi3に接続する。

$ adb connect 192.168.51.86
connected to 192.168.51.86:5555
$ adb devices
List of devices attached
192.168.51.86:5555      device


サンプルコートはLEDやボタンやサーボ制御などいくつか用意されている。
Samples | Android Things
https://developer.android.com/things/sdk/samples.html

  • Simple PIO - Runs basic code that exercises the PIO APIs. Each sample is an Android module that can be run independently.
  • Simple UI - Basic user interface that represents each GPIO on the board by an interactive switch widget on the display.
  • Button - Using a button input driver from the peripheral driver library to listen for GPIO state changes and generate Android key events.
  • UART Loopback - Emulates a loopback adapter for the selected UART port. Echoes all data back out the same port.
  • Doorbell - Smart doorbell that captures a camera image, analyzes it, and sends it to a companion app using the Google Cloud Platform and Firebase.
  • Weather Station - Integration of multiple peripheral sensors to analyze and display current weather information. Data can optionally push to the Google Cloud Platform for further analysis.

この中から、ボタンのサンプルを試す。
いわゆるLチカもの。
ソースはこちら。
https://github.com/androidthings/sample-button


プロジェクトをcloneしてくる。

$ git clone https://github.com/androidthings/sample-button.git
Cloning into 'sample-button'...
remote: Counting objects: 283, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 283 (delta 78), reused 283 (delta 78), pack-reused 0
Receiving objects: 100% (283/283), 1.89 MiB | 690 KiB/s, done.
Resolving deltas: 100% (78/78), done.

File->New->Inport projectから、cloneしたプロジェクトを選んで読み込む。
いきなりエラー。

Failed to sync Gradle project 'sample-button'
Error:Failed to find Build Tools revision 24.0.3
Install Build Tools 24.0.3 and sync project

クリックして、ビルド・ツールを更新する。
Gradleもアップデートしたほうがいいよとダイアログが出るので、これもアップデート。


アプリ名は、com.example.androidthings.button。
BoardDefaultsとButtonActivityがあるだけ。
BoardDefaultsは、ボードの判定とgpioのリスト取得をしているだけ。
ButtonActivityは、スペースキーに連動して、LEDを点灯するだけ。
build.gradleを見ると、"minSdkVersion 24"になっている。
え? API24(Android7.0)指定なのか...
普通にAndroid端末側と通信するようなわけじゃなく、thingsデバイス上で動くアプリなのね。
一気にやる気なくなってきた...


現状のバグなどは、こちらにまとめられている。
Release Notes | Android Things
https://developer.android.com/things/preview/releases.html

  • Apps using Google Play Services APIs must compile against SDK version 10.0.0 or newer.

これあたり注意?
Release Notes  |  Google APIs for Android  |  Google Developers
https://developers.google.com/android/guides/releases
November 2016 - v.10.0がいるということね。
Google Repositoryにチェックが入っていれば問題ないってことだけど、入っているので問題なし。


Studioから、ターゲットをRaspi3にしてビルド&インストールしてみる。
画面白くなって、アプリ動いたみたい。
だけどなんだ?
まだ外付けのデバイス作ってないので、何もおきない感じ。
スクリーンショットだけでも取るか。

$ adb shell
rpi3:/ $ screenrecord --verbose /sdcard/DCIM/button.mp4
Main display is 1824x984 @60.00fps (orientation=0)
Configuring recorder for 1824x984 video/avc at 4.00Mbps
Content area is 1823x984 at offset x=0 y=0
^CEncoder stopping; recorded 1 frames in 12 seconds
Stopping encoder and muxer
Executing: /system/bin/am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/button.mp4
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/DCIM/button.mp4 }
Broadcast completed: result=0
rpi3:/ $ exit
$ adb pull /sdcard/DCIM/button.mp4

https://lh3.googleusercontent.com/Mb5Lq6ikcnHkKU1kb2O0bGS17bcId1riHWJS88kQ3i4r_a9w28c5HSvHqhwUt2wDqj1Z479uyHu3m-DzmPgWl6vZSG7NOXZ0=w1280-h800-no?.jpeg

USBキーボードつなげて、スペース押すとLチカるはず。
あと、USBキーボードはホットプラグできないので、起動時から接続してある必要がある。
再起動すると、インストール済みのアプリが問答無用で立ち上がる。
複数アプリあるときは選択が必要なので、これもキーボードorマウス必要。


アプリケーションを切り替えるには、ESCキーを押す。
押すだけだと、ロゴ画面に戻るけど、もう一度押すとアプリセレクタが出る。
https://lh3.googleusercontent.com/wOMBXCq9xidZR8rLyAwLNmfzNwzByzOHiSzeNVdoYfU7UkwOHr-rKO-YHoXQolVyn0jmWlfakoMY16A0q8lkvaibHsVgDWczxg=w640-h400-no?.jpeg
なんか反応鈍いのはわざとか?
キーボードだけだとカーソルで選択するにはtabキーを押す。
https://lh3.googleusercontent.com/6EEf664jcwa_dbjg72UYVoN2R3dm_lOJRpHwVi5CUBLHO5NewONn0hxSOGwvxanuXkiCXx65gZBUDR92VacO5TeaXrlwtODtMg=w640-h400-no?.jpeg
マウスがあったほうが便利だな。
ANRもあるようだ。
https://lh3.googleusercontent.com/_PulxIWmInR5OAoGn_2mP-YieKG2r8EJjiaIlts7-ZPKcP7cifAi9cH9qJ0tz9mT3OQp3HhrF5j_dasUm5qmjyRYrxqHBtXkBw=w640-h400-no?.jpeg
あれ?こっちか。


繋がれたひよこ on Twitter: "ハードウェア制御してるから、別のアプリでハード触ろうとすると、前のプロセスでドライバ握ってるから落ちるん…"
https://twitter.com/tomo_watanabe/status/809244204492689408



なんか究極の無駄遣いしている感じがする。
なんでLチカするだけに、こんだけのリソースを使わねばならないのか...
この先にあるものが見えない。
ブレットボードと必要な部品は、そろえてきたのだけど、配線する元気もなくなった。


Weave待ちだな。
DaydreamとCardboardがGoogleVRとしてまとめられているように、Google IoTとして、ThingsとWeaveがまとめられている。
Google Internet of Things  |  Google's Internet of Things Solutions  |  Google Developers
https://developers.google.com/iot/
きっと、今後連携もあるんだろう。
音声だけで応答できるデバイスを自前で作れるようになるなら、Androidのメリット出るし、きっと面白くなると思う。
そうなったら、weaveで音声応答できるリモコンデバイス作りたいとこですね。「ちょっと寒くね?」「室温を二度上げときました。まだ寒かったら言ってください」的なの。

何が面白いのかピンとこないので、識者の発言をまとめてみた(けどわかんないまま)

Atsushi Eno on Twitter: "androidthings-0.1-devpreview.jarのバインディングはclone()をするだけで行けたので誰でも作れると判断した"
https://twitter.com/atsushieno/status/808790209215107073
ymst on Twitter: "デバイスドライバJavaで書かれているの相当面白い(が、あまり伝わらないかw) https://t.co/tIydEIobm5"
https://twitter.com/yyaammaa/status/808825797385457664
ymst on Twitter: "OTAとかも面倒みてくれるならかなり良いのではと思ったが、どうなんだろう"
https://twitter.com/yyaammaa/status/808822121061195778
ymst on Twitter: "JavaでI2CやUARTのデータ送受信するのあついなw https://t.co/diqPZFbMDB"
https://twitter.com/yyaammaa/status/808824407598583810
Tatsuo Nagamatsu on Twitter: "Android Thingsのポイントは Androidの開発環境にて Java + 一部の Google services (Firebase)を利用して IoTデバイスを構築できるところかな。Weaveは含まれず #androidthings"
https://twitter.com/nagamatu/status/808949154244239361
明日鍵 on Twitter: "GPIOがAndroid Frameworkから使えるようになってる / GPIO | Android Things https://t.co/VmO1nRTs6F"
https://twitter.com/tomorrowkey/status/808816954802774018