我在 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 有关吗?

谢谢,

阿米亚

有帮助吗?

解决方案

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

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

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

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

admin@server/12345 

其中 12345 是您的资源或

admin@server

给所有登录用户。

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

其他提示

作为一般规则,jabber 消息会发送到最后连接到服务器的设备,因此如果您正在连接

youruser@yourserver.org

从两台不同的设备,稍后连接的设备将是接收消息的设备。

但是,如果您指定资源,那么一切都会变得更容易,因此,假设您通过笔记本电脑和手机进行连接,那么您可以使用资源以完整的 jid(jabber id)登录。

youruser@yourserver.org/laptop

youruser@yourserver.org/cellphone

现在,如果您想发送一条 jabber 消息,由从您的手机连接的客户端专门接收,只需确保该消息发送到“youruser@yourserver.org/cellphone”,而不仅仅是“youruser@yourserver.org”

您只能将项目发送到一台设备而不是同时发送到两台设备的原因是,与 Google Chat 不同,Tigase 遵循 XEP 并将消息发送到优先级最低的连接(如果优先级为最后登录的设备,则发送到最后登录的设备)相同。)

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

Google Chat 服务器会执行一些“特殊”操作,因为它们会将消息传递到任何连接的 JID,而不管资源或优先级设置如何。建议进行一些更改以允许设计上的行为,但这些更改尚未被 XSF 接受。

如果您希望将消息传递到所有连接的设备,我建议您考虑在 Tigase 服务器上创建一个 PubSub 节点,并将该节点设置为传递到任何在线 JID - 那么您的所有设备都将收到您推送到的任何消息节点(如果它们在线)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top