Нахождение 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), и прибегнуть к синтаксическому анализу.