1:通过java运行cmd命令,来通过arp命令获取同一网络下设备信息,对于支持linux 和windows的设备有效,像一些非智能设备,就无力回天了

2:使用android手机通过向子网内所有设备先发送一遍udp包,实现与在线的设备都进行通信一遍,这样对应的路由信息就自动存储在本地手机中,然后在通过读取android 本机的arp缓存表,来获取设备信息

好,下面详细进行第二种方式的描述:
Step1:首先,获取本机所处的子网段,方法详细代码如下:

    /*** 获取ip地址** @return*/private static String getHostIP() {String hostIp = null;try {//这里以eth0为例hostIp = getIpAddress("eth0");} catch (SocketException e) {e.printStackTrace();}return hostIp;}/*** Get Ip address 自动获取IP地址* 可以传入eth1,eth0,wlan0,等** @throws SocketException*/public static String getIpAddress(String ipType) throws SocketException {String hostIp = null;try {Enumeration nis = NetworkInterface.getNetworkInterfaces();InetAddress ia = null;while (nis.hasMoreElements()) {NetworkInterface ni = (NetworkInterface) nis.nextElement();if (ni.getName().equals(ipType)) {Enumeration<InetAddress> ias = ni.getInetAddresses();while (ias.hasMoreElements()) {ia = ias.nextElement();if (ia instanceof Inet6Address) {continue;// skip ipv6}String ip = ia.getHostAddress();// 过滤掉127段的ip地址if (!"127.0.0.1".equals(ip)) {hostIp = ia.getHostAddress();break;}}}}} catch (SocketException e) {e.printStackTrace();}Log.d(ipType, "get the IpAddress--> " + hostIp + "");return hostIp;}

Step2:new出一个线程,向网段内所有在线设备发送消息。

/*** 创建一个线程向本地所有ip发送一个数据*/public static void sendDataToLocal() {//局域网内存在的ip集合final List<String> ipList = new ArrayList<>();final Map<String, String> map = new HashMap<>();//获取本机所在的局域网地址String hostIP = getHostIP();int lastIndexOf = hostIP.lastIndexOf(".");final String substring = hostIP.substring(0, lastIndexOf + 1);new Thread(new Runnable() {@Overridepublic void run() {DatagramPacket dp = new DatagramPacket(new byte[0], 0, 0);DatagramSocket socket;try {socket = new DatagramSocket();int position = 2;while (position < 255) {Log.e("Scanner ", "run: udp-" + substring + position);dp.setAddress(InetAddress.getByName(substring + String.valueOf(position)));socket.send(dp);position++;if (position == 125) {//分两段掉包,一次性发的话,达到236左右,会耗时3秒左右再往下发socket.close();socket = new DatagramSocket();}}socket.close();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}

执行完后会自动写入到/proc/net/arp
目录下,如下:

Step3:延时3秒后,读取本机proc/net/arp目录下的内容,得到结果:

/*** 读取/proc/net/arp并且解析出来ip,mac,flag* flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内*/public static void readArp() {try {BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));String line = "";String ip = "";//flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内String flag = "";String mac = "";if (br.readLine() == null) {Log.e("scanner", "readArp: null");}while ((line = br.readLine()) != null) {line = line.trim();if (line.length() < 63)continue;if (line.toUpperCase(Locale.US).contains("IP"))continue;ip = line.substring(0, 17).trim();flag = line.substring(29, 32).trim();mac = line.substring(41, 63).trim();if (mac.contains("00:00:00:00:00:00"))continue;Log.e("scanner", "readArp: mac= " + mac + " ; ip= " + ip + " ;flag= " + flag);}br.close();} catch (Exception ignored) {}}

打印日志如下

最后附上完整代码

public class DiscoverNetIpUtil{/*** 获取ip地址** @return*/private static String getHostIP() {String hostIp = null;try {//这里以eth0为例hostIp = getIpAddress("eth0");} catch (SocketException e) {e.printStackTrace();}return hostIp;}/*** Get Ip address 自动获取IP地址* 可以传入eth1,eth0,wlan0,等** @throws SocketException*/public static String getIpAddress(String ipType) throws SocketException {String hostIp = null;try {Enumeration nis = NetworkInterface.getNetworkInterfaces();InetAddress ia = null;while (nis.hasMoreElements()) {NetworkInterface ni = (NetworkInterface) nis.nextElement();if (ni.getName().equals(ipType)) {Enumeration<InetAddress> ias = ni.getInetAddresses();while (ias.hasMoreElements()) {ia = ias.nextElement();if (ia instanceof Inet6Address) {continue;// skip ipv6}String ip = ia.getHostAddress();// 过滤掉127段的ip地址if (!"127.0.0.1".equals(ip)) {hostIp = ia.getHostAddress();break;}}}}} catch (SocketException e) {e.printStackTrace();}Log.d(ipType, "get the IpAddress--> " + hostIp + "");return hostIp;}/*** 创建一个线程向本地所有ip发送一个数据*/public static void sendDataToLocal() {//局域网内存在的ip集合final List<String> ipList = new ArrayList<>();final Map<String, String> map = new HashMap<>();//获取本机所在的局域网地址String hostIP = getHostIP();int lastIndexOf = hostIP.lastIndexOf(".");final String substring = hostIP.substring(0, lastIndexOf + 1);new Thread(new Runnable() {@Overridepublic void run() {DatagramPacket dp = new DatagramPacket(new byte[0], 0, 0);DatagramSocket socket;try {socket = new DatagramSocket();int position = 2;while (position < 255) {Log.e("Scanner ", "run: udp-" + substring + position);dp.setAddress(InetAddress.getByName(substring + String.valueOf(position)));socket.send(dp);position++;if (position == 125) {//分两段掉包,一次性发的话,达到236左右,会耗时3秒左右再往下发socket.close();socket = new DatagramSocket();}}socket.close();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}/*** 读取/proc/net/arp并且解析出来ip,mac,flag* flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内*/public static void readArp() {try {BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));String line = "";String ip = "";//flag 为0x00说明目前不在局域网内,曾经在过.0x02代表在局域网内String flag = "";String mac = "";if (br.readLine() == null) {Log.e("scanner", "readArp: null");}while ((line = br.readLine()) != null) {line = line.trim();if (line.length() < 63)continue;if (line.toUpperCase(Locale.US).contains("IP"))continue;ip = line.substring(0, 17).trim();flag = line.substring(29, 32).trim();mac = line.substring(41, 63).trim();if (mac.contains("00:00:00:00:00:00"))continue;Log.e("scanner", "readArp: mac= " + mac + " ; ip= " + ip + " ;flag= " + flag);}br.close();} catch (Exception ignored) {}}
}

Android 查询局域网内所有ip和mac地址相关推荐

  1. python扫描局域网端口和ip_我想用python扫描局域网内的ip和mac地址,需要什么第三方库...

    匿名用户 1级 2016-08-12 回答 MAC地址也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时写在硬件内部.IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MA ...

  2. Mac扫描局域网内连接设备IP及MAC地址并查看对应IP开放端口

    前言 因为有远程调试的需要,所以我需要知道同一局域网内,另一个设备的IP是多少. 好像网上有一个叫nmap的工具也挺专业的,不过我一看到APP Store里面就有一个现成的免费软件,干脆就下载下来试了 ...

  3. python Scapy获取局域网内的IP和mac地址

    ''' python3 安装scapy-python3 注:linux,可能需要以root登陆,避免出现permission error Scapy还包含内建函数arping(),该函数实现的功能和以 ...

  4. Android 获取局域网内网IP地址

    Android 获取局域网内网IP地址 废话 上代码 完事 废话 拿局域网IP一般用在tcp通讯或udp通讯上,下次再整理下这类通讯的框架 上代码 /*** 网络工具* 获得局域网IP地址* @aut ...

  5. Java获取局域网中所有ip和Mac地址

    Java获取局域网中所有ip和Mac地址 定义一个Util public class IpAndMacUtil {/*** 获取本机Mac地址* @param ia* @return* @throws ...

  6. 批处理获取计算机域名,用批处理获取局域网中电脑ip和mac地址表

    用批处理获取局域网中电脑ip和mac地址表 为了避免IP地址抵触和体系安全,局域网中电脑的IP地址和MAC地址对照表是要常常备份的.除了能够运用软件处理外,用细巧专心的批处理也是一个不错的挑选.用记事 ...

  7. 查看局域网内所有ip 和 mac

    arp -a 查看局域网内所有ip和对应的mac net view 查看局域网内所有用户

  8. 查询局域网内所有IP

    在部署局域网设备时碰到有IP冲突,特记录查询局域网所有IP地址方法 CMD for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.10.%i 其中192.1 ...

  9. arp 已知mac找ip_知道IP查MAC地址,知道MAC地址查IP

    (即在局域网内 , 知道 IP 查 MAC 地址,知道 MAC 地址查 IP ) 你可以使用 arp 程序( WINDOWS 自带) eg: arp -a 192.168.0.1 如果使用程序查的话, ...

最新文章

  1. IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...
  2. 《Head First Java》的思考总结:第三篇
  3. 【机器学习入门笔记3:OpenCV模块组织结构】20190203
  4. [恢]hdu 2021
  5. 查看java的dump日志并进行分析
  6. RCD:Residual Current Device,剩余电流装置
  7. 大数据之-Hadoop3.x_Yarn_FIFO调度器---大数据之hadoop3.x工作笔记0144
  8. QT之交叉编译qmake的ARM版本套件(三)
  9. HDU 2841 容斥 或 反演
  10. 是否可以利用光压提高卫星轨道
  11. 微信扫一扫地标识别技术揭秘
  12. 如何修改github博客主题
  13. 英特尔提供 Loihi 2 神经形态芯片和软件框架
  14. 微信一键连wifi服务器,微信小程序一键连wifi
  15. Windows静默安装
  16. polkit启动失败_CentOS Linux 7.4中polkit服务启动失败
  17. 微信小程序 Notes | 开发常用事例(三)
  18. 0.5mm的焊锡丝能吃多大电流_大孔隙TiENTA/SnO2Sb flowthrough 模式阳极对反渗透浓缩液的电化学氧化: 降解性能、能效和毒性评价...
  19. 【时序分割】【未完成】Greedy Gaussian Segmentation of Multivariate Time Series(贪心高斯时序分割---GGS)
  20. 磁盘碎片整理工具:OO Defrag Pro整理方法详解。

热门文章

  1. Python 报错 Fatal Python error: PyFrame_BlockPop: block stack underflow 如何解决?
  2. python 共享内存 c_python共享内存 - DK's Blog - 博客园
  3. 杨桃文案:卖杨桃水果怎样写文案发朋友圈,水果店杨桃活动文案
  4. PS~了解PS的第一步,基本操作
  5. 卡数字怀念的东西:魔方
  6. U3d引擎与资源管理
  7. SVN如何对已经提交的注释进行再次修改?
  8. 初识swipe.js
  9. 并发编程之深入理解java线程
  10. 笔记本电脑合盖无法休眠,开盖黑屏