2017/04/01

[android]WiFiテザリング中だったらSSIDを知りたい

ESP8266のSmartConfigを使えるようになっておきたい。
Androidの設定アプリから、今つないでいるWiFiのAPを登録することはできた。
WiFiがない場所でも、Nexus5のテザリングで使えるようにしたいのだが、動かすと<unknown ssid>になり、アプリが死んでしまった。

面倒だが、対応できるのかどうか調べてみよう。


http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/wifi/java/android/net/wifi/WifiManager.java#1541

WifiManager#getWifiApState()なり、isWifiApEnabled()なりを使えば、テザリング中かどうかを知ることはできるらしい。
@hideなので今後はわからんが、Android 7.1.1まではありそうだ。
あ、Android7では@SystemApiとかいう修飾が付いてるから、制限されるのかも。
持ってないので知らん(Java reflection is impossible、と書いているから、できんのかも)。

名前からすると、getWifiApConfiguration()で情報がとって来れそうだが、SmartConfigアプリと違ってWifiConfigurationを返す。
まあ、SSIDだけわかればよいから、問題なかろう。

幸い、reflectionしたサンプルがstackoverflowにあったので、使わせてもらう。
http://stackoverflow.com/questions/10850936/android-tether-get-current-ssid


テザリングしていたら、という条件を入れようかと思ったが、今のところ「<unknown ssid>」という文字列になっているから、その場合だけWifiApから取ってくることにした。

 

Javaが、ハードTABでインデントしているので、置換。
これでたぶんできたんだと思う。自信はないが。。。

$ find ./ -name "*.java" -exec sh -c 'expand -t 4 {} > $$$ ; mv $$$ {}' \;

 

よし、と実行すると、SSIDはテザリングの設定画面で入力していたものが表示された。
よしよし、と進めると・・・やはり死んでしまった。
どうやら、BSSIDがnullだったためのようだ。
無線LAN - BSSIDとESSID
通常は、BSSIDはMACアドレスと同じ、ということだったので、Nexus5の端末情報からWiFi MACアドレスを見て、まずはコード埋め込みにして動作確認することにした。

うん、BSSIDを入れておくと、死ぬことはなくなった。
が、ESP8266がNexus5を見つけられないのか、コンソールには何も出ない。

 

なんとなくだが、SmartConfigはWiFiクライアント同士が通信するようなものになってるのではないだろうか?
だからAPになったNexus5からはうまくいかない、と。

面倒だが、SmartConfigがどういうしくみなのかを調べる段階に来てしまったようだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。