Получение сообщений с сервера ejabberd XMPP на клиенте Android - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать клиент для чата Android, используя сервер ejabberd XMPP (19.02), библиотеку Smack (4.2.4) и Android SDK 25, используя Android Studio.

Я следовал примеру приложения, найденного здесь: https://www.blikoontech.com/tutorials/android-smack-xmpp-introductionbuilding-a-simple-client

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

В ejabberd есть опции для отправки сообщений клиентам прямо с сервера с помощьюинструмент CLI под названием ejabberdctl или ejabberd REST API.Когда я отправлял сообщения таким образом, клиент Android не получает эти сообщения.Я пытался с другими клиентами, такими как беседы и Gajim, и они все могли получить его.Я почти уверен, что сообщения, отправленные с использованием этих методов, пришли, потому что они были получены как автономные сообщения (через веб-администратора ejabberd) при отправке автономным клиентам.

Вот часть кода 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 голосов
/ 29 мая 2019

Вот возможное объяснение, основанное на моих экспериментах с настольным клиентом, Tkabber:

  1. Я вхожу в ejabberd, используя клиент Tkabber, учетная запись user1 @ localhost , ресурс tka1 , приоритет -3 .Отрицательный приоритет в этом эксперименте важен.

  2. Затем я выполняю команду для отправки на полный JID, включая правильный ресурс:

ejabberdctl send_stanza aaa @ localhost user1 @ localhost / tka1 " ..."

Клиент получает раздел правильно.

Теперь я отправляю на голый JID (без предоставления ресурса), а другой параметр настраивает другой ресурс:

ejabberdctl send_stanza aaa @ localhost user1 @ localhost " ..."

ejabberdctl send_stanza aaa @ localhost user1 @ localhost / sdsd " ..."

В этих случаях клиент не получает ни одного из них, потому что ресурс не совпадает и потому что его приоритет отрицательный.Я вижу эти сообщения, хранящиеся в автономном режиме в базе данных.

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

...