2012-06-21 3 views
16

Я использую библиотеку aSmack для связи с удаленным сервером xmpp. Я могу отправлять/получать сообщения, но хочу получить временную метку входящего сообщения.Как получить временную метку входящего сообщения xmpp?

Не могли бы вы рассказать мне, возможно ли вообще? Потому что я ничего не могу найти по этому вопросу.

Заранее спасибо

+0

U Got любого решения см выпуска IM обращенной – CoronaPintu

ответ

11

Временная метка не является составной частью обычных сообщений. Поэтому вы не можете его извлечь.

Существует спецификация (как указано @Dmitry), но это относится только к определенным типам сообщений. Обычно те, которые НЕ являются реальными, например офлайн и публикуют последнее сообщение pubsub узла при создании новой подписки. Это сообщения с встроенной в них встроенной задержкой.

9

Из-за времени спецификаций требуется атрибут для XMPP сообщения:

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

Проверьте <delay пункт <message:

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

Problably, вам нужно будет проверить, что сервер отправляет с сообщением в качестве значения расширения и замените "jabber:x:delay" на 'urn:xmpp:delay', как показано в примере XMPP.

Но не уверен, что он работает.

+0

Пожалуйста, не Не забудьте отметить ответ, если будете работать. – Dmitry

+0

К сожалению, это не помогло, но я очень благодарен за вашу помощь. – Infernus

+3

Этот ответ неверен, поскольку указанный протокол применяется только к сообщениям в конкретных ситуациях, когда сообщения носят исторический характер. Это не относится к вопросу OP (сообщения в целом), поскольку это не поддерживается в XMPP. – Robin

4

Хотя частично смесь других ответов уже здесь, я бы представить ответ следующим образом ...

XMPP является «реальном времени» ... хотя этот термин может означать много разных вещей, чтобы разные люди, в общем, вы можете смело предположить, что вы получаете сообщения (почти), как только они отправляются - все XMPP-программное обеспечение разработано для выполнения этой цели.

Однако фактической гарантии о полной задержке нет. В обычной практике вы обычно всегда получаете сообщение гораздо меньше секунды после его передачи отправителем, хотя сетевые условия могут повлиять на это.

В некоторых случаях сообщение будет временно отложено, например, когда необходимо установить новое соединение между серверами. Это может занять до нескольких секунд в целом, в зависимости от условий сети и способа аутентификации, используемых между серверами.

Сообщение может также быть задержано, если получатель находится в автономном режиме - сервер получателя может хранить сообщение в хранилище «офлайн-сообщение», пока оно не сможет доставить его, когда получатель подключится к сети.

Из-за общей мгновенной доставки сообщений XMPP отметки времени, как правило, не включаются в само сообщение, поскольку эта информация бесполезна (и предполагает, что все часы правильные).

В тех случаях, когда сообщение заведомо задержано, например, в приведенных выше примерах, сущность, которая задерживает сообщение, может вставить тег в сообщение, указывающее исходное время сообщения. Это подробно описано в XEP-0203: Delayed Delivery.

+0

Абсолютно. Некоторые серверы, такие как OpenFire, используют XEP-0203 при отправке истории чата. –

0

С привкусом версией 4.2.0-RC2-SNAPSHOT легко получить доступ,

DelayInformation delayInformation = forwarded.getDelayInformation(); 
delayInformation.getStamp().getTime(); 
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); 
        } 
Смежные вопросы