追記(10/16 11:02): もう少しちゃんと書きました。
TL;DR
- Windows 10 Mobileのテザリングを有効にするやつMS-TCCってちゃんと仕様あった
- AndroidでMS-TCC使えるようにするアプリつくってみた
- GitHubにソースとAPKあります。https://github.com/tmyt/android-mstcc
背景
Windows 10 Mobileだと、Bluetoothでペアリング済みでPC、電話ともにBluetoothがONになっているとWifiテザリングの設定を端末に触ることなくONにできる機能がありますよね。 macOSとiOSでもできるあれです。あれのWindows版。VAIOとXperiaのセットでも独自実装されてるやつがありますね。
でも今日はWindows 10の標準実装でMicrosoft拡張のMS-TCCです。詳しいことがEngadgetに書いてました。
ようするにBluetoothでMS-TCCというプロファイルをサポートしていれば、Windows 10のWifi設定からテザリングを有効にできますよ。という感じ。
MADOSMAをこの機能のためだけに比較的使ってたのですが、よく考えたらこれAndroidでもできるんじゃないかなぁ…と思い、調べてたらこの仕様ってちゃんとドキュメントあるんですね*1。
下調べ
MS-TCCのドキュメントを読むとやらないといけないことと、必要な情報がいくつか。
- 必要なもの
- APのBSSID
- APのESSID
- APのパスフレーズ
- やらないといけないこと
- SDPでGUID
{232E51D8-91FF-4c24-AC0F-9EE055DA30A5}
を広告 - リクエストを処理してテザリングを有効にする
- SDPでGUID
- やったほうがいいこと
- 端末が圏外かどうかとか見てエラー返す
必要なもののうち、ESSIDとパスフレーズはWifiManager#getWifiApConfiguration
をリフレクションで叩くと普通に読める。問題はBSSIDで、フィールドはあるけどここに入ってない。BSSIDは通常MACアドレスと同じなのでMACアドレスを読めばいい…のだけど、Android 6.0からWifiのMACアドレスが読めなくなってしまった。ので今回はなぜかまだ正しい値を読めるip addr
コマンドを実行して結果からMACアドレスを探すことに。
やらないといけないことについては、BluetoothAdapter#listenUsingRfcommWithServiceRecord
でBluetoothソケットを作るとSDPは広告できるし、リクエストを処理してテザリングを有効にするのはWifiManager#setWifiApEnabled
をこれまたリフレクションで叩くと実現できそう。
できました
そんなこんなでやってみたら動いたのでGitHubにソースとかおいておきました。
ところで、MS-TCCのドキュメントを読んでいただければわかるとおもいますが、この仕様、テザリングをONにすることはできるのにOFFにすることはできないんですよ。なのでテザリングの自動OFF機能がついてる機種以外はONになりっぱなし。最後OFFだけ手動でやってください。
いまのところAPKなしでソースだけなので各自ビルドしてください。あとBluetoothがOFFだった時のエラー処理が何も入ってないのでたぶんやばいです。 BluetoothがOffだったりOn/Offされたときにおかしくならないようにして、APKにしました。GitHubのReleasesからどうぞ*2。
これできたからRobinのテザリングをWindows 10からリモートでONにできるようになったのでますますMADOSMAの出番が減ってしまいそうだなーって…