Faça login na mesma conta de jabber de 2 dispositivos Android diferentes usando Smack

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

  •  25-09-2019
  •  | 
  •  

Pergunta

Desenvolvi um aplicativo no Android que utiliza a API SMACK para conectar-se ao XMPP Server.

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

e eu recebo pacotes de um usuário diferente

PacketFilter filter = new andfilter (new PacketTypefilter (message.class), novo FromContainsFilter ("Ameya@mwbn43-1"));

Agora estou enfrentando o problema de que, quando executo o mesmo aplicativo em 2 dispositivos diferentes do Android, um dispositivo substitui as outras credenciais dos dispositivos e, portanto, quando estou tentando enviar os dados, apenas um deles o obtém. AFAIK No bate -papo normal do Google, o usuário pode fazer login na mesma conta em 2 locais diferentes e pode receber mensagens em ambos os lugares ao mesmo tempo.

Alguém pode me dizer qual poderia ser o problema? Tem algo a ver com a Smack API?

Obrigado,

Ameya

Foi útil?

Solução

O que você precisa fazer é definir um recurso diferente ao fazer login

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

Os recursos são semelhantes em conceito a uma porta TCP. Veja isso link. A maneira como a sequência de recursos é usada para diferenciar os dispositivos login na mesma conta, viz. No desktop, o recurso talvez "desktop" e "Android" no Android, por exemplo. Mas, no seu caso, você tem 2 dispositivos Android para que não possa predefinir o recurso. Você pode usar uma string de identificador exclusiva no dispositivo Android, como o nome da conta ou o número IMEI.

Usando a sequência de recursos, você pode enviar para um usuário específico, por exemplo

admin@server/12345 

onde 12345 é o seu recurso ou

admin@server

para todos os usuários de login.

Se você não estiver usando a string de recursos em seu aplicativo, pode usar StringUtils.randomString(20) Para gerar uma sequência aleatória de 20 caracteres. StringUtils pode ser encontrado no pacote Smack.

Outras dicas

Como regra geral, a mensagem de jabber é enviada para o último dispositivo que se conecta ao servidor; portanto, se você estiver conectando

youruser@yourserver.org

De dois dispositivos diferentes, aquele que se conectou mais tarde será o único recebendo mensagens.

Mas, se você especificar um recurso, tudo é mais fácil, então digamos que você esteja conectado do seu laptop e do seu celular, poderá fazer login com um Jid completo (ID do Jabber), usando um recurso.

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

Agora, se você deseja enviar uma mensagem de jabber para ser recebida especificamente pelo cliente conectado do seu celular, apenas certifique -se de que a mensagem seja enviada para "youruser@yourserver.org/cellphone" em vez de apenas "youruser@yourserver.org"

A razão pela qual você é apenas entregue o item a um dispositivo e não ambos é que o Tigase, ao contrário do Google Chat, está seguindo o XEP e entregando a mensagem para a conexão com a menor prioridade (ou com o dispositivo que o registrou o último se a prioridade for o mesmo.)

Você precisa ter cuidado ao tentar vincular seu JID a um recurso específico e procurar garantir que o recurso solicitado fosse realmente atribuído. O servidor pode não dar a você porque entra em conflito com o recurso definido de um JID existente.

Os servidores do Google Chat fazem algo "especial", pois entregam a mensagem a qualquer jid conectado, independentemente da configuração de recursos ou prioridades. Existem algumas mudanças sugeridas para permitir esse comportamento pelo design, mas ainda não foram aceitas pelo XSF.

Se você deseja entrega de mensagens a todos os dispositivos conectados, sugiro que você consiga criar um nó pubsub no seu servidor Tigase e definir o nó para entregar em qualquer jid on -line - então todos os seus dispositivos receberão qualquer mensagem que você empurre para o Nó se eles estiverem online.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top