Transferencia suave de WiFi en Android

Estamos desarrollando una pequeña aplicación para Android para cambiar suavemente entre dos puntos de acceso inalámbrico diferentes en la misma red (el mismo SSID y la misma configuración de red pero diferentes ubicaciones físicas), con el objetivo de no eliminar las conexiones existentes después de la transferencia. He estado leyendo varios mensajes aquí explicando cómo controlar el wifi de forma programática, y ahora tenemos una solución de medio trabajo.

La forma en que lo implementamos, el servicio está buscando el AP que coincida con nuestros criterios con la mejor señal, y si es diferente al que el sistema está conectado, cambiará al nuevo AP. La parte pertinente del código:

... // Some initializations and bestOne is the ScanResult with the best signal conf.BSSID = bestOne.BSSID; actualNid = mWifiManager.updateNetwork(conf); mWifiManager.enableNetwork(actualNid, false); mWifiManager.saveConfiguration(); conf = getWifiConfiguration(mWifiManager, conf); if(conf == null) { return; } if(!mWifiManager.enableNetwork(conf.networkId, true)) { return; } if (mWifiManager.reconnect()) { // Great } else { // Error } 

El problema es que toda la ejecución pasa por la ruta de código esperada. Sin embargo, el traspaso no se realiza realmente, los registros se muestran cuando se vuelve a conectar y se devuelve true. Además, no hay eventos recibidos de SUPPLICANT_CONNECTION_CHANGE_ACTION o SUPPLICANT_STATE_CHANGED_ACTION, por lo que parece que el traspaso ni siquiera se ha activado.

Otro hecho es que si insertamos un mWifiManager.disconnect () antes de habilitar la red, el traspaso se realiza realmente. Sin embargo, esto no es una opción ya que las aplicaciones en ejecución pierden la conectividad, por lo tanto cayendo la sesión, que es precisamente lo que queremos evitar.

Cualquier sugerencia es más que bienvenida.

Esto puede no ser sólo un problema relacionado con el software. Por lo general, el adaptador de red (wifi) es responsable de mantener un registro de los niveles de señal y decidir cuándo y dónde vagar. Estos algoritmos son específicos del proveedor y puede que no haya una forma de afectarlos. La itinerancia se realiza enviando 802.11 reasociaciones marcos (peticiones) de un cliente y el proceso de roaming se realiza en nivel L2 (en su escenario). Pero el proceso puede no ser tan sencillo. Ambos APs deben ser conscientes de si el cliente itinerante y el conmutador enviando marcos a los AP debe tener esa actualización en su tabla CAM. El AP desde el que el cliente está roaming desde podría almacenar en memoria intermedia todas las tramas destinadas a un cliente y enviarlo a un nuevo AP cuando el cliente se reasociase resultando en ninguna pérdida de datos. Puesto que esto no es requerido por 802.11 el roaming estándar podría causar una pérdida de datos y reconectarse claramente a un AP con una señal más fuerte causaría una caída en la conexión porque no es sólo itinerancia, sino una desconexión completa y volver a conectarse a la red.

Esto probablemente no está ayudando a resolver su problema, pero yo estaba tratando de señalar que esto es realmente algo que debe hacerse en los niveles más bajos (físico, enlace de datos o transporte) no en el nivel de aplicación. El tiempo de roaming será prácticamente transparente depende mucho del hardware utilizado (en ambos lados) y la configuración de la red, y no hay mucho que puede hacer para cambiar eso. Lo único que viene en mente es el envío de solicitudes 802.11 sonda para que el cliente es consciente de otros APs con señales posiblemente más fuertes, que ya está haciendo en su código, y dejando la decisión de vagar a un adaptador de red.

  • Dibujo con los dedos
  • Error de Mobile SDK: OPERATION_NOT_ALLOWED
  • ¿Cómo resolver el requisito de permiso setMyLocationEnabled?
  • ¿Cuáles son los efectos secundarios de la inhabilitación de la inspección LINT?
  • SimpleXML con Retrofit 1.9, 'Atributo' versión 'no tiene una coincidencia en la clase'
  • ¿Android con maven? Apk desconocido
  • Java.lang.OutOfMemoryError en almacenar imágenes en sqlite db
  • Android DescargarManager get filename
  • OpenOptionsMenu () no funcionará en appcompat-v7 22.1.0 o posterior
  • Proceso de multi-subprocesos Java (Android)
  • ¿Cómo se puede forzar una descarga en un objeto OutputStream sin cerrarlo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.