Anmelden Sie sich in demselben Jabber -Konto von 2 verschiedenen Android -Geräten mit Smack zusammen

StackOverflow https://stackoverflow.com/questions/3400801

  •  25-09-2019
  •  | 
  •  

Frage

Ich habe eine Anwendung auf Android entwickelt, mit der die Smack-API eine Verbindung zu XMPP Server herstellt. In dieser Anwendung harte ich die Benutzeranmeldungsinformationen, dh Benutzername und Kennwort.

xmpp.login ("admin", "Tigase");

Und ich bekomme Pakete von einem anderen Benutzer

PacketFilter filter = new andfilter (neuer pakettypefilter (message.class), neu aus kontainsfilter ("ameya@mwbn43-1"));

Jetzt stehe ich vor dem Problem, dass bei der Ausführung derselben App auf 2 verschiedenen Android -Geräten ein Gerät die anderen Geräte -Anmeldeinformationen überschreibt. Wenn ich also versuche, die Daten zu senden, erhält nur einer von ihnen. Afaik In normalem Google -Chat kann sich der Benutzer von 2 verschiedenen Orten in demselben Konto anmelden und gleichzeitig Nachrichten an beiden Orten empfangen.

Kann mir jemand sagen, was das Problem sein könnte? Hat es etwas mit Smack API zu tun?

Vielen Dank,

Ameya

War es hilfreich?

Lösung

Was Sie tun müssen, ist eine andere Ressource, wenn Sie sich anmelden

xmpp.login("admin", "tigase", "a random string here");

Die Ressourcen sind im Konzept eines TCP -Ports ähnlich. Sieh dir das an Verknüpfung. Die Art und Weise, wie die Ressourcenzeichenfolge sich in demselben Konto anmelden, nämlich. Auf dem Desktop ist die Ressource zum Beispiel auf Android "Desktop" und "Android" auf Android. In Ihrem Fall haben Sie jedoch 2 Android -Geräte, sodass Sie die Ressource nicht vorstellen können. Möglicherweise möchten Sie eine eindeutige Kennzeichen für das Android -Gerät wie den Kontonamen oder die IMEI -Nummer verwenden.

Mit der Ressourcenzeichenfolge können Sie entweder an einen bestimmten Benutzer -EG senden

admin@server/12345 

wo 12345 Ihre Ressource ist oder

admin@server

an alle Login -Benutzer.

Wenn Sie die Ressourcenzeichenfolge in Ihrer Anwendung nicht verwenden, können Sie verwenden StringUtils.randomString(20) So generieren Sie eine zufällige Zeichenfolge von 20 Zeichen. StringUtils Kann im Smack -Paket gefunden werden.

Andere Tipps

In der Regel wird die Jabber -Nachricht an das letzte Gerät gesendet, das mit dem Server verbunden ist. Wenn Sie also eine Verbindung herstellen

yoRuser@yourserver.org

Aus zwei verschiedenen Geräten wird derjenige, der später verbunden ist, diejenige, die Nachrichten erhält.

Wenn Sie jedoch eine Ressource angeben, ist alles einfacher. Wenn Sie also annehmen, dass Sie von Ihrem Laptop und Ihrem Handy verbunden sind, können Sie sich mit einer vollständigen JID (Jabber -ID) mit einer Ressource anmelden.

youuser@yourserver.org/laptop

youuser@yourserver.org/cellphone

Wenn Sie nun eine Jabber -Nachricht senden möchten, die speziell vom von Ihrem Handy angeschlossenen Kunden empfangen wird, stellen Sie einfach sicher, dass die Nachricht an "youruser@yourserver.org/cellphone" gesendet wird, anstatt nur "youuser@yourserver.org"

Der Grund, warum Sie nur den Artikel an ein Gerät geliefert haben, und nicht beides ist, dass Tigase im Gegensatz zu Google Chat dem XEP folgt und die Nachricht an die Verbindung mit der niedrigsten Priorität (oder dem Gerät, das sich angemeldet hat, wenn die Priorität angemeldet ist das Gleiche.)

Sie müssen vorsichtig sein, wenn Sie versuchen, Ihre JID an eine bestimmte Ressource zu binden und sicherzustellen, dass die von Ihnen angeforderte Ressource tatsächlich zugewiesen wurde. Der Server gibt es möglicherweise nicht an Sie, da er mit der definierten Ressource eines vorhandenen JID in Konflikt steht.

Google -Chat -Server machen etwas "Besonderes", als sie die Nachricht an eine angeschlossene JID übermitteln, unabhängig von der Ressourcen- oder Prioritätseinstellung. Es werden einige Änderungen vorgeschlagen, um dieses Verhalten durch Design zuzulassen, aber diese wurden noch nicht vom XSF akzeptiert.

Wenn Sie die Bereitstellung von Nachrichten an alle verbundenen Geräte vorlegen möchten, empfehlen Sie Ihnen, einen PubSub -Knoten auf Ihrem Tigase -Server zu erstellen und den Knoten für eine Online -JID zu setzen -, erhalten alle Ihre Geräte eine Nachricht, die Sie an die verschieben Knoten, wenn sie online sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top