如何获取传入的xmpp消息的时间戳?

时间:2012-06-21 12:54:12

标签: android xmpp smack asmack

我正在使用aSmack库与远程xmpp服务器进行通信。我能够发送/接收消息,但我想获取传入消息的时间戳。

你可以告诉我,它有可能吗?因为我找不到关于这个问题的任何信息。

提前致谢

6 个答案:

答案 0 :(得分:11)

由于规范时间是XMPP消息的必需属性:

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

检查<delay的{​​{1}}项:

<message

但是看起来有点棘手。一旦aSmack用一些替换的东西重新编译Smack,所以试着像这里一样:

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

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

原则上,您需要检查服务器发送的内容,并将消息作为扩展名值,并将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(); 替换为"jabber:x:delay",如XMPP规范示例所示。

但不确定它是否有效。

答案 1 :(得分:11)

时间戳不是常规消息的一部分。因此你无法提取它。

有一个规范(如@Dmitry所述),但这仅适用于特定类型的消息。通常是那些非实时的,例如离线并在创建新订阅时发布节点的最后一个pubsub消息。这些是内置延迟的消息。

答案 2 :(得分:4)

虽然部分是已经在这里的其他答案的混合,但我会给出如下答案......

XMPP是“实时” ......虽然这个词可能意味着很多不同的事情,不同的人,一般你可以安全地假设你只要他们发送接收消息(几乎) - 所有XMPP软件旨在实现这一目标。

然而,对端到端延迟没有实际保证。在一般情况下,您通常会在发送者传输之后始终收到一条消息,但是网络条件可能会影响此消息。

在某些情况下,邮件会暂时延迟,例如需要建立新的服务器到服务器连接时。这通常可能需要几秒钟,这取决于网络条件和服务器之间使用的身份验证方法。

如果收件人处于离线状态,也可能会阻止邮件 - 收件人的服务器可能会将邮件保留在“离线邮件”存储中,直到收件人联机时才能传送邮件。

由于XMPP消息的一般即时传递,时间戳通常不包含在消息本身中,因为该信息是无用的(假设时钟都是正确的)。

在消息被故意延迟的情况下,例如在上面的示例中,延迟消息的实体可以在消息中插入指示消息的原始时间的标签。这在XEP-0203: Delayed Delivery中有详细说明。

答案 3 :(得分:2)

它也适用于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);
                    }

答案 4 :(得分:1)

对于脱机消息: 您将收到以下消息:

<message xml:lang='en' to='<TO>' from='<FROM>' type='chat' id='3SE7n-39'><delay xmlns='urn:xmpp:delay' from='lakshitnagar.com' stamp='2020-09-05T18:01:01.854690Z'>Offline Storage</delay><offline xmlns='http://jabber.org/protocol/offline'><item node='335'/></offline><body>Hello</body></message>

您可以解析此XML,以在 delay 标记下获取 stamp 属性。这将为您提供从发件人发送邮件的时间。

对于MAM存档的邮件: 您将收到以下内容:

<message xmlns='jabber:client' to='<TO>' from='<FROM>' id='NzVV5-84' xml:lang='en' type='chat'><archived xmlns='urn:xmpp:mam:tmp' xmlns:stream='http://etherx.jabber.org/streams' by='lakshitnagar@lakshitnagar.com' id='1599328757912003'></archived><body>hello</body></message>

您可以解析此XML,以在 已存档 标签下获取 id 属性。从发件人发送此消息后,这将为您提供以毫秒为单位的纪元时间。

答案 5 :(得分:0)

使用smack 4.2.0-rc2-SNAPSHOT版本,它很容易访问,

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