【问题标题】:Finding SSID of a wireless network with Java使用 Java 查找无线网络的 SSID
【发布时间】:2011-03-21 13:17:29
【问题描述】:

我们正在做一个用 Java 编码的项目(为 JRE 1.6 编译),需要一些帮助 一个有点但显然很复杂的功能: 我们希望在连接特定无线网络时执行特定操作,例如当连接的 SSID=="myNetworkAtHome" 或类似时。

在浏览了这个网站、google 和 Java 文档之后,我们离我们更近了一点。 在这里查看代码后: http://download.oracle.com/javase/tutorial/networking/nifs/retrieving.html

似乎我们已经接近但它遇到了死胡同,所有接口似乎都通过“net13”连接到“net0”(在我的笔记本电脑上)。 而且我们根本无法从任何接口中获取 SSID。我确实意识到示例中的代码只是给出了接口名称而不是连接的网络,但它似乎没有提供获取连接的网络信息的方法。

对此的任何帮助都会非常有帮助!

【问题讨论】:

    标签: java networking interface adapter ssid


    【解决方案1】:

    您无法在 Java 中访问此网络的低级详细信息。您可以使用NetworkInterface 类获取网络接口的一些详细信息,但如果您在提供的方法中看到,则没有任何与 Wifi 网络相关的方法,也没有提供任何获取 SSID 的方法。如下所述,您应该通过使用 JNI 调用本机库或使用 Runtime 调用 OS 工具来使用一些本机功能。

    Java 不是为做这类事情而设计的,很难以独立于平台的方式实现,并且任何硬件级别的细节都无法在 Java 中进行原则上的管理。

    同样适用于其他网络,如 3G、GPRS...应用程序不应该知道连接类型或其详细信息。 Java 只能管理传输(TCP)级别的东西,不能管理网络(IP)而不是链接(3G、Wifi、以太网...),所以你只能管理套接字。

    【讨论】:

    • 那太糟糕了...但是感谢您的回答,那么最好停止搜索直接 java 实现,再次感谢。
    • @David 所以 Java 的设计不是为了能够编写完整的操作系统,除非通过 JNI ?
    • Java 不能像解释语言那样“编写”操作系统,因为它是一种需要在某种操作系统之上运行的虚拟机的解释性语言。如果您询问访问所有操作系统资源,Java 并不是为此类事情而设计的,因为它的目标之一是跨操作系统可移植并且不能直接访问硬件。如果您想要一些低级功能,例如在 Wifi 802.X 级别上工作,请使用 JNI 或选择其他语言,例如 C/C++。 .Net 平台等其他主要解释语言也无法原生访问特定于 Wifi 的详细信息,这是毫无意义的。
    • @DavidOlivánUbieto 为了正确起见,实际上有几个操作系统(主要)是用 Java 编写的。 Can Java be used to develop an OS?
    • 是的!不想引发一场巨魔大战!
    【解决方案2】:
     ArrayList<String>ssids=new ArrayList<String>();
        ArrayList<String>signals=new ArrayList<String>();
        ProcessBuilder builder = new ProcessBuilder(
                "cmd.exe", "/c", "netsh wlan show all");
        builder.redirectErrorStream(true);
        Process p = builder.start();
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while (r.read()!=-1) {
            line = r.readLine();
            if (line.contains("SSID")||line.contains("Signal")){
                if(!line.contains("BSSID"))
                    if(line.contains("SSID")&&!line.contains("name")&&!line.contains("SSIDs"))
                    {
                        line=line.substring(8);
                        ssids.add(line);
    
                    }
                    if(line.contains("Signal"))
                    {
                        line=line.substring(30);
                        signals.add(line);
    
                    }
    
                    if(signals.size()==7)
                    {
                        break;
                    }
    
            }
    
        }
        for (int i=0;i<ssids.size();i++)
        {
            System.out.println("SSID name == "+ssids.get(i)+"   and its signal == "+signals.get(i)  );
        }
    

    【讨论】:

      【解决方案3】:

      您将不得不求助于 JNI 解决方案。 http://sourceforge.net/projects/jwlanscan 有一些可用的东西,但它只适用于 Windows 系统。或者你可以用丑陋的方式来做,使用 Runtime.getRuntime().exec(...) 并使用你的操作系统可用的命令行工具 (*nix = iwconfig) 并诉诸解析。

      【讨论】:

      • 嗯,在 Java 中这样做的目的是有一种方法可以跨平台。但是有没有办法利用 java.net 包?
      • *nix != iwconfig。 Linux = iwconfig。 OS X = /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport。 *BSD = ifconfig。并且跨平台需要在不同平台上对 Java 类进行不同的实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 2012-05-06
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多