原理:
通过Windows命令行中的netsh命令进行连接。
使用命令行执行以下命令:
1.查看已保存的Wi-Fi配置
netsh wlan show profiles
2.随便导出一个常用的。name为要导出的wifi名称 key=clear为隐藏密码
netsh wlan export profile name="WiFiName" folder="C:\" key=clear
3.去wifi设置里把上面选择的wifi 忘记掉
4.导入wifi配置,这一步是让系统记住你要导入的wifi
netsh wlan add profile filename="C:\\WLAN-WiFiName.xml"
5.连接。其实就是我们点击连接wifi这个过程。第3步我们忘记了wifi。第4步通过文件将wifi又记住了
netsh wlan connect name=WiFiName
原理就是这几个步骤
第2步导出的文件解析:
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>seven</name><!--wifi名称-->
<SSIDConfig>
<SSID>
<hex>736576656E</hex> <!--wifi名称的16进制字符串-->
<name>seven</name> <!--wifi名称-->
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>manual</connectionMode><!--manual手动连接 auto设置为自动连接 -->
<MSM>
<security>
<authEncryption>
<authentication>WPA2PSK</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>true</protected><!--这里是开启密码保护-->
<keyMaterial>128590129075</keyMaterial><!--你的密码的加密后的数据-->
</sharedKey>
</security>
</MSM>
<MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
<enableRandomization>false</enableRandomization>
<randomizationSeed>79900722</randomizationSeed>
</MacRandomization>
</WLANProfile>
修改文件为自己所用:
1.将<name>xxx</name>改成自己的wifi名,注意有两个<name>xxx</name>
2.计算出自己的wifi名的hex,将<hex>xxx</hex>改成计算出来的hex。
3.设置连接模式<connectionMode>manual</connectionMode> manual手动连接 auto设置为自动连接。你打开电脑的wifi连接,看到有个自动连接的勾选框,这里的作用就是这个。
4.修改密码设置
<sharedKey>
<keyType>passPhrase</keyType>
<protected>true</protected> 改成<protected>false</protected>
<keyMaterial>128590129075</keyMaterial>改成自己的wifi密码,比如12345678
</sharedKey>
5.执行命令行命令
1.netsh wlan add profile filename="C:\\修改后的.xml"
2.netsh wlan connect name=修改后的wifi名称
java代码实现
public class WiFiConnect {
public static void main(String[] args) {
String ssid = "seven"; // Wi-Fi名称
String password = "12345678"; // Wi-Fi密码
String connectedMode = "auto";//连接模式 <!--manual手动连接 auto自动连接 -->
connectToWiFi(ssid, password,connectedMode);
}
/*字符串转16进制HEX*/
public static String stringToHex(String input) {
StringBuilder hexString = new StringBuilder();
for (byte b : input.getBytes()) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
}
/**
* 连接wifi
* @param ssid wifi名称
* @param password wifi密码
* @param connectedMode 连接模式
*/
public static void connectToWiFi(String ssid, String password,String connectedMode) {
try {
//计算出wifi名称队名的hex
String ssidHex = StrUtil.stringToHex(ssid);
//@formatter:off
String profileXml
= "<?xml version=\"1.0\"?>\r\n"
+ "<WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">\r\n"
+ " <name>"+ssid+"</name>\r\n"
+ " <SSIDConfig>\r\n"
+ " <SSID>\r\n"
+ " <hex>"+ssidHex+"</hex>\r\n"
+ " <name>"+ssid+"</name>\r\n"
+ " </SSID>\r\n"
+ " </SSIDConfig>\r\n"
+ " <connectionType>ESS</connectionType>\r\n"
+ " <connectionMode>"+connectedMode+"</connectionMode>\r\n"
+ " <MSM>\r\n"
+ " <security>\r\n"
+ " <authEncryption>\r\n"
+ " <authentication>WPA2PSK</authentication>\r\n"
+ " <encryption>AES</encryption>\r\n"
+ " <useOneX>false</useOneX>\r\n"
+ " </authEncryption>\r\n"
+ " <sharedKey>\r\n"
+ " <keyType>passPhrase</keyType>\r\n"
+ " <protected>false</protected>\r\n"
+ " <keyMaterial>"+password+"</keyMaterial>\r\n"
+ " </sharedKey>\r\n"
+ " </security>\r\n"
+ " </MSM>\r\n"
+ " <MacRandomization xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v3\">\r\n"
+ " <enableRandomization>false</enableRandomization>\r\n"
+ " <randomizationSeed>79900722</randomizationSeed>\r\n"
+ " </MacRandomization>\r\n"
+ "</WLANProfile>\r\n"
+ "";
//@formatter:on
// 将上面一大堆字符串写入到一个文件 写C盘可能会有权限不足的情况
String filePath = "D:\\WLAN-myWifi.xml";
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(profileXml.getBytes());
fos.close();
// 使用netsh命令配置Wi-Fi
String connectCommand="netsh wlan add profile filename="\"+filePath+"\"";
Process addProfileProcess = Runtime.getRuntime().exec(connectCommand);
addProfileProcess.waitFor();
// 手动连接Wi-Fi命令
String autoConnectCommand = "netsh wlan connect name=" + ssid;
Process connectProcess = Runtime.getRuntime().exec(autoConnectCommand);
connectProcess.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
391

被折叠的 条评论
为什么被折叠?



