家に帰ったらワイヤレスデバッグでスマホの情報を持ってきてくれるホームサーバーを作ろうとして諦めた話
目次
家に帰ったらスマホが自宅のWi-Fiにつながって、ホームサーバーがそれを検知し、ADBのワイヤレスデバッグ経由でスマホの情報をいい感じに吸い上げてくれる。
そういう仕組みを作ろうとしていました。結論から言うと、いったん諦めました。
作りたかったもの
やりたかったことはかなり単純です。
- スマホが家のWi-Fiに接続される
- ホームサーバーがスマホを見つける
adb connectで接続する- 端末情報などを取得する
- PC側に保存する
イメージとしては、自宅に帰った瞬間にスマホの状態がサーバー側に保存される小さい自動化です。
取得したかった情報は、スマホ本体の状態やアプリの使用状況です。これらをPCで動作しているエージェントに渡して、自分の生活ログをコンテキストに含めたい、というのが目的でした。
アプリの使用履歴はAndroidのAPIから取得できますし、端末の状態はADB経由でもある程度取得できます。
1adb shell dumpsys usagestats
2adb shell cmd usagestats query-events
3adb shell cmd usagestats query-usage-stats dailyなので「ワイヤレスデバッグを有効にしておけば、あとはホームサーバーから叩くだけでは?」と思っていました。
最初に考えた構成
構成はこんな感じです。
- ホームサーバー: Windows上に常駐するPythonサーバー
- スマホ: Android端末
- 通信: 同じLAN内のADBワイヤレスデバッグ
サーバー側では、まずネットワーク内の端末を探します。
1nmap -sn 192.168.1.0/24指定した端末を見つけたら、ADBで接続します。
1adb connect 192.168.1.20:5555
2adb devices接続できたら必要な情報を取って、JSONかMarkdownで保存するつもりでした。
つまずいたところ
ワイヤレスデバッグのポートが不安定
Androidのワイヤレスデバッグは、最初にペアリングが必要です。
ただ、一度ペアリングすれば、ペアリング情報は削除するまで有効です。なので、以降は自動で接続できると考えました。
ここまでは問題ありません。想定外だったのは、ワイヤレスデバッグの接続ポートが安定しないことでした。
スマホのワイヤレスデバッグは表示上は確かに有効なままなのに、なんらかのタイミングでポートが閉じてしまうことが発覚しました。
セキュリティ上の仕様なのか、Androidのバグなのか、はたまた自分の環境の問題なのかはわかりませんが、これが数時間おきに起こるため、安定して情報を取るのが難しい状態でした。
原因はわかりませんでした。謎です。
ポート番号が可変である(解決)
ちなみに、もう一つ、デフォルトのワイヤレスデバッグでは、オンオフするたびにポート番号がランダムに変わるという問題もありました。
これは、ADB側で固定ポートを指定することで解決できました。
1adb tcpip 5555代替案
現在は、ADBではなく、スマホ側からホームサーバーへ送る方式にしています。
軽量なAndroidアプリを作成し、家のWi-FiにつながったタイミングでHTTPリクエストを投げる形です。
開発が面倒になるので、最初はPC側だけで完結させるつもりでした。
ただ、やってみるとAndroid Studioで簡単にアプリを実機に流し込めますし、動作確認も思ったより楽でした。そこまで大変ではなかったです。
ありがとうAndroid Studio!
まとめ
ワイヤレスデバッグでホームサーバーからスマホの情報を取る仕組みは、安定させられず諦めました。
素直にスマホ側へクライアントアプリを作った方が楽でした。