Erlang 创建自定义IQ模块

Erlang 创建自定义IQ模块,erlang,ejabberd,iq,Erlang,Ejabberd,Iq,我的示例模块是 -module(mod_iq_test). -behaviour(gen_mod). -export([start/2, init/2, stop/1, process_sm_iq/3 ]). -define(PROCNAME, ?MODULE). -include("ejabberd.hrl"). -include("jlib.hrl"). -include("logger.hrl"). -define(NS_

我的示例模块是

-module(mod_iq_test).
-behaviour(gen_mod).
-export([start/2,
         init/2,
         stop/1,
         process_sm_iq/3
    ]).

-define(PROCNAME, ?MODULE).

-include("ejabberd.hrl").
-include("jlib.hrl").
-include("logger.hrl").

-define(NS_TEST, <<"http://jabber.org/protocol/test">>).

start(Host, Opts) ->
    ?INFO_MSG("Loading module 'mod_iqtest' v.01", []),
    ok.

init(Host, _Opts) ->
    IQDisc = gen_mod:get_opt(iqdisc, _Opts, fun(A) -> A end, one_queue),
    gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_TEST, ?MODULE, process_sm_iq, IQDisc),
    ?INFO_MSG("added iq handlers 'mod_iqtest' v.01", []),
    ok.

stop(Host) ->
    gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_TEST),
    ?INFO_MSG("Stoping module 'mod_iqtest' ", []),
    ok.

process_sm_iq(_From, _To, IQ) ->
    ?INFO_MSG("Processing IQ Get query:~n ~p", [IQ]),
    IQ#iq{type = result, sub_el = [{xmlel, <<"value">>, [], [{xmlcdata, <<"Hello World of Testing.">>}]}]}.
-模块(模块iq测试)。
-行为(gen_mod)。
-导出([start/2,
init/2,
停止/1,
过程管理智商/3
]).
-定义(PROCNAME,?模块)。
-包括(“ejabberd.hrl”)。
-包括(“jlib.hrl”)。
-包括(“logger.hrl”)。
-定义(NS_测试,)。
开始(主机,选项)->
?信息信息(“加载模块‘mod_iqtest’v.01’,[]),
好啊
初始化(主机,选择)->
IQDisc=gen_mod:get_opt(IQDisc,_Opts,fun(A)->结束,一个队列),
发电机iq处理器:添加iq处理器(ejabberd sm、主机、NS测试、模块、进程sm iq、IQDisc),
?信息信息(“添加iq处理程序'mod_iqtest'v.01',[]),
好啊
停止(主机)->
gen_iq_处理程序:移除iq_处理程序(ejabberd_sm、主机、NS_测试),
?信息信息(“停止模块'mod_iqtest'”,[]),
好啊
处理智商(从、到、智商)->
信息信息(“处理IQ Get查询:~n~p,[IQ]),
IQ{type=result,sub_el=[{xmlel,[],[{xmlcata,}]}。
在发送IQ的同时

<iq type='get'>
  <query xmlns='http://jabber.org/protocol/test'/>
</iq>
<r xmlns="urn:xmpp:sm:3"/>

它抛出了一个错误

<iq type="error">
  <query xmlns="http://jabber.org/protocol/test"/>
<error code="400" type="modify">
<bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
<text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" xml:lang="en">Missing attribute 'id' in tag &lt;iq/&gt; qualified by namespace 'jabber:client'</text>
</error>
</iq>

标记iq/中缺少属性“id”,由命名空间“jabber:client”限定

尝试提供id属性,如错误响应中所述:

<iq type='get' id='aaa8821'>
  <query xmlns='http://jabber.org/protocol/test'/>
</iq>