android xmpp smack asmack

android - ¿Cómo obtener la marca de tiempo del mensaje xmpp entrante?



smack asmack (5)

Aunque en parte es una mezcla de las otras respuestas que ya se encuentran aquí, presentaría la respuesta de la siguiente manera ...

XMPP es "en tiempo real" ... aunque ese término puede significar muchas cosas diferentes para diferentes personas, en general, puede asumir con seguridad que recibe mensajes (casi) tan pronto como se envían, todo el software de XMPP está diseñado para cumplirlo esta meta.

Sin embargo, no existe una garantía real sobre la latencia de extremo a extremo. En la práctica general, por lo general, siempre recibirá un mensaje mucho menos de un segundo después de que el remitente lo haya transmitido, aunque las condiciones de la red pueden afectar esto.

En algunos casos, el mensaje se retrasará temporalmente, como cuando se necesita establecer una nueva conexión de servidor a servidor. En general, esto puede demorar unos pocos segundos, dependiendo de nuevo de las condiciones de la red y del método de autenticación utilizado entre los servidores.

También se puede retener un mensaje si el destinatario está fuera de línea; el servidor del destinatario puede guardar el mensaje en un almacén de "mensajes fuera de línea", hasta que pueda enviarlo cuando el destinatario se conecte.

Debido a la entrega instantánea general de los mensajes XMPP, las marcas de tiempo generalmente no se incluyen en el mensaje, ya que esa información es inútil (y se supone que todos los relojes son correctos).

Sin embargo, en los casos en que el mensaje se retrasa a sabiendas, como en los ejemplos anteriores, la entidad que retrasa el mensaje puede insertar una etiqueta en el mensaje que indica la hora original del mensaje. Esto se detalla en XEP-0203: Entrega demorada .

Estoy utilizando una biblioteca de remix para comunicarme con el servidor xmpp remoto. Puedo enviar / recibir mensajes, pero quiero obtener la marca de tiempo del mensaje entrante.

¿Podría decirme por favor, es posible en absoluto? Porque no puedo encontrar nada sobre esta pregunta.

Gracias por adelantado


Con la versión smack 4.2.0-rc2-SNAPSHOT es fácil de acceder,

DelayInformation delayInformation = forwarded.getDelayInformation(); delayInformation.getStamp().getTime();


Debido a las especificaciones, el tiempo es un atributo requerido para el mensaje XMPP:

http://xmpp.org/extensions/xep-0203.html#protocol

Compruebe el <delay elemento de <delay de <message :

<delay xmlns=''urn:xmpp:delay'' from=''capulet.com'' stamp=''2002-09-10T23:08:25Z''> Offline Storage </delay>

Pero conseguirlo parece un poco complicado. Tan pronto como aSmack se vuelva a compilar Smack con algunas cosas reemplazadas, intente hacerlo de la siguiente manera:

http://edwin.baculsoft.com/2011/06/how-to-get-offline-messages-timestamp-on-openfire/

DelayInformation inf = null; try { inf = (DelayInformation)packet.getExtension("x","jabber:x:delay"); } catch (Exception e) { log.error(e); } // get offline message timestamp if(inf!=null) Date date = inf.getStamp();

Probablemente, deberá verificar qué servidor envía con mensaje como valor de extensión y reemplazar "jabber:x:delay" con ''urn:xmpp:delay'' como se muestra en el ejemplo de especificaciones XMPP.

Pero no estoy seguro de si funciona.


La marca de tiempo no es parte de los mensajes regulares. Por lo tanto no se puede extraer.

Hay una especificación (como lo menciona @Dmitry), pero esto solo se aplica a tipos específicos de mensajes. Normalmente, aquellos que NO son en tiempo real, como fuera de línea y la publicación del último mensaje de pubsub de un nodo cuando se crea una nueva suscripción. Estos son mensajes con un retraso inherente incorporado en ellos.


También funciona para 4.1.9.

DelayInformation inf = null; inf = (DelayInformation)message.getExtension(DelayInformation.ELEMENT,DelayInformation.NAMESPACE); if (inf != null){ Date date = inf.getStamp(); System.out.println("date: "+date); }