2015-07-28 37 views
2

我正在尝试使用Smack和ejabberd实现聊天消息应用程序。我得到下面的Packet参数输入我的filter_packet钩我的服务器上:了解ejabberd filter_packet挂钩参数

{{jid,<<"senderUserName">>,<<"domain.com">>,<<"Smack">>,<<"senderUserName">>,<<"domain.com">>,<<"Smack">>},{jid,<<"receiverUserName">>,<<"domain.com">>,<<>>,<<"receiverUserName">>,<<"domain.com">>,<<>>},{xmlel,<<"message">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<"[email protected]">>},{<<"id">>,<<"4Xd7d-13">>},{<<"type">>,<<"chat">>}],[{xmlel,<<"body">>,[],[{xmlcdata,<<"my message">>}]},{xmlel,<<"thread">>,[],[{xmlcdata,<<"25e5fc87-e57f-4046-9aef-30c569ab9160">>}]},{xmlel,<<"customTag">>,[],[{xmlcdata,<<"Custom extras">>}]}]}} 

这里是我的问题:

  1. 为什么我收到发送方和接收用户名两次?
  2. 如何获取Erlang中不同元组元素的值?

回答

2

ejabberd filter_packet挂钩参数是包含以下值的元组:{FromJID, ToJID, XMLPacket}

  • FromJID是一个#jid{}记录。
  • ToJID是#jid{}
  • XMLPacket是一个#xmlel{}记录,它是原始XMPP数据包的解析表示。

你的第一个问题是关于#jid{}记录结构(From和To)。内部记录不是直接使用,而是通过jlib.erl功能。但是,目前,该记录确实经过了优化,可避免在名称预配,节点预配用户名和域上进行额外处理和匹配。 namepreped/nodepreped值将作为原始未触及值的添加进行存储。如果处理的值等于原始值,那么您可能会觉得这是重复的。但是,如果您使用各种大小写和一些特殊的unicode字符,则会有所不同。

我想你的第二个问题是关于解析XML元素数据结构。要从#xmlel记录中提取和处理数据,可以提取记录的必需字段:名称,attrs和子级。

的记录被定义为:

-record(xmlel, { 
    name = <<"">> :: binary(), 
    attrs = [] :: [attr()], 
    children = [] :: [xmlel() | cdata()] }). 

您可以使用这些信息来趴下XML树,使用儿童名单。 您还可以在xml.erl模块中找到现成的帮助功能。