with studio scanner scan net example develop application android wifi android-wifi wifimanager wificonfiguration

studio - wifi scanning android



Android WifiManager.addNetwork() devuelve-1 (4)

Acabo de tener este mismo problema. Al parecer, todo estaba bien, pero entonces, no lo estaba.

Lo que encontré es esto:

  • Android WifiStateMachine no le permitirá agregar o modificar redes a menos que el suplicante esté en ejecución y conectado. Esto afecta a los servicios que se ejecutan en el inicio y los servicios que se ejecutan incluso si WIFI está apagado.

  • Android WifiConfigStore rastrea a los propietarios de la red wifi por UID. Esto significa que es posible que no pueda modificar la red creada por otro proceso.

La forma correcta de agregar una red es:

  1. Compruebe si la red WIFI está habilitada. De lo contrario, llame a WifiManager.setWifiEnabled(true) .
  2. Espere hasta que WifiManager.pingSupplicant() devuelva verdadero.
  3. Cree y complete una nueva WifiConfiguration , luego WifiManager.addNetwork() a WifiManager.addNetwork() . Asegúrese de que el valor devuelto no sea (-1).
  4. (opcional) use el valor devuelto por addNetwork() como un argumento para la WifiConfiguration.enableNetwork() a WifiConfiguration.enableNetwork() (a menos que sea -1). Tenga en cuenta que el parámetro booleano significa disableOthers y debería ser falso , a menos que tenga derecho a modificar todas las demás redes: puede fallar internamente, si lo establece en verdadero .

Esto debería permitirle agregar (y conectarse) programáticamente a una nueva red Wifi.

Estoy escribiendo una aplicación de Android que se conectará a un punto de acceso WPA específico, cuando se conecte, emitirá una llamada http. No guardará la configuración de la red. He leído casi todas las publicaciones en el desbordamiento de pila al conectarme a la red wifi, pero no encuentro la respuesta que funcione para mí. Aquí está el código que estoy usando para conectarme.

WifiConfiguration wc = new WifiConfiguration(); wc.allowedAuthAlgorithms.clear(); wc.allowedGroupCiphers.clear(); wc.allowedPairwiseCiphers.clear(); wc.allowedProtocols.clear(); wc.allowedKeyManagement.clear(); wc.SSID = "/"".concat("<ssid>").concat("/""); wc.preSharedKey = "/"".concat("<password>").concat("/""); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2 wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA wc.priority = 0; //wc.hiddenSSID = true; wc.status = WifiConfiguration.Status.ENABLED; // connect to and enable the connection WifiManager wifiManager = (WifiManager) getSystemService(this.WIFI_SERVICE); int netId = wifiManager.addNetwork(wc); boolean wifiEnabled = wifiManager.enableNetwork(netId, true); wifiManager.setWifiEnabled(true); Log.d("opener", "addNetwork returned " + netId); if (netId > 0) { wifiId = netId; }

Sin embargo, netId siempre es -1. Lo he probado en dos teléfonos diferentes (ICS: HTC Rezound y GingerBread: Motorola DroidX). Ambos muestran exactamente los mismos resultados. ¿Qué estoy haciendo mal?

Edición: probé el mismo código con el punto de acceso WPA2 y obtuve resultados muy extraños. Cuando se ejecutó este código, la primera vez devolvería -1, pero si llamo la segunda vez al mismo método con un retraso de 1 segundo, devolvería un ID de red válido. Así que las preguntas son

  1. ¿Por qué el código anterior no se conecta a wpa?
  2. en wpa2, ¿por qué necesito llamar al método anterior dos veces para conectarme? Edición: observé que tenía que conectarme varias veces para conectarme. A veces tomaría 3-4 veces para conectarse. Así que por ahora estoy en bucle hasta que agregue config devuelve> 0 id.

Descubrí que si la clave compartida tiene menos de 8 caracteres, devolverá -1.


Posiblemente un poco tarde, pero intente esto para conectarse a redes protegidas Open / WPA / WPA2 / WEP

WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = selectedNetwork.SSID(); wifiConfig.status = WifiConfiguration.Status.DISABLED; wifiConfig.priority = 40; // Dependent on the security type of the selected network // we set the security settings for the configuration if (/*Open network*/) { // No security wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedAuthAlgorithms.clear(); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); } else if (/*WPA*/ || /*WPA2*/) { //WPA/WPA2 Security wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wifiConfig.preSharedKey = "/"".concat(password).concat("/""); } else if (/*WEP*/) { // WEP Security wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); if (getHexKey(password)) wifiConfig.wepKeys[0] = password; else wifiConfig.wepKeys[0] = "/"".concat(password).concat("/""); wifiConfig.wepTxKeyIndex = 0; } // Finally we add the new configuration to the managed list of networks int networkID = wifiMan.addNetwork(wifiConfig);

Obviamente, configure sus propias variables para los diferentes tipos de seguridad según corresponda. La clave (perdón del juego de palabras) para conectarse a una red segura WEP es el método getHexKey, como se muestra a continuación.

/** * WEP has two kinds of password, a hex value that specifies the key or * a character string used to generate the real hex. This checks what kind of * password has been supplied. The checks correspond to WEP40, WEP104 & WEP232 * @param s * @return */ private static boolean getHexKey(String s) { if (s == null) { return false; } int len = s.length(); if (len != 10 && len != 26 && len != 58) { return false; } for (int i = 0; i < len; ++i) { char c = s.charAt(i); if ((c >= ''0'' && c <= ''9'') || (c >= ''a'' && c <= ''f'') || (c >= ''A'' && c <= ''F'')) { continue; } return false; } return true; }


Yo tuve el mismo problema. Descubrí que su wifi debe estar encendido mientras está llamando a addNetwork.