【问题标题】:Android application Wi-Fi device - AP connectivityAndroid 应用程序 Wi-Fi 设备 - AP 连接
【发布时间】:2011-07-11 02:57:35
【问题描述】:

我正在构建一个可以在移动设备和 Wi-Fi 设备之间传输数据的应用程序...移动设备已启用AP(通过代码),并且另一个设备连接到此特定网络...如何我通过代码检测来查看连接到网络(AP)的设备的详细信息?**有没有解决方案?

我在HTC Desire 中看到了一个名为 Wifi 热点 的应用程序,它具有显示连接到网络的设备的 IP 地址的功能。如何实现?

查看Review: Sprint Mobile Hotspot on 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");
    }
}

【问题讨论】:

  • 这不对,HTC Desire 上的 WiFi 热点不会显示哪些设备连接到与 Desire 相同的 WiFi 网络,但它会打开一个自己的 WiFi 热点(因此 WiFi -Network)并充当自己的接入点。这就是为什么它可以显示连接的设备,因为它是它自己的网络。
  • 好的....我可以通过编程方式建立一个 Wifi 接入点...现在可以检测到连接到该网络的设备了吗?
  • 您在哪里建立接入点?在非 Android 设备上?好的。在 Android 上,如果没有 root 访问权限,在普通应用中获取数据将变得非常困难。
  • 我正在安卓设备上建立接入点...
  • 您的代码工作正常,但是当我以编程方式打开热点时,我的 htc 需要 - DHCP 禁用.....为什么???????

标签: java android network-programming wifi jvm-hotspot


【解决方案1】:

你可以使用accesspoint:

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()

【讨论】:

  • 接入点库是废弃项目,在 android 7+ 上失败
  • 确实,它也被归档了三年。它在内部使用的方法在更高版本的 Android 中被删除。
【解决方案2】:

您可以读取/proc/net/arp 文件来读取所有ARP 条目。请参阅博文 Android: Howto find the hardware MAC address of a remote host 中的示例。在 ARP 表中,根据 IP 地址搜索属于您的 Wi-Fi 网络的所有主机。

这里是示例代码,它计算连接到 AP 的主机数量。此代码假定一个 ARP 条目用于连接到网络的电话,其余的来自连接到 AP 的主机。

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.
}

【讨论】:

  • 你怎么知道你必须访问这个文件??/proc/net/arp...任何来源??
  • /proc 是一个标准的 linux 文件系统,它提供了大量关于内核的信息。您可以在 linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html 找到有关 /proc/net 的详细信息。谷歌搜索 /proc 将为您提供大量信息。
  • 这是不正确的,因为 ARP 表在设备断开连接时不一定会刷新。有人说,您可以简单地 ping 表中的所有设备以查看哪些 IP 处于活动状态,但很可能设备被防火墙阻止不响应 ICMP 请求并且您的 ping 会失败。此解决方案虽然可行,但并不可靠且不准确。
  • 那么,...有没有其他替代解决方案@MridangAgarwalla 来检查客户端是否仍然连接?
  • 如果我不知道 MAC 或 IP 怎么办,如何获取与我的 Wi-Fi Teethring 网络连接的设备的详细信息?请帮忙
【解决方案3】:

如果您知道设备的主机名或 IP 地址,您可以 ping 设备。

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

您可以进行 IP 地址扫描,使用上述 ping 尝试网络上的每个 IP 地址以获得响应,或者尝试使用 TCPUDP 进行连接。

如果您知道 MAC 地址,则可以使用ARP 表。

如果您在设备上运行了一些自己的软件,您可以在每台设备上发送 UDP 数据包并在您的 Android 设备上监听它们。请参阅 Sending and receiving UDP broadcast packets in Android 了解如何执行此操作。

【讨论】:

  • 没有其他值可以检查连接到网络的设备吗?这样我就可以遍历并找到所需的...
  • 在我的要求中,我有一个 wifi 控制器,它将连接到设备(例如,一个我安装了应用程序的手机,我启用了 AP 并从我连接到的另一台设备这个网络)...现在我如何在设备(安装的应用程序)中找到连接到网络的设备..发送 UDP 数据包需要我在另一台设备上安装另一个应用程序..无论如何..我该怎么做监听 UDP 数据包?
  • 请记住,如果防火墙/路由器丢弃了 ICMP 数据包,那么 ping 将不起作用。您还可以尝试通过发送广播 ping 来简化上述解决方案。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 2014-06-06
  • 2017-09-14
  • 1970-01-01
  • 2023-04-04
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多