WiFi について
Llama では、WiFi を使用した位置確認は「実験中」の扱いです。
これ、おそらくは「WiFi の概念が複雑すぎて、一般人の理解を超えているから」ではないかと思います。
逆に言えば、実験中といってもプログラムがバグだらけということではない。
十分使えるプログラムだけど、使い方の説明が難しいから、わかる人だけ使ってね、と言うことです。
じゃぁ、ややこしい部分を整理してみましょう。
目次
Android の WiFi 動作
まず、わかりやすいところから。
WiFi をオンにすると、しばらくしてネットワークに接続します。
オフにすると、比較的すぐにネットワークから切り離されます。
まぁ、当然だね。
オンだと電波を受信・送信しますので、電池の消耗が早くなります。
オフだと電池持ちがよいです。
では、オンにしたときに何が行われているか?
まず、周囲を飛び交っている電波を受信して、周囲の「ネットワーク」を識別します。
続いて、過去に接続したことがあるネットワークがあれば、接続を試みます。
パスワード認証も通って接続に成功すると、(普通は)DHCP に問い合わせを行います。
DHCP から返事があれば、IP アドレスが割り振られ、DNS サーバーが設定され、その他もろもろも設定を行ってネットに接続します。
過去に接続したことがあるネットワークがなければ、数秒ごとに周囲のネットワークの識別を続けます。
つまり、オンの状態であれば、たとえネットに接続していなくても、WiFi 回路は通電されています。
電池消費を考えると、接続できないなら早々にあきらめてオフにするのが良い、と言うことになります。
Android には WiFi スリープ、と言う設定があります。
画面がオフの待ち受け状態のときに、WiFi を休止するかどうかです。
スリープと言うと一時的に休むように感じますが、事実上は「画面オフで WiFi をオフにする」と言うことです。
通常のオフとの違いは、また画面がオンになったときに、自動的にオンになること。
電話を使っていないのだから WiFi だって必要なかろう、ということで、電池消費を抑えるにはかなり効果があります。
スリープしない設定や、充電中のみスリープしない設定にもできます。
Llama WiFiネットワークを確認
Llama では、WiFi を使用して位置確認を行うことができます。
WiFi 電波はせいぜい 200m しか飛びません。普通は壁などで弱められ、100m程度です。
これは「家」を識別するには良い方法です。
WiFi がオンであれば、先に書いたように周囲の電波を受信して、周囲のネットワークを識別できます。
電波には MACアドレス(ネットワーク機器ごとに固有のアドレス)や、ネットワーク名が載せられているので、これを使えば場所を調べられます。
しかし、一つ問題があります。次の状況を考えてみてください。
・WiFi で「家」を識別している。
・WiFi は、「画面オフでスリープ」設定になっている。
・画面オフのまま、携帯を持って出かけた。
この携帯が、家から出たことに気づくのは「次に画面がオンになったとき」です。
もうちょっと早く気づいてほしいけど、WiFi スリープ中はオフと同じで、通電されていないのだから仕方がない。
Llama WiFi 確認間隔
上のような状況では、ぜんぜん「WiFi による位置確認」が使い物になりません。
そこで、Llama では、WiFi がオフになっているときでも、定期的に WiFi をオンにして、周囲の電波を受信します。
これは受信だけが目的で、ネットワークに接続するわけではありません。
時間は1秒程度で終わりますし、電波を出さないので電池消費も最低限です。
普通は確認間隔を5分くらいに設定すると良いかと思います。
WiFi 確認間隔は、設定画面からも、イベントからも変えられます。
イベントから変えた場合、変えた時点で最初の確認が行われます。これ、地味に重要。
WiFi 確認間隔での確認(面倒なので、以下「WiFi確認」と書きます)は、「オフのときに」電波を受信するのが目的なので、当然オンのときは動作しません。
ややこしいところですが、この報告間隔は「WiFi 確認間隔」とは無関係です。
そのため、WiFi確認間隔を「ずっとしない」に設定しても、WiFiの確認は行われることになります。
ここで言う「オン」は、ネットワークに接続しているか否か、で調べているようです。
つまり、オンであっても過去に接続したネットがないときはオフ扱い。オンであってもスリープ中はオフ扱い。
接続しようとして DHCP に問い合わせても、IP アドレスをもらってネットに接続するまでは「オフ」扱いです。これも重要。
設定の衝突
WiFi 確認は、家を認識するために行います。
寝ている間は移動もしません。夜は電池消費を抑えるために、WiFi オフ、位置確認もしないようにして、WiFi を完全に使わないようにしたとします。
さて、朝になりました。WiFi をオンにして、WiFi スリープ時に備えて確認間隔も 5分に設定することにします。
…と、これは実は動きません。先に「重要」と書いたことを見直してみてください。
WiFi オンの最初の動作中は、ネットに接続できていないので「オフ扱い」です。
確認間隔を変えると、その時点で確認を行おうとします。そして、「オフ扱い」なので実際確認を行います。
「オン」にしてからネットワークに接続するまでは、20秒程度かかります。しかし、確認は1秒で済み、Llama は確認が終わると WiFi を「オフ」してしまいます。
以降は、オフになったままなので、WiFi への接続は行われません。
WiFi オンと、Llama WiFi確認間隔の設定は同時には行えない、ということです。
普通に考えれば、WiFi オンのときに確認間隔を設定する必要はないのですが、WiFi スリープがあるので実際は設定が必要な場合があります。
なかなか悩ましい問題ですが、なにせ「実験中」扱いの機能ですし、利用者側で工夫するしかありません。
(まぁ、遅延イベントを使って、WiFi オンの1分後に WiFi 確認間隔を設定すればよいでしょうね)