2011-06-06 49 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 

我希望這個代碼可以幫助一些人。

問候 愛德華