当移动设备连接到家庭wifi网络时如何检测?


10

当特定的移动设备(手机,iPad等)连接到网络(当然是无线连接)时,使服务器识别的最佳方法是什么?

作为示例情况,一个人的手机上已正确配置了他的家庭wifi网络。当他到达路由器的范围之内时,它将连接(没有新内容)。连接到该路由器后,其家庭服务器将启动某个程序(或引发通知,写入文件等)。

我认为可能的解决方案是从电话启动网络托管的自定义“ Web应用程序”,以便服务器识别该页面已被调用。但是,如果可以在手机自动连接时完成此操作,那将是最佳选择。

任何想法或替代解决方案将不胜感激,所以在此先感谢!


如果它是一部Android手机,那么获得本地网站的Cron工作将是最容易的。要从网络端执行此操作,您将必须使用RADIUS协议并具有正确设置的RADIUS服务器。
哈克2012年

为什么不只是查看您的路由器日志。由于这些日志是基于文本的,因此可以轻松查询日志并仅获取所需的信息。当然有人已经编写了代码来执行此操作,但是如果没有,那将是一个简单的练习。

Answers:


4

我认为可以很容易地做到这一点arp-scan

安装arp-scansudo apt-get install arp-scan
检测本地网络上的所有主机:sudo arp-scan -l

您可以将crontab设置为定期(可能每2分钟)运行一个脚本,该脚本使用arp-scan扫描网络并解析其输出以发现活动主机。

有时我需要-r 3标志,它将运行三遍;默认情况下工作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挂载phone文件系统,但是它可以用于任何用途。

假设本地网络是192.168.1.0 ...

因此,我将实现一个APP,该APP从广播地址监听UDP广播192.168.1.255。这个应用程式不会消耗电池电量,因为它完全是被动的。(仅在接收到数据包时激活)。

计算机上的守护程序将定期将广播发送到广播地址192.168.1.255。手机将回复此类信号,并提供其名称,ID,IP地址等。

现在,计算机知道电话已经在网络上,并且就我而言,可以调用sshfs挂载。

当然这需要很多工作,包括编程工作,而且并不容易。但是我认为这将是最可靠,最合理的解决方案。


1
哇,基本上是一种自定义协议...人们会认为已经存在这样的东西。
迈克尔(Michael)

1

我能想到的最好的方法是为所述设备提供一个静态IP地址,并使用简单的脚本每隔X秒ping通该设备并触发您的程序/通知。

注意事项:许多手机只有从睡眠中唤醒后才能连接到wifi网络。您的脚本将需要能够区分一天中要进入睡眠状态的手机和离开家的电话之间的区别。之后,让脚本触发程序运行或出现通知很简单。



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请求。如果设备响应并且Server标头正确命名,那么这就是我的设备。

但是我不能不先ping就快。HTTP是TCP,请求很大,因此WiFi超时必须为4秒。对253个地址执行此操作很慢。但是,您不会再有253台设备(可能)少一些HTTP服务器。(或者您的电话)

考虑路由器日志是一个好主意,而且很容易。甚至比对所有命令执行ping操作的速度更快。有些路由器甚至不需要登录即可访问它们。

另外,值得检查您的设备是否支持UPNP。如果是这样,则可以使用UPNP来检测其存在。这将是官方解决方案(在广播中收听UPNP的UDP)。但是所有设备均不支持。但是所有设备也不支持ICMP。(他们不想被不必要地轰炸)。

还有另一种有趣的可能性。您可以获取DHCP数据包,并查看路由器何时为新设备提供IP地址。但这不适用于具有静态IP的设备。在他们需要某些东西之前,他们甚至不会接触网络。连接到WiFi本身位于另一层,除非您想充当嗅探器,否则无法轻易检测到。我不确定它是否可以在混杂模式下与网络适配器一起使用。我认为这将需要其他硬件。

要在Python中实现ping,而又不对ping程序进行子处理又不会失去速度,则必须创建原始套接字并手动构造ICMP数据包。不难 在网络上的某个地方有它的示例。当然,要发送它,您将需要ping用户具有root权限。这是一个缺点。如果要分发软件,则不能期望用户要以root用户身份运行它。


0

我有两种使用的解决方案。(蟒蛇)

解决方案1

首先是设置我要跟踪的已知ipnumber。我分三步完成了。1#使用“ -c1”仅发送一次ping。如果设备处于活动状态,它将回复和。该函数将成功退出2#,使用“ -c3”,现在可以给它更多时间来回答以下三个之一。当无线信号较差时,通常就足够了。3#使用“ -c10”,当它确实是不好的wifi信号时可能需要使用。(删除旧iPad大约需要10次尝试)为了加快处理速度,我为要跟踪的每个IP编号创建了单独的进程。

我还根据是否成功更改了ping间隔。如果找到该设备,它将等待更长的时间,直到再次检查为止。如果失败,将在60秒后重试。(我想在我进入家时打开灯)所以60多岁足以在街上找到我

这很好用!当我回到家时,它会感应到我并熄灭灯,然后在我离开时熄灭。

解决方案2

Arping在网络上可能并不繁重,但是我更改了解决方案以跳过所有ping操作,并在树莓派上创建了自己的DHCP服务器。

然后,我添加了“ on commit”,一旦设备获得ipnumber,它就会触发脚本。该脚本使用“ curl http API调用”在设备获取或更新其ipnumber时通知我的www服务器(Flask)。

在我的Android上,我将设置更改为在屏幕关闭时从不关闭wifi。不知道在iPhone上是否可行。电池没什么大不同(OnePlus 5)

第一个解决方案还包括针对特定Mac的蓝牙扫描。因此,即使手机上的WiFi关闭,它仍然可以感应到蓝牙。使用Mac地址不需要将其配对或可供所有人查看。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.