Android-приложение, устройство Wi-Fi - подключение AP - PullRequest
12 голосов
/ 08 марта 2011

Я создаю приложение, которое может передавать данные между мобильным устройством и устройством Wi-Fi ... На мобильном телефоне включена AP (с помощью кода), и другое устройство подключается к этой конкретной сети... Как я могу определить с помощью кода, чтобы увидеть детали устройств, подключенных к сети (AP)? ** Есть ли решение для этого?

Я видел приложение под названием Wifi Hot spot in HTC Desire , который выполняет эту функцию отображения IP-адресов устройств, подключенных к сети.Как этого добиться?

Проверьте Обзор: Мобильная точка доступа Sprint в HTC EVO 4G .

Показывает приложение, которое может отображать данныеподключенные пользователи.Как мы можем сделать это программно?Есть ли для этого API?

Для создания точки доступа:

private void createWifiAccessPoint() {
    if (wifiManager.isWifiEnabled())
    {
        wifiManager.setWifiEnabled(false);
    }
    Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); //Get all declared methods in WifiManager class
    boolean methodFound = false;

    for (Method method: wmMethods){
        if (method.getName().equals("setWifiApEnabled")){
            methodFound = true;
            WifiConfiguration netConfig = new WifiConfiguration();
            netConfig.SSID = "\""+ssid+"\"";
            netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
            //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            //netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            //netConfig.preSharedKey = password;
            //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

            try {
                boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig,true);
                //statusView.setText("Creating a Wi-Fi Network \""+netConfig.SSID+"\"");
                for (Method isWifiApEnabledmethod: wmMethods)
                {
                    if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")){
                        while (!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){
                        };
                        for (Method method1: wmMethods){
                            if(method1.getName().equals("getWifiApState")){
                                int apstate;
                                apstate = (Integer)method1.invoke(wifiManager);
                                //                      netConfig = (WifiConfiguration)method1.invoke(wifi);
                                //statusView.append("\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n");
                            }
                        }
                    }
                }

                if(apstatus)
                {
                    System.out.println("SUCCESSdddd");
                    //statusView.append("\nAccess Point Created!");
                    //finish();
                    //Intent searchSensorsIntent = new Intent(this,SearchSensors.class);
                    //startActivity(searchSensorsIntent);
                }
                else
                {
                    System.out.println("FAILED");

                    //statusView.append("\nAccess Point Creation failed!");
                }
            }
            catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
            catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    if (!methodFound){
        //statusView.setText("Your phone's API does not contain setWifiApEnabled method to configure an access point");
    }
}

Ответы [ 3 ]

7 голосов
/ 16 марта 2011

Вы можете прочитать файл /proc/net/arp, чтобы прочитать все записи ARP . См. Пример в сообщении в блоге Android: Как найти аппаратный MAC-адрес удаленного хоста . В таблице ARP найдите все хосты, принадлежащие вашей сети Wi-Fi, по IP-адресу.

Вот пример кода, который подсчитывает количество хостов, подключенных к точке доступа. Этот код предполагает, что одна запись ARP предназначена для телефона, подключенного к сети, а остальные - от хостов, подключенных к точке доступа.

private int countNumMac()
{
    int macCount = 0;
    BufferedReader br = null;
    try {
        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("..:..:..:..:..:..")) {
                    macCount++;
                }
            }
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        try {
            br.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (macCount == 0)
        return 0;
    else
        return macCount-1; //One MAC address entry will be for the host.
}
5 голосов
/ 08 марта 2011

Вы можете пропинговать устройство, если знаете его имя хоста или его IP-адрес.

    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("ping -c 1   " + hostname);
    proc.waitFor();

Вы можете выполнить сканирование IP-адреса, попробовав каждый IP-адрес в сети для ответа, используя пинг, как указано выше, или попытавшись подключиться, используя TCP или UDP .

Если вы знаете MAC-адрес, вы можете использовать таблицу ARP .

Если у вас есть какое-то собственное программное обеспечение, работающее на устройствах, вы можете отправлять UDP-пакеты на каждое устройство и прослушивать их на вашем Android-устройстве. См. Отправка и получение широковещательных пакетов UDP в Android , как это сделать.

2 голосов
/ 11 сентября 2015

Вы можете использовать точку доступа :

WifiApControl apControl = WifiApControl.getInstance(context);

// These are cached and may no longer be connected, see
// WifiApControl.getReachableClients(int, ReachableClientListener)
List<WifiApControl.Client> clients = apControl.getClients()
...