List connected devices to Android phone working as WiFi Access point

前端 未结 1 1901
半阙折子戏
半阙折子戏 2021-02-06 17:27

Is there a way in Android API to list connected devices, when Android phone is acting as WiFi router?

And also is there a way to interefere with routed request to serve

相关标签:
1条回答
  • 2021-02-06 18:20

    This is an answer from another stackoverflow question, I read it before two month and don´t know from which user the answer is from, but this should work. WifiManager gives You what You need:

    Main.java

    import java.util.ArrayList;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    import com.whitebyte.hotspotclients.R;
    import com.whitebyte.wifihotspotutils.ClientScanResult;
    import com.whitebyte.wifihotspotutils.WifiApManager;
    
    public class Main extends Activity {
          TextView textView1;
          WifiApManager wifiApManager;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        textView1 = (TextView) findViewById(R.id.textView1);
        wifiApManager = new WifiApManager(this);
    
        scan();
    }
    
    private void scan() {
        ArrayList<ClientScanResult> clients = wifiApManager.getClientList(false);
    
        textView1.append("Clients: \n");
        for (ClientScanResult clientScanResult : clients) {
            textView1.append("####################\n");
            textView1.append("IpAddr: " + clientScanResult.getIpAddr() + "\n");
            textView1.append("Device: " + clientScanResult.getDevice() + "\n");
            textView1.append("HWAddr: " + clientScanResult.getHWAddr() + "\n");
            textView1.append("isReachable: " + clientScanResult.isReachable() + "\n");
        }
    }
    

    ClientScanResult.java

    public class ClientScanResult {
    
    private String IpAddr;
    
    private String HWAddr;
    
    private String Device;
    
    private boolean isReachable;
    
    public ClientScanResult(String ipAddr, String hWAddr, String device, boolean isReachable) {
        super();
        IpAddr = ipAddr;
        HWAddr = hWAddr;
        Device = device;
        this.setReachable(isReachable);
    }
    
    public String getIpAddr() {
        return IpAddr;
    }
    
    public void setIpAddr(String ipAddr) {
        IpAddr = ipAddr;
    }
    
    public String getHWAddr() {
        return HWAddr;
    }
    
    public void setHWAddr(String hWAddr) {
        HWAddr = hWAddr;
    }
    
    public String getDevice() {
        return Device;
    }
    
    public void setDevice(String device) {
        Device = device;
    }
    
    public void setReachable(boolean isReachable) {
        this.isReachable = isReachable;
    }
    
    public boolean isReachable() {
        return isReachable;
    }
    

    WIFI_AP_STATE.java

     public enum WIFI_AP_STATE 
     {
        WIFI_AP_STATE_DISABLING, WIFI_AP_STATE_DISABLED, WIFI_AP_STATE_ENABLING, WIFI_AP_STATE_ENABLED, WIFI_AP_STATE_FAILED
     }
    

    WifiApManager.java

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.net.InetAddress;
    import java.util.ArrayList;
    import android.content.Context;
    import android.net.wifi.WifiConfiguration;
    import android.net.wifi.WifiManager;
    import android.util.Log;
    
    public class WifiApManager {
    private final WifiManager mWifiManager;
    
    public WifiApManager(Context context) {
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    }
    
    
    
    /**
     * Gets a list of the clients connected to the Hotspot, reachable timeout is 300
     * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
     * @return ArrayList of {@link ClientScanResult}
     */
    public ArrayList<ClientScanResult> getClientList(boolean onlyReachables) {
        return getClientList(onlyReachables, 300);
    }
    
    /**
     * Gets a list of the clients connected to the Hotspot 
     * @param onlyReachables {@code false} if the list should contain unreachable (probably disconnected) clients, {@code true} otherwise
     * @param reachableTimeout Reachable Timout in miliseconds
     * @return ArrayList of {@link ClientScanResult}
     */
    public ArrayList<ClientScanResult> getClientList(boolean onlyReachables, int reachableTimeout) {
        BufferedReader br = null;
        ArrayList<ClientScanResult> result = null;
    
        try {
            result = new ArrayList<ClientScanResult>();
            br = new BufferedReader(new FileReader("/proc/net/arp"));
            String line;
            while ((line = br.readLine()) != null) {
                String[] splitted = line.split(" +");
    
                if ((splitted != null) && (splitted.length >= 4)) {
                    // Basic sanity check
                    String mac = splitted[3];
    
                    if (mac.matches("..:..:..:..:..:..")) {
                        boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);
    
                        if (!onlyReachables || isReachable) {
                            result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable));
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e(this.getClass().toString(), e.getMessage());
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), e.getMessage());
            }
        }
    
        return result;
    }
    }
    
    0 讨论(0)
提交回复
热议问题