Ejabberd 插件開發 --- IQ截獲與處理

ejabberd的組件開發其實是非常簡單的,只要遵循其gen_mod規範,添加iq處理函數就可以了。下面一步步教大家如何開發ejabberd組件。

首先,最好是自己編譯ejabberd源碼,這樣的話把自己寫的組件直接放到ejabberd源碼目錄src中進行編譯即可,在我的博客http://blog.csdn.net/yangchen521/article/details/41970069中簡單介紹瞭如何在ubuntu中安裝ejabberd,主要是解決好依賴問題,使用apt-getinstall libssl-dev expat libexpat1-dev libyaml-0-2libyaml-dev git rebar安裝好ejabberd所需的依賴庫,剩下的纔是./configuremake make install。如果依賴問題處理不好,編譯ejabberd還是比較痛苦的。

編譯安裝完以後可以使用命令sudoejabberdctl live啓動ejabberd看是否會報錯。ubuntu下的用戶需要注意了,即便你在shellsuroot裏,啓動的時候也要帶上sudo,否則可能會報找不到配置文件的錯誤。ejabberd默認的beam安裝路徑是/lib/ejabberd/ebin,配置文件的目錄是/etc/ejabberd,一定要記住這兩個目錄,我們做插件開發的時候會用頻繁到這兩個目錄的。

現在開始寫我們的IQ處理插件吧。ejabberd規定所有的插件必須遵循gen_mod模式,gen_mod非常簡單,只需導出兩個函數start/2,stop/1即可,分別用於啓動和停止插件,函數形式如下:

其中Host是運行插件的虛擬主機名,Opts是我們在配置文件中爲插件設置的一些參數,這些參數可以通過ejabberd提供的API函數gen_mod:get_opt/3進行讀取。

寫完startstop函數,我們的插件就具備了基本的骨架,剩下的就是給他添磚加瓦,豐富功能了。在這裏,我們開發一個插件,用於解惑客戶端發向服務端的IQ

首先,我們寫一個處理IQ的函數,函數形式必須爲Function/3,三個參數依次是From,To,IQ,看名字就知道每個變量的含義了,不需多言。簡單的函數如下:

這個函數實現的功能非常簡單,就是受到IQ後,修改typeresult,然後添加<yangxiaodongxmlns=”im.test” age=”18” school=”nwpu”/>這樣一個節點到iq節點下。

處理IQ的函數寫好了,如何使他能夠解惑IQ呢,這時就需要調用ejabberdAPI向系統註冊這樣一個處理函數,調用方法如下:

參數Scope的取值有兩種,分別爲ejabberd_localejabberd_sm,他們有什麼區別呢,當取值ejabberd_local時,將只處理以服務端爲目標的IQ,即IQ裏的to填的是服務器的域名;當取值ejabberd_sm時,將處理客戶端之間交互的IQHost是服務端的域名,Namespace就是要處理的IQ的命名空間,Module,Function用於確定回掉函數的地址,IQDisc用於制定回掉函數的運行方式:no_queue,在當前線程裏處理,處理完返回;one_queue,開啓一個單獨線程去處理;{queues,N},開啓N個線程處理接受到的IQparallel,沒接收到一個IQ就開啓一個線程。一般用one_queue就可以了。

好了,IQ處理的函數已經寫好,也註冊進去了,接下來就是編譯和配置了。在ejabberd源碼目錄中(在14.07版本中,直接進入解壓目錄即可,不需進入src目錄)使用rebarcompile編譯,將生成的beam文件拷貝到/lib/ejabberd/ebin中,並且修改/etc/ejabberd/ejabberd.yml文件,添加我們開發的模塊,如下:

重啓ejabberd,我們使用PSI向服務端發IQ進行測試,OK,大功告成。

最後,附上完整源碼,供大家參考指正。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章