Wi-fi P2P. Informar a todos los compañeros disponibles de algún evento

El problema: Estoy haciendo un juego androide en línea sin conexión, donde la gente puede crear o unirse a una habitación y jugar juntos a través de Wi-fi. Considere la situación cuando un usuario crea una habitación y él (por supuesto) tiene que informar a todos los demás usuarios de que hay una habitación disponible. Así que la pregunta es "¿Cómo?" He leído unas 1000 veces esto y esto . Está escrito allí que para enviar algunos datos a otro dispositivo, uno de ellos debe ser un servidor y el otro un cliente. El cliente envía alguna información al servidor, el servidor lo acepta. Por lo tanto, ¿significa que tengo que hacer todos los "jugadores" servidores y el "creador de la habitación" debe convertirse en un cliente? Esto suena loco. Por favor ayuda, puede ser que estoy leyendo los documentos erróneos?

Primero de todo usted necesita recordar que si usted decide utilizar WiFiP2P en su proyecto usted necesitará prepararse para un rato difícil. Por desgracia (como ya se puede haber notado :)) WiFiP2P documentación oficial de Android no es tan grande. Los diferentes dispositivos se comportan de diferentes maneras (por ejemplo, llaman a algunos eventos WifiP2P en orden diferente) y los documentos no lo cubren en absoluto. Lograr una conexión estable requiere la introducción de medidas no convencionales ya veces drásticas. La obtención de una conexión WifiP2P está inseparablemente vinculada con la visualización de una ventana del sistema (preguntando si realmente desea conectarse a un dispositivo).

Hay pocas cosas que debe considerar antes de comenzar a implementar una solución WifiP2P :

  1. ¿Podrán los jugadores de su juego conectarse a más de una habitación simultáneamente?
  2. ¿Podrán los jugadores de tu juego detectar nuevas salas mientras estén conectados a otra?
  3. ¿Podrán los jugadores de tu juego nombrar sus habitaciones con nombres "legibles por humanos"? ¿Y esos nombres serían utilizados por otros usuarios (no el creador de la habitación) para elegir una habitación a la que les gustaría conectarse?

Escenario A:

Si respondió "Sí" a la pregunta 1 o 2., es necesario considerar seriamente si realmente desea utilizar WifiP2P . WifiP2P (la implementación de Wifi-Direct Android) no encaja realmente con tus necesidades. El uso de WifiP2P probablemente significaría que un propietario de habitación crea un WifiP2P-group y cualquier persona que quiera unirse a la sala debe conectarse a este WifiP2p-group . El problema es que Android no permite un solo dispositivo para unirse a varios grupos al mismo tiempo (lo que también significa que no permite crear varios grupos al mismo tiempo). La detección de cambios en los dispositivos WiFiP2P disponibles también es problemática (cuando ya está conectado a un dispositivo).

Si realmente desea utilizar Wifi-Direct , probablemente necesitará usar un WiFiP2P-group y conectar todos los dispositivos a él. Este grupo actuaría igual que una red regular, y todas las cosas relacionadas con la sala de juego tendrían que ser gestionadas por un nodo que actúe como un servidor típico (o tal vez no un servidor típico sino alguna otra solución de red).

Si realmente no necesita WifiP2P utilizar sólo un Wifi regular. Conecte todos los dispositivos a una red (tal vez incluso inicie un hotspot en uno de sus dispositivos) y todo el proceso de conexión puede ser relativamente simple, realizado en segundo plano sin que el usuario esté directamente involucrado en él. Los nombres de habitaciones legibles por humanos no son un problema, ya que puede enviar cualquier cosa desde su servidor.

Escenario B:

Si respondió "Sí" a la pregunta 3. y realmente necesita usar WifiP2P , necesitará encontrar alguna forma de difundir sus nombres "legibles por humanos" a otros dispositivos.

Usted probablemente piensa que es muy fácil: se conecta a otro dispositivo, decir el nombre de la habitación que ha creado, y ya está. No es tan simple. Como dije antes:

la obtención de una conexión WifiP2P está inseparablemente vinculada con la visualización de una ventana del sistema (preguntando si realmente desea conectarse a un dispositivo)

Así que todo el proceso sería más-menos:

  1. Dispositivo A: inicia la conexión al Dispositivo B ( este paso también puede realizarse por el dispositivo B )

  2. Dispositivo B: se muestra una ventana fea del sistema que le pregunta si desea conectarse a Android-ao12ij219sa (algún nombre de dispositivo de sistema Android-ao12ij219sa )

  3. Dispositivo B: aceptar

  4. Dispositivo B: esperando el resultado de la conexión

  5. Dispositivo B: conectado, esperando información sobre el nombre del cuarto del Dispositivo A

  6. Dispositivo A: conectado, enviando el nombre de la habitación

  7. Dispositivo B: Nombre de habitación del dispositivo A obtenido, desconectando (la solicitud de conexión futura también resultará en mostrar la ventana del sistema)

Mientras se realizan los pasos 1 a 7, ningún otro dispositivo puede conectarse al dispositivo A (por lo que durante ese tiempo ningún otro dispositivo puede obtener el nombre de la sala).

Qué se podría hacer:

  1. Utilizar WifiP2P Service Discovery . Permite difundir alguna información sin necesidad de obtener una conexión. Desafortunadamente es incluso peor documentado que el propio WifiP2P , y podría ser aún menos confiable (subjetivamente). Si desea hacer una solución fiable basada en que tendrá que pasar horas de pruebas y encontrar diferentes casos en los que podría no funcionar. Sé por experiencia que es posible, pero requerirá de usted una serie de soluciones para ser implementado por lo que siempre puede obtener una conexión WiFiP2P estable.

  2. Envía a tus dispositivos, una asignación entre esos nombres (inalterables) WifiP2P y creó nombres de habitación, de alguna otra manera. Por ejemplo a través de su servidor api o algo así …

Básicamente, su diseño como lo veo tiene una solución muy simple para el diseño con Wifi Direct.

Básicamente, cuando se crea "una habitación" que otros pueden unirse, simplemente crear un grupo, a continuación, añadir servicio local para anunciar la habitación.

tenga en cuenta que es posible que tenga que iniciar el descubrimiento de pares, para ser visible con su servicio local, al menos mi experiencia ha sido que, tiene que ser activo de alguna manera, o no son detectables.

Luego con los clientes, simplemente hacer el descubrimiento de servicios y una vez que encuentre la "sala" simplemente conectar con el mismo.

Luego, como las conexiones son iniciadas por los clientes, los diálogos de aceptación deben mostrarse en el lado de los propietarios del grupo.

  • Android 4.2.2 Wifi-Direct adhoc network - acceder a métodos ocultos android para establecer el SSID y contraseña?
  • Wi-Fi Direct Android
  • ¿Es posible la multidifusión con Wi-Fi Direct?
  • El descubrimiento del servicio P2P Wifi funciona intermitentemente
  • Wifi-Direct siempre se desconecta después de treinta minutos
  • ¿Por qué Android Wi-Fi Direct solo devuelve un servicio a la vez con discoverServices?
  • WiFiDirect discoverServices sigue fallando con error 3 (NO_SERVICE_REQUESTS)
  • Cómo alcanzar la exhibición del wifi después de conectar por el wifi directo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.