Как получить временную метку входящего сообщения xmpp?

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Из-за спецификаций требуется время для атрибута для сообщения 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();

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Он также работает для 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);
                    }

Ответ 5

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

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