【问题标题】:How to get timestamp of incoming xmpp message?如何获取传入 xmpp 消息的时间戳?
【发布时间】:2012-06-23 17:10:06
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 你有我面临的任何解决方案 sm 问题

标签: android xmpp smack asmack


【解决方案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 以获取 archived 标签下的 id 属性。这将为您提供从发件人发送此消息时的纪元时间(以微秒为单位)。

【讨论】:

    【解决方案2】:

    由于规范,XMPP 消息需要时间属性:

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

    检查&lt;message&lt;delay项:

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

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

    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();
    

    您可能需要检查服务器发送的消息作为扩展值,并将 "jabber:x:delay" 替换为 'urn:xmpp:delay',如 XMPP 规范示例所示。

    但不确定它是否有效。

    【讨论】:

    • 不幸的是,它没有帮助,但我非常感谢您的帮助
    • 这个答案是错误的,因为提到的协议仅适用于消息在本质上是历史的特定情况下的消息。它不适用于 OP 的问题(一般是消息),因为 XMPP 不支持。
    • @Dmitry 当我加入群组时它会收到延迟但它不在 addPacketListener(new PacketListener() 我想获得消息时间
    【解决方案3】:

    它也适用于 4.1.9

    延迟信息 inf = null; inf = (DelayInformation)message.getExtension(DelayInformation.ELEMENT,DelayInformation.NAMESPACE); 如果(inf!= null){ 日期日期 = inf.getStamp(); System.out.println("日期:"+日期); }

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 你的转发来自哪里?
      • 你能解释一下你在哪里被转发吗?
      【解决方案5】:

      虽然这里已经部分混合了其他答案,但我将按如下方式提供答案...

      XMPP 是“实时的”......虽然这个词对不同的人可能意味着很多不同的东西,但一般来说,您可以放心地假设您(几乎)在消息发送后立即收到 - 所有 XMPP 软件都是旨在实现这一目标。

      但是,没有关于端到端延迟的实际保证。在一般实践中,您通常总是会在发送者发送消息后不到一秒的时间内收到消息,尽管网络条件会影响这一点。

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

      如果收件人离线,邮件也可能会被搁置 - 收件人的服务器可能会将邮件保存在“离线邮件”存储中,直到收件人在线时它可以传递。

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

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

      【讨论】:

      • 当然。一些服务器(如 OpenFire)在发送聊天记录时使用 XEP-0203。
      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2018-02-28
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        相关资源
        最近更新 更多