2012-06-21 11 views
16

Używam biblioteki aSmack do komunikowania się ze zdalnym serwerem xmpp. Mogę wysyłać/odbierać wiadomości, ale chcę uzyskać znacznik czasu przychodzącej wiadomości.Jak uzyskać datownik przychodzącej wiadomości xmpp?

Czy możesz mi powiedzieć, proszę, czy to w ogóle możliwe? Ponieważ nie mogę znaleźć nic na temat tego pytania. wymagana jest

góry dzięki

+0

u jakieś rozwiązanie SM im problem stoi – CoronaPintu

Odpowiedz

11

Znacznik czasu nie należy do zwykłych wiadomości. Dlatego nie możesz go wyodrębnić.

Istnieje specyfikacja (jak wspomniano w @Dmitry), ale dotyczy to tylko określonych rodzajów wiadomości. Zazwyczaj te, które NIE są w czasie rzeczywistym, takie jak offline i publikowanie ostatniego komunikatu pubsub węzła po utworzeniu nowej subskrypcji. Są to komunikaty z wbudowanym wbudowanym opóźnieniem.

9

ze względu na czas specyfikacją atrybut dla wiadomości XMPP:

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

Sprawdzić pozycję <delay z <message:

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

Ale coraz to wygląda trochę podchwytliwe. Jak tylko aSmack jest zrekompilowane Smack z pewnym zastąpiona rzeczy, więc postarać się o to tak jak tutaj:

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, trzeba będzie sprawdzić, co serwer wysyła z komunikatem jako wartości rozszerzenia i zamień "jabber:x:delay" na 'urn:xmpp:delay', tak jak pokazano to w przykładach specyfikacji XMPP.

Ale nie jestem pewien, czy to działa.

+0

proszę don nie zapomnij oznaczyć odpowiedzi, jeśli zadziała. – Dmitry

+0

Niestety to nie pomogło, ale jestem bardzo wdzięczny za pomoc – Infernus

+3

Ta odpowiedź jest błędna, ponieważ wspomniany protokół dotyczy tylko wiadomości w określonych sytuacjach, w których wiadomości mają charakter historyczny. Nie dotyczy to pytania OP (wiadomości ogólnie), ponieważ nie jest to obsługiwane w XMPP. – Robin

4

Chociaż częściowo mieszanką innych odpowiedzi już tutaj, chciałbym przedstawić odpowiedź następująco ...

XMPP jest „w czasie rzeczywistym” ... mimo, że termin może oznaczać wiele różnych rzeczy dla różnych ludzie, ogólnie rzecz biorąc, możesz bezpiecznie założyć, że otrzymujesz wiadomości (prawie) zaraz po ich wysłaniu - wszystkie programy XMPP są zaprojektowane do realizacji tego celu.

Jednak nie ma rzeczywistej gwarancji na temat opóźnienia od początku do końca. W praktyce zwykle otrzymujesz wiadomość znacznie mniej niż sekundę po wysłaniu jej przez nadawcę, chociaż warunki sieciowe mogą na to wpływać.

W niektórych przypadkach komunikat zostanie tymczasowo opóźniony, na przykład w przypadku konieczności nawiązania nowego połączenia serwer-serwer. Może to potrwać do kilku sekund, w zależności od warunków sieciowych i metody uwierzytelniania używanej między serwerami.

Wiadomość może również zostać zatrzymana, jeśli odbiorca jest w trybie offline - serwer odbiorcy może przechowywać wiadomość w magazynie "wiadomości offline", dopóki nie może jej dostarczyć, gdy odbiorca przejdzie do trybu online.

Ze względu na ogólną natychmiastową dostawę wiadomości XMPP znaczniki czasu zazwyczaj nie są zawarte w samej wiadomości, ponieważ informacje te są bezużyteczne (i zakładają, że zegary są poprawne).

W przypadkach, w których komunikat jest świadomie opóźniony, jak na przykład w powyższych przykładach, encja opóźniająca komunikat może wstawić znacznik do wiadomości, wskazując pierwotny czas wiadomości. Jest to szczegółowo opisane w XEP-0203: Delayed Delivery.

+0

Oczywiście niektóre serwery, takie jak OpenFire, wykorzystują XEP-0203 podczas wysyłania historii czatu. –

0

Z zadatki wersji 4.2.0-RC2-SNAPSHOT jest łatwy dostęp,

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

Działa również na 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); 
        }