Как получить временную метку входящего сообщения 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();