Android/uni-app读取局域网所有IP&MAC

一.创建一个读取局域网ip的工具类IPUtils

参考自: https://gitee.com/kalshen/IpScanner/blob/master/app/src/main/java/com/yoofn/ipscanner/IpScanner.java

稍微有些修改,不过大致一致,只是输出为Map修改为字符串

package io.dcloud.HBuilder.ip;

import android.os.Handler;
import android.os.Looper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by kalshen on 2017/7/5 0005.
 * ip 扫描类
 */

public class IPUtils {
    private Handler mHandler = new Handler(Looper.getMainLooper());//获取主线程的Looper
    private OnScanListener listener;

    /**
     * 获取局域网中的 存在的ip地址及对应的mac
     */
    public void startScan() {
        //局域网内存在的ip集合
        final List ipList = new ArrayList<>();
        final Map map = new HashMap<>();

        //获取本机所在的局域网地址
        //192.168.43.38
        String hostIP = getHostIP();
        int lastIndexOf = hostIP.lastIndexOf(".");
        //192.168.43.
        final String substring = hostIP.substring(0, lastIndexOf + 1);
        //创建线程池
        //        final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20);
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramPacket dp = new DatagramPacket(new byte[0], 0, 0);
                DatagramSocket socket;
                try {
                    socket = new DatagramSocket();
                    int position = 2;
                    while (position < 255) {
                        dp.setAddress(InetAddress.getByName(substring + String.valueOf(position)));
                        socket.send(dp);
                        position++;
                        if (position == 125) {//分两段掉包,一次性发的话,达到236左右,会耗时3秒左右再往下发
                            socket.close();
                            socket = new DatagramSocket();
                        }
                    }
                    socket.close();
                    execCatForArp();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 执行 cat命令 查找android 设备arp表
     * arp表 包含ip地址和对应的mac地址
     */
    private void execCatForArp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    final StringBuilder stringBuilder = new StringBuilder();
                    Process exec = Runtime.getRuntime().exec("cat proc/net/arp");
                    InputStream is = exec.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        if (!line.contains("00:00:00:00:00:00")&&!line.contains("IP")) {
                            String[] split = line.split("\\s+");
                            stringBuilder.append(split[3]).append(",").append(split[0]).append("|");
                        }
                    }
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            listener.scan(stringBuilder.toString());
                        }
                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 获取本机 ip地址
     *
     * @return
     */
    private String getHostIP() {

        String hostIp = null;
        try {
            Enumeration nis = NetworkInterface.getNetworkInterfaces();
            InetAddress ia;
            while (nis.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) nis.nextElement();
                Enumeration ias = ni.getInetAddresses();
                while (ias.hasMoreElements()) {
                    ia = ias.nextElement();
                    if (ia instanceof Inet6Address) {
                        continue;// skip ipv6
                    }
                    String ip = ia.getHostAddress();
                    if (!"127.0.0.1".equals(ip)) {
                        hostIp = ia.getHostAddress();
                        break;
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return hostIp;

    }

    public void setOnScanListener(OnScanListener listener) {
        this.listener = listener;
    }

    interface OnScanListener {
        void scan(String ips);
    }

}

如果是打包Android那么需要放在Android项目的java目录下 例如:

Android/uni-app读取局域网所有IP&MAC_第1张图片

二 .HBuilderX的项目中新增调用java获取局域网IP的类IPUtils

 utils.js文件内容

/**fileName:utils.js
 *
 */
const fun = 'function';
/**获取局域网所有ip
 * 
 */
export function getIPs(success){
	var IPUtils = plus.android.newObject("io.dcloud.HBuilder.ip.IPUtils");
	//获取arp地址及mac信息
	var hevent = plus.android.implements( "io.dcloud.HBuilder.ip.IPUtils$OnScanListener", {
		"scan":function(resultMap){
			if(success&&typeof success === fun){
				success(JSON.stringify(resultMap))
			}
		}
	} );
	//设置接口信息
	plus.android.invoke(IPUtils,'setOnScanListener',hevent);
	//刷新arp缓存
	plus.android.invoke(IPUtils,'startScan');
}

  显示局域网列表的vue文件 ip-list.vue

   1.导入上边的utils.js文件的方法

	import {getIPs} from '@/src/utils/utils.js'

    2.使用工具类方法

getIPs(function(ips){
	if(ips){
		ips = ips.substring(1,ips.length-1)
		ips = ips.split("|");
		if(ips.length >0){
			for (var i = 0; i < ips.length; i++) {
				let ip = ips[i];
				if(ip&&ip.length>0){
					const ipp = ip.split(",");
					const obj = {
						key: ipp[0],
						value:ipp[1],
						sort:ipp[1].substring(ipp[1].lastIndexOf(".")+1,ipp[1].length)
					}
					that.ips.push(obj);
				}
			}
			// 排序
			that.ips=that.ips.sort(function(a,b){return a.sort-b.sort;});
		}
	}
	
});

3.vue文件内容






效果图:

Android/uni-app读取局域网所有IP&MAC_第2张图片

 

你可能感兴趣的:(uni-app)