Вход в одну и ту же учетную запись jabber с 2 разных устройств Android с помощью Smack - PullRequest
3 голосов
/ 04 августа 2010

Я разработал приложение для Android, которое использует API Smack для подключения к XMPP-серверу. В этом приложении я жестко кодирую информацию для входа в систему пользователя, т.е. имя пользователя и пароль.

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

, и я получаю пакеты от другого пользователя

PacketFilter filter = new AndFilter (new PacketTypeFilter (Message.class), новый FromContainsFilter ("ameya @ mwbn43-1"));

Теперь я сталкиваюсь с проблемой, заключающейся в том, что при запуске одного и того же приложения на 2 разных устройствах Android одно устройство перезаписывает учетные данные других устройств и, таким образом,когда я пытаюсь отправить данные, только один из них получает их.AFAIK в обычном чате Google, пользователь может войти в один и тот же аккаунт из двух разных мест и получать сообщения в обоих местах одновременно.

Может кто-нибудь сказать мне, в чем может быть проблема?Smack API?

Спасибо,

Амейя

Ответы [ 3 ]

8 голосов
/ 04 августа 2010

Что вам нужно сделать, это установить другой ресурс при входе в систему

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

Ресурсы аналогичны по своей концепции порту TCP.Смотрите эту ссылку .То, как строка ресурса используется для дифференциации входа устройств в одну и ту же учетную запись, а именно.на рабочем столе ресурс может быть "рабочий стол" и "Android" на Android, например.Но в вашем случае у вас есть 2 устройства Android, поэтому вы не можете предварительно настроить ресурс.Возможно, вы захотите использовать уникальную строку идентификатора на устройстве Android, например, имя учетной записи или номер IMEI.

Используя строку ресурса, вы можете отправить конкретному пользователю, например,

admin@server/12345 

, где 12345 - ваш ресурс, или

admin@server

всем зарегистрированным пользователям.

Если вы не используете строку ресурсов в своем приложении, вы можете использовать StringUtils.randomString(20), чтобы сгенерировать случайную строку из 20 символов.StringUtils можно найти в пакете Smack.

5 голосов
/ 22 августа 2012

Как правило, сообщение jabber отправляется последнему устройству, которое подключилось к серверу, поэтому, если вы подключаетесь

youruser@yourserver.org

С двух разных устройств,тот, который подключился позже, будет получать сообщения.

НО, если вы укажете ресурс, тогда все будет проще, поэтому, скажем, вы подключены с вашего ноутбука и вашего мобильного телефона, тогда вы можете войти сполный jid (идентификатор jabber), используя ресурс.

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

Теперь, если вы хотитеотправьте jabber-сообщение, которое будет получено клиентом, подключенным с вашего мобильного телефона, просто убедитесь, что сообщение отправлено на «youruser@yourserver.org/cellphone», а не просто «youruser@yourserver.org»

3 голосов
/ 13 августа 2010

Причина, по которой вы получаете только один предмет, доставленный на одно устройство, а не на оба, заключается в том, что Tigase, в отличие от Google Chat, следует XEP и доставляет сообщение на соединение с самым низким приоритетом (или на устройство, которое вошло в систему последним, еслиприоритет тот же.)

Вы должны быть осторожны, пытаясь связать свой JID с конкретным ресурсом, и убедиться, что запрашиваемый ресурс действительно назначен.Сервер может не передать его вам, поскольку он конфликтует с существующим определенным ресурсом JID.

Серверы Google Chat делают что-то «особенное» в том, что они доставляют сообщение на любой подключенный JID независимо от ресурса или установки приоритета.Существуют некоторые изменения, позволяющие разрешить такое поведение в зависимости от конструкции, но они еще не приняты XSF.

Если вы хотите доставлять сообщения на все подключенные устройства, я бы посоветовал вам заняться созданием PubSub.узел на вашем сервере Tigase и настройте узел для доставки на любой онлайн JID - тогда все ваши устройства будут получать любые сообщения, которые вы отправляете на узел, если они в сети.

...