経緯
- AOAデバイスと通信するAndroidアプリを作成しているが、実機になるAOAデバイスが手元にない。AOAの挙動も把握できない。
- 実機と全く同じ動作ではないかもしれないが、粗々でもデバッグしたい。
リポジトリ
ソースコードや環境作成用のスクリプトなど、以下においてあります。
Python , PyUSB を使っています。AOAデバイス-Androidアプリのメッセージプロトコルはさまざまと思いますので、手軽に変更できそうな Python を使いました。
(おそらく Zero W 以外の Raspberry Pi など Linux 系なら動作するはず...)
機材と接続図
Raspberry Pi Zero W を使用しました。(Zero2 は売り切れ)
当初は以下のように接続させていましたが、Pi - Android 間の USB を差しなおしていると Pi が再起動することがありました。
どうも、Zero を使用する場合はセルフパワー方式のUSBハブを使用した方が良いようです。
USBハブを使用するようになってからは安定しています。以下のような接続です。

動作の流れ
フローチャートを示します。
"AOAモードの機器を検出"
AOAモードで接続している機器を探します。
具体的には PID が 0x2D00 か 0x2D01 の機器を探します。
python スクリプトを再起動した場合 (既に Android がアクセサリモードになっている) や後述の "AOAモードへ変更" を実施後、などが該当します。
"接続中の機器を検出"
USB接続中の機器を探します。ハブなど関連の無いデバイスはクラスやPIDを確認し除外します。
"アクセサリの情報を送信"
Android に対して、対応しているAOAのバージョンを問い合わせたり、manufacturer や model などの情報を送信します。
"AOAモードへ変更"
Android に対して、現在の接続からAOA モードへの接続へ切り替えるように要求を送信します。
これを行うと、Android の PID が 0x2D00 (または 0x2D01) に変わります。
"入出力のエンドポイントを取得"
データの送受信に使用するエンドポイントを探します。
データの送受信にはアドレスが必要になりますが、どうも機器によって異なることがあるようです。そのため、エンドポイントを探してアドレスを調べています。
"通信"
リポジトリ上ではループバックをさせていますが、メッセージプロトコルによって変更します。
イレギュラーな状況の試験として、あえて誤ったメッセージを送信してもいいでしょう。
設定ファイル
以下を設定ファイルで変更できるようにしています。
- アクセサリの情報 (manufacturer , model , description , url , version , serial number)
- "通信" に使用するスクリプト

