Accedere allo stesso account Jabber da 2 diversi dispositivi Android utilizzando Smack

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

  •  25-09-2019
  •  | 
  •  

Domanda

Ho sviluppato un'applicazione su Android che utilizza l'API SMACK per connettermi al server XMPP. In questa applicazione ho codificato le informazioni di accesso all'utente, cioè nome utente e password.

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

e ricevo pacchetti da un utente diverso

PacketFilter filter = new andfilter (nuovo packetttypefilter (message.class), nuovo dacontainsfilter ("amya@mwbn43-1"));

Ora sto affrontando il problema che quando eseguo la stessa app su 2 diversi dispositivi Android un dispositivo sovrascrive le credenziali degli altri dispositivi e quindi quando sto cercando di inviare i dati, solo uno di essi lo ottiene. AFAIK Nella normale chat di Google, l'utente può accedere allo stesso account da 2 luoghi diversi e può ricevere messaggi su entrambi i luoghi allo stesso tempo.

Qualcuno può dirmi quale potrebbe essere il problema? Ha qualcosa a che fare con Smack API?

Grazie,

Ameya

È stato utile?

Soluzione

Quello che devi fare è impostare risorse diverse quando accedi

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

Le risorse sono simili nel concetto a una porta TCP. Guarda questo collegamento. Il modo in cui la stringa di risorse viene utilizzata per differenziare i dispositivi accedi nello stesso account, vale a dire. Sul desktop, la risorsa forse "desktop" e "Android" su Android, ad esempio. Ma nel tuo caso hai 2 dispositivi Android in modo da non poter preimpostare la risorsa. Potresti voler utilizzare una stringa identificativa univoca sul dispositivo Android come il nome dell'account o il numero IMEI.

Utilizzando la stringa delle risorse, è possibile inviare a un utente specifico EG

admin@server/12345 

dove 12345 è la tua risorsa o

admin@server

a tutti gli utenti di accesso.

Se non si utilizza la stringa delle risorse nell'applicazione, puoi utilizzare StringUtils.randomString(20) Per generare una stringa casuale di 20 caratteri. StringUtils può essere trovato nel pacchetto Smack.

Altri suggerimenti

Come regola generale, il messaggio Jabber viene inviato all'ultimo dispositivo connesso al server, quindi se si sta collegando

youruser@yourserver.org

Da due diversi dispositivi, quello che si è collegato in seguito sarà quello di ricevere messaggi.

Ma, se specifichi una risorsa, allora tutto è più facile, quindi diciamo che sei connesso dal tuo laptop e dal tuo cellulare, puoi accedere con un JID completo (ID Jabber), utilizzando una risorsa.

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

Ora, se si desidera inviare un messaggio Jabber da ricevere specificamente dal cliente connesso dal tuo cellulare, assicurati che il messaggio venga inviato a "youruser@yourserver.org/cellphone" invece di solo "youruser@yourserver.org"

Il motivo per cui il tuo unico elemento viene consegnato a un dispositivo e non entrambi è che Tigase, a differenza di Google Chat, sta seguendo l'XEP e consegna il messaggio alla connessione con la priorità più bassa (o al dispositivo che ha effettuato l'ultimo se la priorità è lo stesso.)

Devi stare attento quando si tenta di vincolare la tua JID a una risorsa specifica e cercare di assicurarsi che la risorsa che hai richiesto sia stata effettivamente assegnata. Il server potrebbe non darti perché è in conflitto con una risorsa definita da JID esistente.

I server di chat di Google fanno qualcosa di "speciale" in quanto consegnano il messaggio a qualsiasi JID connesso indipendentemente dalla risorsa o dall'impostazione prioritaria. Ci sono alcuni cambiamenti suggeriti per consentire quel comportamento in base alla progettazione, ma quelli non sono ancora stati accettati dal XSF.

Se si desidera la consegna di messaggi a tutti i dispositivi connessi, suggerirei di cercare di creare un nodo pubsub sul tuo server Tigas nodo se sono online.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top