読者です 読者をやめる 読者になる 読者になる

tmytのらくがき

個人の日記レベルです

Windows 10からAndroidのテザリングをONにしてみたい

追記(10/16 11:02): もう少しちゃんと書きました。

TL;DR

背景

Windows 10 Mobileだと、Bluetoothでペアリング済みでPC、電話ともにBluetoothがONになっているとWifiテザリングの設定を端末に触ることなくONにできる機能がありますよね。 macOSiOSでもできるあれです。あれのWindows版。VAIOXperiaのセットでも独自実装されてるやつがありますね。

でも今日はWindows 10の標準実装でMicrosoft拡張のMS-TCCです。詳しいことがEngadgetに書いてました。

japanese.engadget.com

ようするにBluetoothでMS-TCCというプロファイルをサポートしていれば、Windows 10Wifi設定からテザリングを有効にできますよ。という感じ。

MADOSMAをこの機能のためだけに比較的使ってたのですが、よく考えたらこれAndroidでもできるんじゃないかなぁ…と思い、調べてたらこの仕様ってちゃんとドキュメントあるんですね*1

下調べ

MS-TCCのドキュメントを読むとやらないといけないことと、必要な情報がいくつか。

  • 必要なもの
  • やらないといけないこと
    • SDPでGUID {232E51D8-91FF-4c24-AC0F-9EE055DA30A5} を広告
    • リクエストを処理してテザリングを有効にする
  • やったほうがいいこと
    • 端末が圏外かどうかとか見てエラー返す

必要なもののうち、ESSIDとパスフレーズWifiManager#getWifiApConfigurationをリフレクションで叩くと普通に読める。問題はBSSIDで、フィールドはあるけどここに入ってない。BSSIDは通常MACアドレスと同じなのでMACアドレスを読めばいい…のだけど、Android 6.0からWifiMACアドレスが読めなくなってしまった。ので今回はなぜかまだ正しい値を読めるip addrコマンドを実行して結果からMACアドレスを探すことに。

やらないといけないことについては、BluetoothAdapter#listenUsingRfcommWithServiceRecordBluetoothソケットを作るとSDPは広告できるし、リクエストを処理してテザリングを有効にするのはWifiManager#setWifiApEnabledをこれまたリフレクションで叩くと実現できそう。

できました

そんなこんなでやってみたら動いたのでGitHubにソースとかおいておきました。

github.com

ところで、MS-TCCのドキュメントを読んでいただければわかるとおもいますが、この仕様、テザリングをONにすることはできるのにOFFにすることはできないんですよ。なのでテザリングの自動OFF機能がついてる機種以外はONになりっぱなし。最後OFFだけ手動でやってください。

いまのところAPKなしでソースだけなので各自ビルドしてください。あとBluetoothがOFFだった時のエラー処理が何も入ってないのでたぶんやばいです。 BluetoothがOffだったりOn/Offされたときにおかしくならないようにして、APKにしました。GitHubのReleasesからどうぞ*2

これできたからRobinのテザリングWindows 10からリモートでONにできるようになったのでますますMADOSMAの出番が減ってしまいそうだなーって…