Iniciar sesión en la misma cuenta de Jabber de 2 dispositivos Android diferentes usando Smack

StackOverflow https://stackoverflow.com/questions/3400801

  •  25-09-2019
  •  | 
  •  

Pregunta

He desarrollado una aplicación en Android que utiliza la API Smack para conectarse al servidor XMPP. En esta aplicación, codifico la información de inicio de sesión del usuario, es decir, nombre de usuario y contraseña.

xmpp.login ("admin", "tigase");

y obtengo paquetes de un usuario diferente

PacketFilter Filter = new andFilter (new PacketTypeFilter (Message.Class), new FromContainsFilter ("ameya@mwbn43-1"));

Ahora me enfrento al problema de que cuando ejecuto la misma aplicación en 2 dispositivos Android diferentes, un dispositivo sobrescribe las otras credenciales de dispositivos y, por lo tanto, cuando intento enviar los datos, solo uno de ellos lo entiende. AFAIK En el chat normal de Google, el usuario puede iniciar sesión en la misma cuenta desde 2 lugares diferentes y puede recibir mensajes en ambos lugares al mismo tiempo.

¿Alguien puede decirme cuál podría ser el problema? ¿Tiene algo que ver con Smack API?

Gracias,

Ameya

¿Fue útil?

Solución

Lo que tiene que hacer es establecer un recurso diferente cuando inicie sesión

xmpp.login("admin", "tigase", "a random string here");

Los recursos son similares en concepto a un puerto TCP. Mira esto Enlace. La forma en que se usa la cadena de recursos para diferenciar los dispositivos iniciar sesión en la misma cuenta, a saber. En el escritorio, el recurso tal vez "Desktop" y "Android" en Android, por ejemplo. Pero en su caso tiene 2 dispositivos Android para que no pueda preestablecer el recurso. Es posible que desee utilizar una cadena de identificación única en el dispositivo Android como el nombre de la cuenta o el número IMEI.

Usando la cadena de recursos, puede enviar a un usuario específico, por ejemplo

admin@server/12345 

donde 12345 es su recurso o

admin@server

a todos los usuarios de inicio de sesión.

Si no está utilizando la cadena de recursos en su aplicación, puede usar StringUtils.randomString(20) para generar una cadena aleatoria de 20 caracteres. StringUtils se puede encontrar en el paquete Smack.

Otros consejos

Como regla general, el mensaje de Jabber se envía al último dispositivo que se conectó al servidor, por lo que si está conectando

youruser@yourserver.org

De dos dispositivos diferentes, el que se conectó más tarde será el que recibe mensajes.

Pero, si especifica un recurso, entonces todo es más fácil, por lo tanto, digamos que está conectado desde su computadora portátil y su teléfono celular, entonces puede iniciar sesión con un JID completo (ID de Jabber), usando un recurso.

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

Ahora, si desea enviar un mensaje de Jabber para ser recibido específicamente por el cliente conectado desde su teléfono celular, solo asegúrese de que el mensaje se envíe a "youruser@yourserver.org/cellphone" en lugar de solo "youruser@yourserver.org"

The reason your only getting the item delivered to one device and not both is that Tigase, unlike Google Chat, is following the XEP and delivering the message to the connection with the lowest priority (or to the device that logged in last if the priority is the same.)

You need to be careful when trying to bind your JID to a specific resource and look to make sure the resource you requested was actually assigned. The server may not give it to you because it conflicts with an existing JID's defined resource.

Google Chat servers do something "special" in that they deliver the message to any connected JID regardless of resource or priority setting. There are some changes being suggested to allow that behaviour by design but those have not yet been accepted by the XSF yet.

If you want delivery of messages to all connected devices I would suggest that you look into creating a PubSub node on your Tigase server and set the node to deliver to any online JID - then all of your devices will receive any message that you push to the node if they are online.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top