使用Smack从2个不同的Android设备登录相同的jabber帐户

时间:2010-08-03 21:14:25

标签: android gmail xmpp smack

我在Android上开发了一个应用程序,它利用Smack API连接到XMPP服务器。在这个应用程序中,我硬编码用户登录信息,即用户名和密码。

  

xmpp.login(“admin”,“tigase”);

我收到来自其他用户的数据包

  

PacketFilter filter = new   AndFilter(新   PacketTypeFilter(Message.class)                   新的FromContainsFilter(“ameya @ mwbn43-1”);

现在我面临的问题是,当我在2个不同的Android设备上运行相同的应用程序时,一个设备会覆盖其他设备凭据,因​​此当我尝试发送数据时,只有其中一个获取它。 AFAIK在普通Google聊天中,用户可以从2个不同的地方登录同一个帐户,并可以同时在这两个地方接收消息。

有谁能告诉我可能是什么问题?它是否与Smack API有关?

谢谢,

Ameya

3 个答案:

答案 0 :(得分:8)

您需要做的是在登录时设置不同的资源

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

资源在概念上类似于TCP端口。见link。资源字符串用于区分设备登录到同一帐户的方式,即。在桌面上,资源可能是Android上的“桌面”和“android”。但在您的情况下,您有2个Android设备,因此您无法预设资源。您可能希望在Android设备上使用唯一标识符字符串,例如帐户名称或IMEI号码。

使用资源字符串,您可以发送给特定用户,例如

admin@server/12345 

其中12345是您的资源或

admin@server

给所有登录用户。

如果您未在应用程序中使用资源字符串,则可以使用StringUtils.randomString(20)生成20个字符的随机字符串。 StringUtils可以在Smack包中找到。

答案 1 :(得分:5)

作为一般规则,jabber消息被发送到连接到服务器的最后一个设备,因此如果要连接

youruser@yourserver.org

从两个不同的设备中,稍后连接的设备将是获取消息的设备。

但是,如果你指定一个资源,那么一切都会更容易,所以,假设你已经从笔记本电脑和手机连接,那么你可以使用资源登录一个完整的jid(jabber id)。

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

现在,如果您想发送一条jabber消息,以便通过手机连接的客户专门收到,请确保将消息发送到“youruser@yourserver.org/cellphone”,而不仅仅是“youruser @ yourserver” org“的

答案 2 :(得分:3)

您只能将物品送到一台设备而不是两者兼有的原因是Tigase与Google Chat不同,它正在关注XEP并将消息传递给优先级最低的连接(或者最后登录的设备)优先级是相同的。)

尝试将JID绑定到特定资源时需要小心,并确保实际分配了您请求的资源。服务器可能不会将其提供给您,因为它与现有JID定义的资源冲突。

Google聊天服务器执行“特殊”操作,因为无论资源或优先级设置如何,它们都会将消息传递给任何连接的JID。建议通过设计允许这种行为进行一些更改,但尚未被XSF接受。

如果您希望向所有连接的设备发送消息,我建议您考虑在Tigase服务器上创建一个PubSub节点并将节点设置为传送到任何在线JID - 然后您的所有设备都会收到任何消息如果他们在线,则推送到节点。