需要一种从路由器中提取MAC地址以进行“谁家”项目的方法


11

这种项目以前已经通过蓝牙完成,但是30英尺的范围和额外的电池消耗使我只想对路由器而不是人们的电话进行ping操作。我知道路由器会跟踪每个设备的唯一MAC地址。我希望注册每个电话的地址,并让PI定期检查路由器以更新动态网页以显示谁在家里。

我想知道是否有合理的方法可以通过PI提取此信息。


wifi(ping手机的主机名)呢?
user236012 '16

2
您还可以从路由器分配静态IP地址,然后使用nmap和IP地址来标识设备。
ArtOfCode '16

我已经在Windows上的C#中完成了类似的操作:stackoverflow.com/questions/2567107/…-如果您愿意,我很乐意向您发送最新的版本代码。我不知道C#在Raspberry Pi上有多有用,但是它应该为您指明正确的方向。它甚至在我从车库进来之前就可以可靠地检测到我已经在家。
Aric TenEyck '16

我通过在路由器上放置一个bash脚本(每分钟将结果发布到Web服务器)来捕获此信息以及更多信息。通过此系统,我可以监视和管理Internet正常运行时间,已连接的客户端,WAN IP,光纤衰减和功率预算,VOIP服务,wifi密码等。里程因路由器的CPU能力而异。
EDP​​ 2016年

1
屏幕刮在路由器上?您还可以升级到基于Linux的路由器(openwrt),只需登录并查看arp缓存即可。
托尔比约恩Ravn的安德森

Answers:


6

有可能的。建议您为脚本提供登录凭据,并阅读显示信息的页面。然后,您可以解析其内容,并用所需的数据填充数组。由于这些页面有时包含诸如日期和时间之类的更多信息,因此您可以构建一个非常好的日志。

这是有关我将如何进行的简单示例;

在路由器页面上,您可以找到以下内容:

<div id="flex">
 <div id="dm-name">
  name : Your_device_name
 </div>
 <div id="dm-ip">
  IP : 192.168.x.xxx
 </div>
 <div id="dm-mac">
  <span>MAC:D4:04:CD:FE:5A:17</span>
 </div>
</div>

因此,我们知道所有设备都会像这样列出。并且所有MAC地址都将具有相同的长度。

脚本可能是这样的。

var string_to_parse = "file read from router.html";
cursor = 0;  // The position of your cursor;
i =0;
    while(cursor > 0){

    begin_at = string_to_parse.indeOf('MAC:');
    end_at = length_of_Mac; // this is standard for al mac

    mac[i] = string_to_parse.substring(begin_at, begin_at + end_at);
    cursor = begin_at + end_at;
i++;
    }

这段代码将需要调整,但是想法就在那里。它是一个循环,它将运行所有文件以查找所有Mac地址。直到到达文件末尾。


这就是我要做的。它具有检测路由器是否死机的额外好处。
slebetman '16

1
+1网站抓取是一个有趣的选择。我有点生气,我自己没想到。
Jacobm001

@MadeInDreams您引用的路由器页面是路由器DHCP租用页面吗?还是有路由器活动连接页面?
Chetan Bhargava

取决于您的路由器,但是大多数路由器都有一个页面,其中列出了所有已连接的设备。这个例子来自我的网络主页
MadeInDreams,2016年

6

为了在Raspberry Pi上跟踪唯一的mac地址,您需要一个名为arpwatch的工具(服务)。我已经在BSD上广泛使用arpwatch,它将所有arp和rarp请求记录到syslog中。

在Syslog中,您可以解析日期和时间以及mac地址。

ARP起作用并且表仅存在于物理网络上(技术词:冲突域)。当数据包离开另一个网络时,源MAC地址将替换为路由器的MAC地址。

arp在Raspberry Pi上运行命令将仅列出与运行该命令的主机(Raspberry Pi)进行过交易(IP通信)的主机的mac + IP地址。它不会列出网络上其他主机的mac地址。

另一种高级方法是在Raspberry Pi上使用nmap进行主机发现。您可以nmap -sP用来ping网络上的所有主机。它会告诉您网络上所有活动主机的IP地址。然后,您可以运行arp命令以找出谁是活跃用户。

chetan@Linux:~$ nmap -sP 192.168.100.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 16:08 PST
Nmap scan report for 192.168.100.4
Host is up (0.0087s latency).
Nmap scan report for 192.168.100.58
Host is up (0.0024s latency).
Nmap scan report for 192.168.100.160
Host is up (0.049s latency).
Nmap scan report for 192.168.100.164
Host is up (0.063s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.68 seconds

1
我认为这可能是一种比Web抓取方法更健壮和灵活的方法。在许多ISP发布的路由器上,本应显示带有信息的已连接设备的页面将不可靠。
goldilocks

@goldilocks +1,是的,在我对接受的答案进行投票之后,我考虑了一下。我假设他们有一个路由器,该路由器具有用于活动连接(SPI状态或类似状态)的页面。他们有不错的路由器。
Chetan Bhargava

4

我一直在玩fing的命令行版本。它在查找网络上的所有内容并吐出包含以下内容的CSV文件方面做得不错:

  • IP地址
  • 节点的自定义名称(如果已在.properties文件中分配了自定义名称)
  • 状态(上/下)
  • 最后更改的时间戳
  • 主机名(如果已启用DNS)
  • 硬件地址(如果您正在发现本地网络)
  • 硬件供应商

根据先前的答案,必须进行一些文本处理才能将CSV的内容获取到网页上,并注意在外部发布的内容。

我已经广泛使用了Android版本,在查找家庭网络中的所有内容方面做得很好(这在公共wifi上玩起来很有趣)。


3

该命令arp将为您提供连接到网络的设备的列表。您将需要进行一些基本的字符串操作才能获取所需的数据,但这肯定比尝试自己获取信息要容易。

功能说明

某些路由器默认情况下会阻止此类功能,您的路由器可能已配置为此类。如果它不起作用,请仔细阅读它的文档以检查如何允许它。

安全注意事项

建立一个显示谁当前住所的网站会对安全产生非常严重的影响。请非常仔细地考虑现有的安全性,以及它是否足以应对所涉及的风险。


好主意,我想我撤回了先前的评论。
加尼马

1
有几个有趣的使用ARP此寻找需要注意的地方在这里。他们建议,如果设备未向运行arp的设备发送任何数据包,则它们可能不会显示,并且可能需要ping通。
goobering '16

@goobering +1。仅运行arp命令将不会列出网络上的所有活动主机。Arpwatch将记录网络上的所有arp数据包。
Chetan Bhargava

1

这是可能的,其他人已经提出了一些好的方法。几年前,我写了一个python脚本,从屏幕上从netgear路由器上抓取这些信息,并将其扔到github上。可以在这里找到。它很粗糙,现在来看它,我会以某种不同的方式重做它,但是它的作用几乎与您几年后直到我搬家的目的完全相同。


+1当然可以改善您的脚本,但这是解决该问题的好方法。
Jacobm001
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.