Поиск 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) );
}