2015-02-17 3 views
0

У меня есть это приложение для Android, которое я пытался установить XMPP MultiUserChat.ASmack MultiUserChat (MUC) Неудача для прослушивания сообщений

Что касается подключения к XMPP, входа в систему и создания MUC (а также присоединения уже созданного), все будет хорошо.

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

Я уже несколько раз работал с XMPP с помощью Javascript (StropheJS с Bosh), поэтому я несколько ознакомился с его протоколами.

Как я уже пытался что быть предложено на следующем посте (единственный пост я нашел по этому поводу):

How to properly listen for MultiUserChat in Smack?

Итак, я решил задать вам несколько направлений, как я подумайте, что это, вероятно, простая установка, которую я пропустил все время.

Итак, для простоты, я собираюсь предоставить всю свою последовательность.

Я создал службу, поэтому мое соединение XMPP может распространяться повсюду в течение всего приложения. Поскольку мне нужно подключиться к XMPP, как только мое приложение входит в систему, а также комнаты MUC будут использоваться только дальше в других действиях. Ну, вы получите картину. Итак, вот код:

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

//everything is alright here. 
//it's connecting correctly to XMPP 
public void connect() 
{ 

    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() 
     { 
      boolean flConnected = false; 
      System.setProperty("smack.debugEnabled", "true"); 
      SmackConfiguration.setDefaultPacketReplyTimeout(10000); 


      ConnectionConfiguration ConnectionConfiguration = new ConnectionConfiguration(Host, Port); 
      ConnectionConfiguration.setSecurityMode(org.jivesoftware.smack.ConnectionConfiguration.SecurityMode.disabled); 

      ConnectionConfiguration.setDebuggerEnabled(true); 
      ConnectionConfiguration.setSendPresence(true); 

      connection = new XMPPTCPConnection(ConnectionConfiguration); 

      try 
      { 
       connection.connect(); 
       login(); 
      } 
      //there are many exceptions being treated, I 
      //suppressed them here for simplicity's sake 
      catch (Exception e) 
      { 
       Log.e(TAG, "connection exception: " + e.getMessage()); 
      } 


     } 
    }); 
    t.start(); 
} 

public void login() 
{ 
    try 
    { 
     connection.login(this.User, Pwd); 

     Presence presence = new Presence(Presence.Type.available); 
     connection.sendPacket(presence); 
     this.setLoginAttempts();   

    } 
    catch (Exception e) 
    { 
     Log.e(TAG, "connection exception: "+e.getMessage()); 
    } 
} 

Таким образом, когда пользователь должен быть администратором определенного chatgroup, я создаю группу, проходящую в GroupName (ID)

public void createGroup(String strRoom) 
{ 
    try 
    { 
     muc = new MultiUserChat(connection, strRoom+"@"+this.GroupChat); 
     muc.create(this.User); 

     Form form = muc.getConfigurationForm(); 
     Form submitForm = form.createAnswerForm(); 



     for (Iterator fields = form.getFields().iterator(); fields.hasNext();) { 
      FormField field = (FormField) fields.next(); 
      if (!FormField.TYPE_HIDDEN.equals(field.getType()) 
        && field.getVariable() != null) { 
        submitForm.setDefaultAnswer(field.getVariable()); 
      } 
     } 

     List<String> owners = new ArrayList<>(); 
     owners.add(this.User + "@"+this.Host); 

     muc.sendConfigurationForm(submitForm);       

     //here, it's another FAILED attempt of putting the 
     //listener to an async class. Didn't work at all!! 
     //just kept it here so you can see my attempts! 
     //new MessageRunner().execute(connection);   

    } 
    catch (Exception ex) 
    { 
     Log.e(TAG, " exception :"+ex.getMessage()); 
    } 
} 

И когда это просто участник, он присоединяется к группе:

public void joinGroup(String strRoom) 
{ 
    try 
    { 
     DiscussionHistory history = new DiscussionHistory(); 
     history.setMaxStanzas(50); 
     muc = new MultiUserChat(connection, strRoom+"@"+this.GroupChat); 
     muc.join(strRoom, this.Pwd, history, connection.getPacketReplyTimeout()); 

     this.addMessageListener(muc); 

     this.listen2Group(); 
    } 
    catch (Exception ex) 
    { 
     Log.e(TAG, "Exception :"+ex.getMessage()); 
    } 
} 

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

Один из них устанавливается сразу после входа в систему: setListener (соединение);

Два других вызывается после того, как пользователь присоединяется к: к конференции

addMessageListener (MUC); и listen2Group();

Я оставляю их здесь, так что вы можете увидеть, как далеко я пошел:

private void addMessageListener(MultiUserChat muc) 
{ 
    //it's never coming here! never ever!!! 
    if(null != muc){ 
     muc.addMessageListener(new PacketListener() { 
      @Override 
      public void processPacket(Packet packet) { 
       Log.i("processPacket", "receiving message"); 
      } 
     }); 
    } 
} 

private void listen2Group() 
{ 

    //also, NEVER EVER getting here at any time!! 
    PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat); 


    connection.addPacketListener(new PacketListener() { 
     @Override 
     public void processPacket(Packet packet) throws NotConnectedException 
     { 
      Message message = (Message) packet; 
      if (message.getBody() != null) 
      { 

       //message should be treated here, 
       //but I suppressed it as well. 
      } 
     } 
    }, filter); 
} 

public void setListener(XMPPConnection cnx) 
{ 
    this.connection = cnx; 
    if (connection != null) { 

     PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat); 
     connection.addPacketListener(new PacketListener() { 
      @Override 
      public void processPacket(Packet packet) { 
       Message message = (Message) packet; 
       if (message.getBody() != null) 
       {       
        //message will be treated here. 
       } 
      } 
     }, filter); 
    } 

} 

А вот как я отправляю сообщения:

public void sendMessage(String msgText) 
{ 
    try 
    { 

     Message msg = new Message(); 
     msg.setBody(msgText); 
     msg.setType(Message.Type.groupchat); 


     muc.sendMessage(msg); 

     //I tried sending with this one as well, nope! 
     //connection.sendPacket(msg); 
    } 
    catch(Exception ex) 
    { 
     Log.e(TAG, " exception :"+ex.getMessage()); 
    } 
} 

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

Когда я проверяю на своем сервере (openfire), все пользователи настроены в режиме онлайн, они также правильно регистрируются в MUC, когда сообщения отправляются, ничего не происходит!

Я размещаю точки останова на всех слушателях, которые я вам показывал, но они никогда не стреляют, что бы я ни делал. Сообщение отправляется, но оно никогда не прибывает нигде.

Любые идеи?

ответ

0

Для будущих ссылок (как прямо в его текущей версии не полностью документированы)

Я нашел то, что было не так со слушателями!

Оказалось, что я не назначил пункт назначения в чат-группу.

Как это по своей природе, GroupChat, я полагал, что не нужно было устанавливать приемник на сообщения.

Все было необходимо, чтобы исправить это, был мой метод SendMessage, дополнительные линии:

msg.setTo (this.room + "@" + my_service_address);

http://xmpp.org/extensions/xep-0045.html

В XEP-0045 говорится, что для него должны к конференции иметь адрес назначения для того, чтобы работать должным образом.

«Сообщения, отправленные в многопользовательских чатах, имеют особый тип« групповой »и адресованы самой комнате (room @ service), а затем отражаются на всех жильцах».

 Смежные вопросы

  • Нет связанных вопросов^_^