モバイルデバイスが自宅のwifiネットワークに接続するときにモバイルデバイスを検出する方法


10

特定のモバイルデバイス(携帯電話、iPadなど)がネットワークに(もちろんワイヤレスで)接続したときにサーバーに認識させる最良の方法は何ですか?

例として、携帯電話で自宅のWi-Fiネットワークが適切に設定されています。彼がルーターの範囲内に入ると、ルーターは接続します(それについて新しいことはありません)。そのルーターに接続すると、彼のホームサーバーは特定のプログラムを起動します(または通知をスローしたり、ファイルに書き込んだりします)。

考えられる解決策は、サーバーがページが呼び出されたことをサーバーが認識できるように、電話から起動されるネットワークでホストされるカスタムの「Webアプリ」であると考えました。ただし、電話が自動的に接続するときにこれが可能であれば、それが最善です。

どんな考えや代替ソリューションも大歓迎ですので、事前に感謝します!


Androidフォンの場合、ローカルWebサイトを取得するcronジョブが最も簡単です。ネットワーク側からこれを行うには、RADIUSプロトコルを使用し、RADIUSサーバーを適切にセットアップする必要があります。
ハックル

ルーターのログを確認しないでください。これらのログはテキストベースであるため、ログをクエリして必要な情報のみを取得するのは簡単です。確かに誰かがこれを行うためのコードを書いていますが、そうでない場合は簡単な練習になります。

回答:


4

これはで簡単に達成できると思いますarp-scan

インストールarp-scansudo apt-get install arp-scan
ローカルネットワーク上のすべてのホストを検出します。sudo arp-scan -l

crontabを設定して、arp-scanでネットワークをスキャンし、その出力を解析してアクティブなホストを検出するスクリプトを定期的(多分2分ごと)に実行できます。

-r 33回実行するフラグが必要な場合がありました。一部のデバイスを見落とすことがあるデフォルトの2回としてはるかによく機能します。したがって:

 sudo arp-scan -l -r 3 | grep {Phone Static Assigned IP} 

私にとってLG V30 +のほうがうまく機能します。


一部のデバイスは、オンにしないと表示されない場合があることに注意してください。画面がオンになっていないと、Nexus 4が表示されません。
Nicolas Bouliane 2014年

3
import subprocess

if __name__ == '__main__':
    while True:
        sleep(5)
        p = subprocess.Popen("arp-scan -l | grep xx:xx:xx:xx:xx:xx", stdout=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        p_status = p.wait()
        if output:
            print "Yay, the devine is connected to your network!"
        else:
            print "The device is not present!"

このようにして、デバイスのMACをスキャンできます:)


2

私は実際に、次の要件を満たすソリューションを実装することを考えています。

  1. 電話機にネットワーク上でIPアドレスを割り当てる必要はありません。
  2. 電話機は、バッテリーを消耗させる信号を定期的に送信する必要はありません。
  3. ネットワーク上に多数の電話がある場合、それらのすべてが検出されます。

私の意図は、sshを使用して電話のファイルシステムをマウントすることですが、何にでも使用できます。

ローカルネットワークが192.168.1.0であるとしましょう...

したがって、ブロードキャストアドレスからUDPブロードキャストをリッスンするAPPを実装します192.168.1.255。このアプリは完全にパッシブであるため、バッテリーを消耗しません。(パケットを受信したときにのみアクティブになります)。

コンピュータ上のデーモンは、ブロードキャストをブロードキャストアドレスに定期的に送信します192.168.1.255。電話は、名前、ID、IPアドレスなどを提供するこのような信号に応答します。

これでコンピューターは電話がネットワーク上に存在することを認識し、私の場合はsshfsマウントを呼び出すことができます。

確かに、これにはプログラミング作業を含む多くの作業が必要であり、簡単ではありません。しかし、それが最も信頼性が高く、合理的な解決策になると思います。


1
うわー、基本的にはカスタムプロトコルです。このようなものは既に存在すると思います。
マイケル

1

私が考えることができる最良の方法は、そのデバイスに静的IPアドレスを与え、単純なスクリプトを使用してX秒ごとにデバイスにpingを送信し、プログラム/通知をトリガーすることです。

注意事項:多くのスマートフォンは、スリープから復帰するまでWi-Fiネットワークに接続しません。スクリプトは、時刻を考慮して、スリープ状態になる電話と家を出る電話の違いを識別できる必要があります。その後、スクリプトを実行してプログラムを実行させたり、通知を表示させたりするのは簡単です。


0

iPhoneでarp-scanと静的IPアドレスを使用して同様のことを行うスクリプトを書きました。

ここでコードを見つけることができます:https : //github.com/blackairplane/pydetect

私はPythonを初めて使用するため、クリーンアップする必要がありますが、概念を示していると思います。


0

私はこれにつまずきました、そして、私がかつて同様のことをしたとき、答えを投稿することに決めました。

私は次のことをしました:

1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.

私の場合、デバイスでHTTPサーバーを実行していました。つまり、ポート80で本質的に何も送信しないHTTP HEADリクエストを送信しただけです。デバイスが応答し、サーバーヘッダーの名前が適切であれば、これが私のデバイスです。

しかし、最初にpingを送信しないと、速く進むことはできませんでした。HTTPはTCPであり、リクエストは大きいため、WiFiのタイムアウトは4秒にする必要があります。253アドレスに対してこれを行うと、地獄のように遅くなります。しかし、253台のデバイス(おそらく)が少ないHTTPサーバーはありません。(またはあなたの場合、電話)

ルーターのログを検討することは非常に良いアイデアであり、簡単です。そして、すべてにpingするよりも高速です。一部のルーターは、アクセスするためにログインする必要さえありません。

また、デバイスがUPNPをサポートしているかどうかを確認することも重要です。存在する場合は、UPNPを使用してその存在を検出できます。これは公式の解決策になります(UPNPのUDPのブロードキャストを聞く)。ただし、すべてのデバイスでサポートされているわけではありません。ただし、すべてのデバイスがICMPもサポートしていません。(彼らは不必要に爆撃されることを望んでいない)。

別の興味深い可能性があります。DHCPパケットを探して、ルーターが新しいデバイスにIPアドレスを与えるタイミングを確認できます。しかし、これは静的IPを備えたデバイスでは機能しません。彼らは何かが必要になるまでネットワークに触れさえしませんでした。WiFi自体への接続は別のレイヤー上にあり、スニファーとして機能することを望まない限り、簡単に検出できません。雑多モードのネットワークアダプターでそれが可能かどうかはわかりません。これには追加のハードウェアが必要になると思います。

Pythonでpingを実行するには、pingプログラムへのサブプロセスを行わずに速度を失うことなく、rawソケットを作成し、ICMPパケットを手動で作成する必要があります。難しいことではありません。ウェブ上のどこかにその例があります。もちろん、送信するには、pingと同様にroot権限が必要です。これは欠点です。ソフトウェアを配布する場合、ユーザーがrootとして実行することを期待することはできません。


0

私が使用したソリューションは2つありました。(Python)

解決策1

まず、追跡したい既知のipnumbersをarpingすることでした。私はこれを3つのステップで行いました。1#は「-c1」を使用して1つのpingのみを送信します。デバイスがアクティブな場合は応答します。この関数は成功して終了します。2#use "-c3"を使用すると、3つのうちの1つで応答する時間が増えます。Wi-Fi信号が弱い場合、これで通常は十分です。3#use "-c10"これは、Wi-Fi信号が本当に悪い場合に必要になることがあります。(古いiPadは答えるのに約10回の試行が必要であることに気付きました)物事をスピードアップするために、追跡したいIP番号ごとに個別のプロセスを作成しました。

pingの間隔も、成功したかどうかに応じて変更しました。デバイスが見つかると、再度チェックするまで待機します。失敗した場合は、60秒後に再試行します。(私は家に入るときにライトをオンにしたいので)60年代は私を路上で見つけるのに十分です

これは完璧に機能しました!私が家に帰ったとき、それは私を感知して明かりを消し、私が去ったときに消えました。

解決策2

Arpingはネットワークに負荷がかかることはないかもしれませんが、すべてのpingをスキップするようにソリューションを変更し、自分のラズベリーpiに独自のDHCPサーバーを作成しました。

次に、デバイスがipnumberを取得するとすぐにスクリプトをトリガーする「on commit」を追加しました。このスクリプトは、「curl http API呼び出し」を使用して、デバイスがipnumberを取得または更新するとすぐにwwwサーバー(Flask)に通知します。

私のAndroidでは、画面がオフのときにWiFiをオフにしないように設定を変更しました。iPhoneで可能かどうかわからない。バッテリーに大きな違いはありません(OnePlus 5)

最初のソリューションには、特定のMac用のBluetoothスキャンも含まれていました。つまり、私のWiFiがオフになっている場合でも、Bluetoothを感知します。Macアドレスを使用しても、ペアリングしたり、誰でも見ることができるようにする必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.