Вход в одну и ту же учетную запись jabber с 2 разных устройств Android с помощью Smack

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

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

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

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

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

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

Спасибо,

Амейя


person Ameya Phadke    schedule 03.08.2010    source источник


Ответы (3)


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

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

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

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

admin@server/12345 

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

admin@server

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

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

person Chuk Lee    schedule 04.08.2010
comment
@Chuk Lee: как запретить другому пользователю входить в ту же учетную запись, у вас есть решение? - person Jinu; 11.02.2016

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

вашпользователь@вашсервер.org

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

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

[email protected]/ноутбук

[email protected]/сотовый телефон

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

person Juan Antonio Gomez Moriano    schedule 22.08.2012

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

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

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

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

person bear    schedule 13.08.2010
comment
Обратите внимание, что с новым XMPP RFC такое поведение теперь является опцией. Таким образом, Google Talk следует спецификациям. - person Flow; 22.08.2012