从Android客户端上的ejabberd XMPP服务器接收消息

时间:2019-05-28 04:36:48

标签: android xmpp ejabberd smack

我正在尝试使用ejabberd XMPP服务器(19.02),Smack库(4.2.4)和Android SDK 25使用Android Studio创建一个Android聊天客户端。

我遵循了以下示例应用程序:https://www.blikoontech.com/tutorials/android-smack-xmpp-introductionbuilding-a-simple-client

一切正常,我可以在运行该示例应用程序的两个不同的Android设备之间发送消息。

在ejabberd中,有一些选项可以使用称为ejabberdctl或ejabberd REST API的CLI工具直接从服务器向客户端发送消息。以这种方式发送消息时,Android客户端不会收到这些消息。我尝试了其他客户,例如“对话”和“ Gajim”,他们都可以收到。我非常确定使用这些方法发送的邮件已到达,因为当发送到脱机客户端时,它们是作为脱机邮件(在ejabberd Web管理员上)接收的。

这是Android(java)代码(该示例应用程序中的roosterconnection.java)的一部分,用于接收传入消息。如果我有任何遗漏,请提出建议。非常感谢。

ChatManager.getInstanceFor(mConnection).addIncomingListener(new IncomingChatMessageListener() {
            @Override
            public void newIncomingMessage(EntityBareJid messageFrom, Message message, Chat chat) {
                ///ADDED
                Log.d(TAG,"message.getBody() :"+message.getBody());
                Log.d(TAG,"message.getFrom() :"+message.getFrom());

                String from = message.getFrom().toString();

                String contactJid="";
                if ( from.contains("/"))
                {
                    contactJid = from.split("/")[0];
                    Log.d(TAG,"The real jid is :" +contactJid);
                    Log.d(TAG,"The message is from :" +from);
                }else
                {
                    contactJid=from;
                }

                //Bundle up the intent and send the broadcast.
                Intent intent = new Intent(RoosterConnectionService.NEW_MESSAGE);
                intent.setPackage(mApplicationContext.getPackageName());
                intent.putExtra(RoosterConnectionService.BUNDLE_FROM_JID,contactJid);
                intent.putExtra(RoosterConnectionService.BUNDLE_MESSAGE_BODY,message.getBody());
                mApplicationContext.sendBroadcast(intent);
                Log.d(TAG,"Received message from :"+contactJid+" broadcast sent.");
                ///ADDED

            }
        });

1 个答案:

答案 0 :(得分:0)

根据我对台式机客户端Tkabber的实验,这里是一个可能的解释:

  1. 我使用Tkabber客户端,帐户 user1 @ localhost ,资源 tka1 ,优先级 -3 登录到ejabberd。此实验中的负优先级很重要。

  2. 然后我执行命令以发送到完整的JID,包括正确的资源:

  

ejabberdctl send_stanza aaa @ localhost user1 @ localhost / tka1   “ ...”

  1. 客户端正确接收了节。

  2. 现在,我发送给裸机JID(不提供资源),并设置另一个资源:

  

ejabberdctl send_stanza aaa @ localhost user1 @ localhost   “ ...”

     

ejabberdctl send_stanza aaa @ localhost user1 @ localhost / sdsd   “ ...”

  1. 在这种情况下,客户端不接收它们,因为资源不匹配,并且其优先级为负。我可以看到那些消息离线存储在数据库中。

在您的客户中,也许您需要添加另一个呼叫以将在线状态设置为优先级。