ホームオートメーションを試しています。私の目標は、Android スマートフォンが自宅の Wifi を離れたときに HTTP リクエストを送信し、再接続したときに別の HTTP リクエストを送信することです。目標は、私が家を出たとき、より具体的には、電話が家を出たとき、IP カメラのモーション検出が有効になることです。そして、家に帰ると武装解除されています。IP カメラには HTTP インターフェースがあり、プログラムで武装解除を行うことができます。
これは、私が家を離れているときに、玄関で動きを検出すると、Web カメラがメールを送信することを意味します。実際に家に入る約 1 分前に携帯電話が Wi-Fi に再接続されるため、ドアに入る直前に動体検知が解除され、自分が家に入ってきたことを知らせるアラームが鳴りません。また、携帯電話が Wi-Fi に接続されているためです。ドアを出ても、自分が出て行ったというアラームも鳴りません。
私の現在のアプローチでは、LAN 上で 24 時間 365 日稼働している Linux サーバーで 1 分ごとに cron ジョブを実行しています。2 つの Bash スクリプトで構成されています。1 つは自分の電話の存在を検出します (1
電話が存在する場合は返され、存在し0
ない場合は返されます):
cat /usr/local/bin/detect-phone.sh
#!/bin/bash
arping -D -c 10 -I eth0 nexus4
...そして、自動化を行うスクリプトを作成する他のユーザー。arping
にある 0 バイトのファイルの存在とともに、ネットワーク上のデバイスを検出するために使用します/tmp/phone-presence
。一方が電話が存在すると言い、もう一方が存在しない場合、必要な HTTP 要求を送信して、Web カメラのモーション検出を有効または無効にします。
cat /usr/local/bin/toggle-webcam-alarm.sh
#!/bin/bash
/usr/local/bin/detect-phone.sh &> /dev/null
IS_HOME_NOW=$?
WAS_ALREADY_HOME=0
if [[ -f '/tmp/phone-presence' ]]; then
WAS_ALREADY_HOME=1
fi
ENABLE_WEBCAM=''
if [[ "$WAS_ALREADY_HOME" -eq 0 && "$IS_HOME_NOW" -eq 1 ]]; then
/usr/bin/logger "Phone just joined network, disarming webcam alarm"
ENABLE_WEBCAM=0
> /tmp/phone-presence
elif [[ "$WAS_ALREADY_HOME" -eq 1 && "$IS_HOME_NOW" -eq 0 ]]; then
/usr/bin/logger "Phone just left network, arming webcam alarm"
ENABLE_WEBCAM=1
rm /tmp/phone-presence
fi
if [[ ! -z "$ENABLE_WEBCAM" ]]; then
/usr/bin/curl "...some URL that accepts $ENABLE_WEBCAM..." &> /dev/null
fi
これは機能しますが、存在検出は信頼できません。私のログは次のようなエントリでいっぱいです:
tail /var/log/messages
...
Sep 6 10:37:11 logger: Phone just left network, arming webcam alarm
Sep 6 10:38:01 logger: Phone just joined network, disarming webcam alarm
Sep 6 10:47:11 logger: Phone just left network, arming webcam alarm
Sep 6 10:48:02 logger: Phone just joined network, disarming webcam alarm
そして、これらのエントリは、家を出たからでも、電話にまったく触れたからでもありません。私の電話はずっと Wi-Fi ネットワークに接続されていたはずです (まあ、少なくとも切断するように言わなかったので、強い信号がありました)。
したがって、私の現在のソリューションは信頼できません。出入りするときに、自分の写真をメールで受け取ることがあります。-c
for で指定されたカウントを増やしてarping
も、通常、電話の検出の信頼性が向上するわけではありません。さらに、ばかげて高く設定すると、cron ジョブが毎分実行されるため、問題が発生し始めます。
電話が家を出るのを観察するのにさらに数分かかるかどうかはあまり気にしませんが、電話が実際にWifiに再接続してから、ウェブカメラのモーション検出が解除されるまでに1分以内かかる必要があるため、取得できません自分へのアラーム。家にいるときに Web カメラを誤って有効にしてはならず、家にいないときに誤って無効にしてはなりません。
私が検討したが、実装方法がわからない他のいくつかのアプローチ:
- SNMP を使用してルーター (Tomato を実行) に毎分クエリを実行し、デバイスがまだネットワーク上にあるかどうかを確認します
arping
。 dnsmasq
電話が Wi-Fi に接続された結果として、ルーターが電話に DHCP リースを発行するときにスクリプトを実行するようにルーターを構成します。しかし、電話がネットワークから切断されるという反対のシナリオで、それがどのように機能するかはわかりません。電話には静的な DHCP アドレスがあるため、電話に割り当てられた IP は変更されませんが、DHCP 経由で IP を要求します。- Llamaを使用してプレゼンス検出を処理します。私はすでに Llama を使用して、自分の位置情報に基づいて携帯電話でいくつかのことをうまく自動化しています。電話が Wifi に参加するときにリクエストを送信するのは問題ありませんが、Wifi を離れるときはそうではありません。これは、両方のHTTP リクエストが LAN 上で送信される必要があるためです。これらには機密データが含まれています。現在、Apache をプロキシとして使用するオプションがあります。私は公開用の SSL で保護された Apache インスタンスを実行している Linux サーバーを持っており、必要に応じて (まあ、助けを借りて) インターネット上で SSL 経由でリクエストを作成し、Web カメラに転送できるように構成することができます。 LAN。そうすれば、HTTP 要求をインターネット経由で送信できますが、URL を推測するまでは、要求が暗号化されるため、誰もそれらにアクセスできません。
では、このシナリオを確実に処理するには、どのようなアプローチをお勧めしますか? 繰り返しますが、大まかな目標は、電話が家を出たときに 1 つの HTTP 要求を送信し、家に戻ったときに別の HTTP 要求を送信することです。
これまでの提案に感謝します。ここにいくつかの更新があります:
- 私の電話は、通常の ICMP ping に確実に応答しません。すぐに応答することもあれば、タイムアウトすることもあります。
- トマトは確かに持っています
wl
が、非常に不正確なようです. 特に、数か月間 LAN に接続されていなかったデバイスがまだ存在し、信号強度が良好であると見なします。バッテリーを外して棚に置いているので、それはありそうもありません。 - IFTTT の使用に問題はありません (ただし、最初は完全にローカルなものを好みます)。ただし、ジオフェンシングの側面は簡単に処理できますが、これら 2 つの HTTP 要求を送信する必要がある Web カメラ アラームを有効または無効にするために必要なトリガーを実際に実行する方法はわかりません。
- Java クラスの提案に感謝しますが、状況が本当に絶望的でない限り、このシナリオを処理するために Android アプリケーション全体を作成する必要はありません。さらに、Llama と IFTTT には、ジオフェンシングの問題を処理するためのいくつかのオプションが既に用意されています。ラマは、Wifi が接続されているか切断されているときにも、さまざまなアクションを実行できます。
arping
現在のアプローチの信頼性を大幅に向上させる方法を見つけたと思います。Androidの設定で「Wi-Fi最適化」をオフにしました。それ以来、過去 8 時間にログに表示される偽陽性ドロップは 1 回だけでしたが、通常は 1 時間に 1 回程度です。この設定が本当に役立つかどうかを確認するために、しばらくの間この設定を無効にしておきます。私の理論では、Wifi 接続がより確実に維持されるため、電話が Wi-Fi トラフィックに応答する可能性が高くなります。
また、2 つの要求 (1 つは Web カメラ アラームを有効にするため、もう 1 つは無効にするため) に対して Apache SSL プロキシをセットアップすることもできたので、必要に応じて、これらの要求をインターネット経由で安全に送信できます。
数日間ログを見た後、電話で「Wifi 最適化」をオフにした後、これは完全に信頼できるようになりました. しばらくして電話のプログラムやサービスがそれを使用しなかった場合、Wifi接続が時々スリープ状態になり、ネットワークから切断されたと思います。