当前位置: 首页 > 知识库问答 >
问题:

如何使用MAC地址[Android]获取本地网络中任何设备的动态ip?[副本]

姜阳
2023-03-14

我有一个物联网设备,我知道该设备的Mac地址。我的物联网设备连接到我的wifi,我想知道有什么方法可以使用该设备的mac地址来了解其本地ip地址?我的要求是将android应用程序连接到同一个wifi,使用Mac地址搜索设备的ip地址,并建立TCP连接。到目前为止,我一直在搜索这个问题,我没有得到这个问题的完美答案,这真的需要< code>ssdp扫描,或者有任何其他方法可以做到这一点。

RARP在android中可能吗?

请帮帮我.

共有1个答案

施永宁
2023-03-14

据我所知,有两个,也许是三个可能的解决方案:

选项1: Ping广播地址,然后读取ARP表

这假设您无法在尝试发现其 IP 地址的远程设备上运行任何特殊代码,但它确实有一个已启用的 ICMP 堆栈。(即您可以 ping 它)

假设此设备支持 ICMP (ping)。您可以将一个或多个 ICMP ping 请求发送到子网的广播地址,并侦听来自子网上所有设备的响应。然后查阅本地 ARP 表,了解您支持哪些设备消息。您可以从任何计算机的命令行尝试此操作。假设您的本地 IP 为 192.168.1.2,子网掩码为 255.255.255.0。因此,子网的广播 IP 为 192.168.1.255。因此,您可以在命令提示符下执行此操作(Linux,Windows,Mac)

$> ping 192.168.1.255   // let this run for a few seconds, then cancel after it retries a few times
$> arp -a               // this will dump the local ARP table of every MAC to IP mapping discovered and cached 

编写等效的Android代码需要一些工作,但这应该是可能的。您可能需要使用NDK访问较低级别的套接字函数来读取arp表。您可以通过recvmsg获取源以太网。

选项2: UDP广播。

这假设您可以在远程设备上运行它可以响应的某种代码。它只侦听指定的端口(例如 UDP 端口 29999)。与上面类似,查找器Android设备只是向子网掩码的广播地址发送广播UDP消息。此消息的有效负载只是您自己的协议,询问“谁有88-66-aa-6c-d5-c1”?该设备以“我有88-66-aa-6c-d5-c1”的效果来响应。IP 作为套接字 recvfrom 调用中的“发件人”地址返回。您也可以将其构建到协议有效负载中。

选项3:已经有一段时间了,但这里有一些提示。我记得当我在一个带有wifi的硬件产品上工作时,我们打算做某种自动配置协议,目标设备甚至可能不在预期的wifi上,但我们想向它发送某种消息。我们尝试将 UDP 混合到 255.255.255.255,并将 UDP 数据包发送到设备之间的多播地址。我认为,当您广播到255.255.255.255或使用多播时,只要它们位于同一物理网段或共享AP上,它就会击中所有设备。需要一些实验。您可以将此方法与上面的选项 1 或 2 结合使用。

 类似资料:
  • 我希望在连接到wifi网络时,在运行我的应用程序的手机上获取用户的本地IPv4地址。使用以下代码: 我可以得到一些接近IPv4地址的信息,但与命令行中的IPv4地址相比,它并不完全相同。有更好的办法吗?我知道formatIpAddress已被弃用,但在我找到获取IPv4地址的方法之前,我暂时不太担心这个问题。 编辑: 我发现手机wifi设置中的ip地址是我在使用建议的解决方案获取ip地址时得到的。

  • 有没有一个清晰的方法,可以很容易地实现扫描本地网络,以获得连接到我的WiFi网络的设备的MAC地址在Android中?谢谢。

  • 在虚拟机环境中,我可以使用sigar来获取虚拟机的mac地址,但是如何获取主机的地址呢?

  • 问题内容: 我想获取计算机的IP地址。我使用了下面的代码,但是返回了。 我想获取IP地址(例如),而不是回送地址。 问题答案: 您需要遍历所有网络接口 播放(取自util / helper.go)

  • 问题内容: 我不是指 127.0.0.1 而是其他计算机将用来访问该计算机的计算机,例如 192.168.1.6 问题答案: http://nodejs.org/api/os.html#os_os_networkinterfaces

  • 问题内容: 看来android的java.net.NetworkInterface实现没有 byte [] getHardwareAddress()方法 http://developer.android.com/reference/java/net/NetworkInterface.html 我发现有几个论坛的人都试图这样做,但没有明确的答案,我需要获得一个跨设备的UUID,所以我不能依赖电话号码