XMPP Pubsub 节点发现,未找到项目

Posted

技术标签:

【中文标题】XMPP Pubsub 节点发现,未找到项目【英文标题】:XMPP Pubsub node discovery, item not found 【发布时间】:2014-11-08 17:26:10 【问题描述】:

我正在尝试使用 xmpp 服务器在 xmpp 服务器上存储持久性公共数据。理想情况下,用户将能够在服务器上存储一个节点,然后稍后检索该特定节点。这一切都是在 openfire 服务器上实现的,前端使用 strophe。

当我创建节点时,我使用这样的东西:

$iq(
 type: 'set',
 to: 'pubsub.ubuntu',
 id: 'pubsubecreatenode1'
).c('pubsub', xmlns: Strophe.NS.PUBSUB)
.c('create', 
 node: "princely_musings"; 
);

它返回一个带有创建节点的结果节,除非我已经创建了节点,在这种情况下它返回:

<iq id="pubsubecreatenode1" xmlns="jabber:client" type="error" 
    from="pubsub.ubuntu" 
    to="admin@ubuntu">
 <pubsub xmlns="http://jabber.org/protocol/pubsub">
  <create node="princely_musings"></create>
 </pubsub>
 <error code="409" type="cancel">
  <conflict xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"></conflict>
 </error>
</iq>

我也使用这个发布到它:

$iq(
 type: "set",
 to: 'pubsub.ubuntu',
 id: 'pub1'
).c("pubsub", 
 xmlns: Strophe.NS.PUBSUB
).c("publish", 
 node: "princely_musings"
).c("item")
.c("object", xmlns: "http://www.w3.org/2005/Atom")
.h("somedata");

返回一个成功的 IQ 结果节。

但是,当我去发现节点时,在请求特定节点 (princely_musings) 时出现 item-not-found 错误,或者在未指定节点时出现空列表。

$iq(
    type: "get",
    to: 'pubsub.ubuntu',
    id: "disco1"
).c("query", 
    xmlns: Strophe.NS.DISCO_ITEMS
); 

或者对于特定节点:

.c("query", 
  xmlns: Strophe.NS.DISCO_ITEMS,
  node: "princely_musings"
);

这些返回:

<iq id="disco1" xmlns="jabber:client" type="result" 
    from="pubsub.ubuntu" 
    to="admin@ubuntu">
 <query xmlns="http://jabber.org/protocol/disco#items"></query>
</iq>

<iq id="disco1" xmlns="jabber:client" type="error" 
    from="pubsub.ubuntu" 
    to="admin@ubuntu">
 <query xmlns="http://jabber.org/protocol/disco#items" 
        node="princely_musings">
 </query>
 <error code="404" type="cancel">
  <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"></item-not-found>
 </error>
</iq>

当我尝试创建现有节点时出现的冲突错误让我相信我将节点适当地存储在服务器上,但是我无法确定为什么我的发现 iq 节没有找到任何东西。这些调用中是否有我遗漏或配置错误的东西,或者我应该使用其他协议来执行此操作?

【问题讨论】:

【参考方案1】:

所以我想通了。我应该查看 ofPubsubItem 中的 openfire 数据库,以确定我是否真的在创建项目(我没有)。这直接是因为默认节点配置。 create IQ 应该看起来更像这样:

$iq(
        type: 'set',
        to: 'pubsub.ubuntu',
        from: 'create1'
    ).c('pubsub', xmlns: Strophe.NS.PUBSUB)
.c('create',  node: 'princely_musings' ).up()
.c('configure')
.c('x', xmlns: 'jabber:x:data', type: 'submit')
.c('field', 'var': 'pubsub#persist_items').c('value').t('1').up().up()
.c('field', 'var': 'pubsub#access_model').c('value').t('open').up().up()
.c('field', 'var': 'pubsub#publish_model').c('value').t('open')

【讨论】:

【参考方案2】:

我已经解决了这个问题,问题不是'ofPubsubItem'表中是否有项目

我将“iq”发送到服务器“pubsub.myserver”而不是“myserver”,这是 openfire pubsub 的关键点

<iq to='pubsub.myserver'
type='set'
id='create'>
<pubsub xmlns='http://jabber.org/protocol/pubsub'>
<create/>
</pubsub>
</iq>

谢谢

【讨论】:

我认为您的问题可能与我最初的问题略有不同,尽管查看我的问题文本我也发现我一直在使用格式错误的服务器地址。我已经编辑了问题以使用正确的 pubsub 格式。 但是,在节点配置中正确设置 persist_items 仍然很重要,否则您将在会话之间丢失数据。

以上是关于XMPP Pubsub 节点发现,未找到项目的主要内容,如果未能解决你的问题,请参考以下文章

在 xmpp 中创建一个 pubsub 节点

xmpp pubsub 理解

xmpp pubsub service(XEP-0060) 收到订阅请求后能否创建节点?

XMPP + 发布订阅 + ajaxpush

使用 XMPP - PEP/PubSub 获取传感器读数

pubsub 发布到节点成功,从节点检索失败