如何知道谁在 MUC 房间收到了消息

Posted

技术标签:

【中文标题】如何知道谁在 MUC 房间收到了消息【英文标题】:How to know who received a message in a MUC room 【发布时间】:2016-08-26 11:21:59 【问题描述】:

对于我的论文,我正在使用 Smack 记录一个使用 MUC 模块的 XMPP 网络。

另一个软件目前正在将物联网传感器数据发送到不同的 MUC 房间。

对于发送到 MUC 房间的每条消息,我想知道在发送消息时该房间中有哪些用户。这可能吗?我可以对每个 muc 房间使用 messageListener,但是侦听器只接收一条消息作为参数。因此,我无法知道在侦听器方法中谁登录了房间。

【问题讨论】:

【参考方案1】:

您可以在 xmpp 的 StanzaListener 中获取所有 muc 消息。请按照几个步骤完成此操作

步骤 1. 声明为全局变量

ChatManagerListener chatListener;
Chat chat;
StanzaListener packetListener;

第 2 步。在 oncreate 或片段中使用此代码

注意:确保您已连接聊天服务器。

    packetListener = new StanzaListener() 
        @Override
        public void processPacket(Stanza packet) throws SmackException.NotConnectedException, InterruptedException 

            if (packet instanceof Message) 
                final Message message = (Message) packet;

               
        
    ;

        XMPP.getInstance().getConnection(acitiviy)).addAsyncStanzaListener(stanzaListener, null);

    ServiceDiscoveryManager sdm = ServiceDiscoveryManager
        .getInstanceFor(XMPP.getInstance().getConnection(acitiviy)));
    sdm.addFeature("jabber.org/protocol/si");
    sdm.addFeature("http://jabber.org/protocol/si");
    sdm.addFeature("http://jabber.org/protocol/disco#info");
    sdm.addFeature("jabber:iq:privacy");

步骤 3. 一对一聊天对象的方法

void sendMessage(String message) 
if (chat != null) 
    try 
        chat.sendMessage(message);
            Message msg = new Message();
            msg.setTo(JidCreate.bareFrom(jid));
            msg.setFrom(XMPP.getInstance().getConnection(acitiviy)
                    .getUser());

            ChatStateExtension ext = new ChatStateExtension(
                    ChatState.paused);
            msg.addExtension(ext);
            lastComposing = System.currentTimeMillis();
            chat.sendMessage(msg);

     catch (SmackException.NotConnectedException e) 
     catch (Exception e) 

    

第 4 步。关于销毁 XMPP.getInstance().getConnection(acitiviy)).removeAsyncStanzaListener(stanzaListener);

希望这会对您有所帮助,如果您想了解更多信息,请查看here。谢谢你

【讨论】:

【参考方案2】:

没有什么可以阻止您从侦听器中调用 Multi UserCaht.getParticipants()。但请注意:如果您的目标是确定其他接收者的接收者,那么这种方法是脆弱的。我还建议考虑在您的 IoT 用例中使用 PubSub 而不是 MUC。

【讨论】:

嗨,流!谢谢您的回答。如果房间是在同一个应用程序中通过 Smack 创建的,我只能调用这个 getParticipants() 方法,对吗?但是,房间是由外部实例创建的。

以上是关于如何知道谁在 MUC 房间收到了消息的主要内容,如果未能解决你的问题,请参考以下文章

XMPP MUC 向房间发送消息时重复消息

使用 Conversejs 加入房间时清除所有 MUC 消息

agsXMPP,创建 muc 房间“只允许占用者向会议发送消息”

MUC 消息的 MongooseIM 推送通知(不是 MUC 灯)

Backbone 和 Strophe muc 插件:处理传入事件

ejabberd MUC 未通知新消息