2011-06-06 64 views
0

我有一些使用XMPP4r构建的机器人,我看到一个奇怪的问题,他们将在线上线一段​​时间后出现。 (没有设定的时间)XMPP4r机器人存在 - 随机出现,直到重新启动?

我会在我的名单中看到他们罚款一晚,第二天早上我会醒来,第二天早上发现他们出现离线。我可以给他们留言,他们回复良好,他们只是出现离线。

如果我重新启动它们,它们会立即再次显示在我的名单中。这发生在多个XMPP客户端(iChat,Adium,Meebo)和多个单独的机器人,所以我不认为这是一种侥幸。

任何建议我应该从哪里开始寻找?我正在运行我自己的Prosody服务器,所以我知道这不是重新启动。它可能是一个沉默的重新连接问题?

+0

一些研究之后,我发现我没有回答智商坪。这可能与它有关 - 检查。 – Scott 2011-06-07 00:48:23

+0

如果这有助于任何人,对IQ平静的反应并没有帮助,尽管这是我本来应该做的事情。看起来有什么帮助是创建一个线程,每小时改变我的存在 - 这感觉很不好,我想知道更好的解决方案。 – Scott 2011-06-15 14:44:50

+0

好吧,万一它有帮助 - 我有一个hacky的解决方案。在我的机器人课程中,我有一个计时器,每小时更改我的状态信息。 (看起来我必须改变它做不同的文本,我不能只是尝试重新发送我的存在,再次使用相同的消息)我不喜欢这种方法,但我的机器人已经运行了一个多星期没有问题。 – Scott 2011-06-23 15:52:58

回答

1

突然我们的命名德尔友好的Jabber机器人停止工作,我发现的主要问题是服务器发送类似下面的平:

<iq from='capulet.lit' to='[email protected]/balcony' id='s2c1' type='get'> 
    <ping xmlns='urn:xmpp:ping'/> 
</iq> 

而且客户端应该这样回答:

http://xmpp.org/extensions/xep-0199.html#s2c

试图连接到山狮服务器的邮件服务器时,这发生在我身上

<iq from='[email protected]/balcony' to='capulet.lit' id='s2c1' type='result'/> 

更多信息(PE其他服务器也有相同的要求)。

一个朋友找到了一个简单的方法来解决这个问题:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'xmpp4r' 
require 'xmpp4r/roster' 
require 'xmpp4r/client' 
require 'xmpp4r/muc' 

Jabber::debug = true 
client = Jabber::Client.new(Jabber::JID.new('[email protected]')) 
client.connect 
client.auth('password') 
muc = Jabber::MUC::MUCClient.new(client) 
muc.join(Jabber::JID::new('[email protected]' + client.jid.node)) 

# add the callback to respond to server ping 
client.add_iq_callback do |iq_received| 
    if iq_received.type == :get 
    if iq_received.queryns.to_s != 'http://jabber.org/protocol/disco#info' 
     iq = Jabber::Iq.new(:result, client.jid.node) 
     iq.id = iq_received.id 
     iq.from = iq_received.to 
     iq.to = iq_received.from 
     client.send(iq) 
    end 
    end 
end 

我希望这个代码可以帮助一些人。

问候 爱德华