Нахождение SSID беспроводной сети с Java

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

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

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

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

С уважением, Мартин, Нью-Джерси

3 ответа

Решение

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

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

То же самое относится и к другим сетям, таким как 3G, GPRS... приложение не должно знать ни о типе соединения, ни о его деталях. Java может управлять только на транспортном (TCP) уровне, а не на сети (IP), а не на канале (3G, Wifi, Ethernet...), поэтому вы можете управлять только сокетами.

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

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

Другие вопросы по тегам