リモート xmpp サーバーと通信するために aSmack ライブラリを使用しています。メッセージの送受信はできますが、受信メッセージのタイムスタンプを取得したいです。
教えてください、それはまったく可能ですか?この質問について何も見つけられないからです。
前もって感謝します
仕様により、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();
おそらく、拡張値としてメッセージを送信するサーバーを確認し、XMPP仕様の例に示されているように"jabber:x:delay"
置き換える必要があります。'urn:xmpp:delay'
しかし、それが機能するかどうかはわかりません。
タイムスタンプは、通常のメッセージの一部ではありません。したがって、抽出することはできません。
(@Dmitry で言及されているように) 仕様がありますが、これは特定の種類のメッセージにのみ適用されます。通常、オフラインや、新しいサブスクリプションが作成されたときのノードの最後の pubsub メッセージの発行など、リアルタイムではないもの。これらは、固有の遅延が組み込まれたメッセージです。
一部はすでにここにある他の回答のブレンドですが、次のように回答を提示します...
XMPP は「リアルタイム」です...この用語は、人によってさまざまな意味を持ちますが、一般的には、メッセージが送信されると (ほぼ) すぐにメッセージを受信すると想定できます。すべての XMPP ソフトウェアは、この目標。
ただし、エンド ツー エンドのレイテンシについて実際の保証はありません。一般的に、送信者がメッセージを送信してから 1 秒もかからずにメッセージを受信するのが一般的ですが、ネットワークの状態がこれに影響を与える可能性があります。
新しいサーバー間接続を確立する必要がある場合など、メッセージが一時的に遅延する場合があります。ネットワークの状態とサーバー間で使用される認証方法によっては、通常、これには数秒かかる場合があります。
受信者がオフラインの場合、メッセージは保留されることもあります。受信者がオンラインになったときに配信できるようになるまで、受信者のサーバーはメッセージを「オフライン メッセージ」ストアに保持することがあります。
XMPP メッセージは一般的に即時に配信されるため、タイムスタンプは通常、メッセージ自体には含まれません。その情報は役に立たないためです (そして、クロックがすべて正しいと仮定します)。
ただし、上記の例のように、メッセージが故意に遅延される場合、メッセージを遅延させるエンティティは、メッセージの元の時間を示すタグをメッセージに挿入できます。これについては、XEP-0203: Delayed Deliveryで詳しく説明しています。
smack 4.2.0-rc2-SNAPSHOT バージョンを使用すると、簡単にアクセスできます。
DelayInformation delayInformation = forwarded.getDelayInformation();
delayInformation.getStamp().getTime();