XMPP的PubSub无法投递消息

3
我正在使用最新的Strophe.js构建一个简单的网络工具来处理pubsub消息。我可以创建节点,订阅,查看表单...但是当我发布(服务器响应正常)消息时,消息从未转发到订阅的客户端。
我正在使用带有docker的ejabberd服务器rroemhild/docker-ejabberd。它具有BOSH、pubsub、admin等功能,并且似乎非常完整。我还尝试了标准的jabber ubuntu安装,但结果相同。
我使用两个用户登录,在第一个用户中,我可以创建一个节点,查看订阅。
$('#create-node').bind('click', function () {
    var pub = $iq({ type: 'set', to: pubsubUrl })
        .c('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub' })
        .c('create', { node: nodeName() });
    connection.sendIQ(pub, pubSuccess, pubError, 5000);
});

$('#list-subscriptions-node').bind('click', function () {
    var pub = $iq({ type: 'get', to: pubsubUrl, from: jid() })
        .c('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub#owner' })
        .c('subscriptions', { node: nodeName() });
    connection.sendIQ(pub.tree(), pubSuccess, pubError, 5000);
});

我向第二个用户订阅了一个最近创建的节点,我有效地看到了第二个用户已经订阅了。

$('#subscribe-node').bind('click', function () {
    var pub = $iq({ type: 'set', to: pubsubUrl })
        .c('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub' })
        .c('subscribe', { node: nodeName(), jid : jid() });
    connection.sendIQ(pub, pubSuccess, pubError, 5000);
});

最后我发布了一些消息。服务器返回了一个OK响应。

$('#publish-node').bind('click', function () {
    var pub = $iq({ type: 'set', to: pubsubUrl, from: jid() })
        .c('pubsub', { xmlns: 'http://jabber.org/protocol/pubsub' })
        .c('publish', { node: nodeName() })
        .c('item')
        .c('x', {xmlns :'jabber:x:data', type: 'result'})
        .c('field', {var : 'title'})
        .c('value').t($('#node-event').val());
    connection.sendIQ(pub, pubSuccess, pubError, 5000);
});

如果你想查看/玩代码的话,请点击这里查看我的github库。

现在的问题是,尽管一切似乎正常,但我无法看到来自服务器到已订阅发布-订阅节点的客户端的任何消息...我使用MUC对话进行了测试,一切正常。 当我发布节点消息时,这些消息永远不会作为消息发送到客户端。

我使用了几个示例和书籍进行检查,但仍然无法理解我是否做错了什么或者这是一个服务器配置问题。

有任何想法吗?在服务器中有没有地方可以检查内部运行情况?

以下是来自我的服务器调用的一些示例。确认用户已经订阅了:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns='jabber:client' from='pubsub.example.com' to='guillem@example.com/13675173711451438137658982' id='3:sendIQ' type='result'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
            <subscriptions node='4193886472'>
                <subscription jid='admin@example.com' subscription='subscribed' subid='5AB6AF973AC7E'/>
            </subscriptions>
        </pubsub>
    </iq>
</body>

这里是一条成功发布的消息

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns='jabber:client' from='pubsub.example.com' to='guillem@example.com/13675173711451438137658982' id='5:sendIQ' type='result'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <publish node='4193886472'>
                <item id='5AB6AFAB19CFD'/>
            </publish>
        </pubsub>
    </iq>
</body>
1个回答

1
原来,直到用户显示了他的在线状态,消息才会被发送给已连接的用户。
<presence xmlns='jabber:client'>
    <priority>1</priority>
</presence>

存在必须是正值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接