Поиск SSID беспроводной сети с Java

Мы делаем проект, закодированный в Java (скомпилированный для JRE 1.6), и ему нужна помощь немного, но явно сложная особенность: Мы хотим выполнить определенное действие, когда подключена определенная беспроводная сеть, например. когда подключенный SSID == "myNetworkAtHome" или аналогичный.

После просмотра этого сайта, документации Google и Java, мы подошли немного ближе. Посмотрев код здесь: http://download.oracle.com/javase/tutorial/networking/nifs/retrieving.html

Кажется, мы приближались, но он врезался в мертвый, все интерфейсы, похоже, подключены к "net0" через "net13" (на моем ноутбуке.) И мы не можем получить SSID из любого интерфейса вообще. Я понимаю, что код в этом примере дает только имена интерфейсов и не связанные сети, но, похоже, он не предлагает способ получения подключенной сетевой информации.

Любая помощь по этому вопросу будет очень полезна!

Отношения Мартин Ндж

Ответ 1

Вы не можете получить доступ к этим низкоуровневым данным о сети в Java. Вы можете получить некоторые сведения о сетевом интерфейсе с классом NetworkInterface, но если вы видите по предоставленным методам, никто не связан с Wi-Fi-сетями, и не будет предоставлен какой-либо способ получить SSID. Как указано ниже, вы должны использовать некоторые собственные функции, вызвав собственную библиотеку с JNI или вызывая инструмент ОС с помощью Runtime.

Java не предназначен для такого рода вещей, его трудно реализовать независимым от платформы способом, и никакие детали аппаратного уровня не могут управляться в Java по принципу.

То же самое относится к другим сетям, таким как 3G, GPRS... приложение не должно знать тип подключения и его детали. Java может управлять вещами только на уровне транспорта (TCP), а не сети (IP), а не Link (3G, Wi-Fi, Ethernet...), поэтому вы можете управлять только сокетами.

Ответ 2

Вам придется прибегнуть к решению JNI. Там что-то доступно в http://sourceforge.net/projects/jwlanscan, но это работает только для систем Windows. Или вы можете сделать это уродливым способом и использовать Runtime.getRuntime(). Exec (...) и использовать инструменты командной строки, доступные для вашей ОС (* nix = iwconfig), и прибегать к разбору.

Ответ 3

 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)  );
    }