Android 通过读取本地Arp表获取当前局域网内其他设备信息

目的:获取当前局域网内其他连接设备的IP 和MAC信息。
步骤:

  1. 获取本机wifi ip信息;
  2. 根据ip 去发送ARP请求
  3. 读取本地ARP 表;

####1. 获取本机WiFi 下 ip :参考另一篇文章

Android 获取设备IP

####2. ARP 简介

  1. 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
  2. ARP 缓存
    ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址–>MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址。每一个以太网或令牌环网络适配器都有自己单独的表。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。
    为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用。ARP缓存可以包含动态和静态项目。动态项目随时间推移自动添加和删除。每个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。静态项目一直保留在缓存中,直到重新启动计算机为止.
  • 在使用cmd arp -a 命令查看 windows 下arp 表内容
    这里写图片描述
3 在局域网内发送广播

普通的 arp 请求A要和B 建立连接,则 在局域网内发送一个广播 ,发送源A的IP和MAC,目的ip 为B的IP,MAC 信息为 FF:FF:FF:FF:FF:FF(表示广播),但是现在我们不知道局域网内其他设备的ip 信息,因此,只能去逐个发送请求。

// 根据ip 网段去 发送arp 请求
private void discover(String ip) {
		String newip = "";
		if (!ip.equals("")) {
			String ipseg = ip.substring(0, ip.lastIndexOf(".")+1);
			for (int i=2; i<255; i++) {
				newip = ipseg+String.valueOf(i);
				if (newip.equals(ip)) continue;
				Thread ut = new UDPThread(newip);
				ut.start();
			}
		}
	}
// UDPThread 
public class UDPThread extends Thread {
	private String target_ip = "";
	
	public static final byte[] NBREQ = { (byte) 0x82, (byte) 0x28, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1,
		(byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x20, (byte) 0x43, (byte) 0x4B,
		(byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41,
		(byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41,
		(byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41,
		(byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x0, (byte) 0x0, (byte) 0x21, (byte) 0x0, (byte) 0x1 };
	
	public static final short NBUDPP = 137;

	public UDPThread(String target_ip) {
		this.target_ip = target_ip;
	}

	@Override
	public synchronized void run() {
		if (target_ip == null || target_ip.equals("")) return;
		DatagramSocket socket = null;
		InetAddress address = null;
		DatagramPacket packet = null; 
		try {
			address = InetAddress.getByName(target_ip);
			packet = new DatagramPacket(NBREQ, NBREQ.length, address, NBUDPP);
			socket = new DatagramSocket();
			socket.setSoTimeout(200);
			socket.send(packet);
			socket.close();
		} catch (SocketException se) {
		} catch (UnknownHostException e) {
		} catch (IOException e) {
		} finally {
			if (socket != null) {
				socket.close();
			}
		}
	}
}
4 . 读取 ARP 表
private void readArp() {
		try {
			BufferedReader br = new BufferedReader(
					new FileReader("/proc/net/arp"));
			String line = "";
			String ip = "";
			String flag = "";
			String mac = "";

			while ((line = br.readLine()) != null) {
				try {
					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);
					

				} catch (Exception e) {
				}
			}
			br.close();
			
		} catch(Exception e) {
		}
	}

扫描结果

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
Android平台上,可以使用OpenCV库来读取本地的JPG和PNG图片并进行渲染。 首先,需要将OpenCV库集成到Android项目中。可以通过下载OpenCV Android SDK,并将其导入到Android Studio项目中。然后,在项目的build.gradle文件中,将OpenCV相关的配置添加到dependencies中。 接下来,在应用程序的代码中,可以使用OpenCV库的功能来读取本地的JPG和PNG图片。首先,需要初始化OpenCV库。可以在应用程序的入口Activity中的onCreate方法中调用OpenCVLoader.initDebug()来加载和初始化OpenCV库。 一旦OpenCV库初始化成功,就可以使用其提供的函数来读取本地图片。使用Imgcodecs.imread()函数可以读取JPG和PNG图片。该函数接受图片的文件路径作为参数,并返回一个Mat对象,用于示图像数据。例如,可以使用以下代码读取图片: ```java String imagePath = "/sdcard/image.jpg"; Mat image = Imgcodecs.imread(imagePath); ``` 读取图片后,可以将其渲染到Android的UI界面上。可以使用OpenCV的函数来将Mat对象转换为Android Bitmap对象,并显示到ImageView控件中。可以使用Imgproc.cvtColor()函数将图像从BGR格式转换为RGBA格式,然后使用Bitmap.createBitmap()函数将图像数据转换为Bitmap对象。最后,将Bitmap对象设置给ImageView控件即可。 ```java // 转换图像格式为RGBA Mat rgbaImage = new Mat(); Imgproc.cvtColor(image, rgbaImage, Imgproc.COLOR_BGR2RGBA); // 将Mat对象转换为Bitmap对象 Bitmap bitmapImage = Bitmap.createBitmap(rgbaImage.cols(), rgbaImage.rows(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(rgbaImage, bitmapImage); // 将Bitmap对象显示到ImageView控件 ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(bitmapImage); ``` 通过以上步骤,便可实现使用OpenCV在Android读取本地JPG和PNG图片并进行渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值