Как и что настроить для Android WifiConfiguration.preSharedKey для подключения к сети WPA2 PSK WiFi - PullRequest
18 голосов
/ 26 января 2010

В Android 1.5 (также на 1.6)

Как добавить точку доступа из кода?

Указана точка доступа, поддерживающая WPA2. Вот мой фрагмент кода.

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
// This is must be quoted according to the documentation 
// http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
wc.SSID = "\"SSIDName\"";
wc.preSharedKey  = "password";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;        
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifi.enableNetwork(res, true);        
Log.d("WifiPreference", "enableNetwork returned " + b );

Этот код не работает, так как в LogCat появляются

01-26 16: 44: 13.550: ОШИБКА / wpa_supplicant (2032): строка 0: неверный пароль PSK.

Я уверен, что это пароль и все остальные параметры верны. Что мне пропустить?

Ответы [ 3 ]

45 голосов
/ 26 января 2010

Причина моей печали здесь в этом выпуске Документации

В то время как документация здесь заявляет

"Предварительный общий ключ для использования с WPA-PSK. Когда значение этого ключа читается, фактический ключ не возвращается, просто «*», если ключ имеет значение или пустая строка в противном случае. "

Это правильно, но очень важно то, что не говорит - это то, что ожидаемый здесь 64-байтовый хеш-результат от linux команда

wpa_passphrase <ssid> [passphrase] 

или пароль Точки доступа В ДВОЙНЫХ ЦИТАТАХ!

Таким образом, в случае, если PSK точки доступа имеет значение "пример" , он должен быть передан в Java как это

WifiConfiguration myWiFiConfig = new WifiConfiguration();
...
myWiFiConfig.preSharedKey = "\"example\"";
...

ИЛИ

myWiFiConfig.preSharedKey = "0a0b0f62170ecc5bcf721b6ff170b8b560101b5d56b00a26abec217e0bb4aa1f";

Для всех остальных, кто правильно наткнется на это:

Скопируйте и вставьте его как есть и сохраните себе полдня боли, которую мы уже потратили на него (Особая благодарность Reflog )

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"SSIDName\"";
wc.preSharedKey  = "\"password\"";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;        
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = wifi.enableNetwork(res, true);        
Log.d("WifiPreference", "enableNetwork returned " + b );
4 голосов
/ 14 декабря 2012

спасибо , все, что я могу использовать ваш код conceptt для моего wpa psk wifi.

   WifiConfiguration wc = new WifiConfiguration();
    // This is must be quoted according to the documentation 
    // http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html#SSID
    wc.SSID = "\"zpoint\"";
    wc.preSharedKey  = "\"sipisP@ssw0rd!\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED;        
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    int res = wifi.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean b = wifi.enableNetwork(res, true);        
    Log.d("WifiPreference", "enableNetwork returned " + b );

рано, я ввожу пароль ошибки, но позже я исправляю пароль, тогда он работает.

3 голосов
/ 01 апреля 2012

Вам нужно будет добавить ниже линию для того, чтобы:

wifi.saveConfiguration();
...