我正在尝试使用来自android的asmack中的IQ发送自定义信息。
所以我使用下面的代码发送自定义IQ消息。
public void onClick(View arg0) {
CustomIQ req = new CustomIQ();
req.myData="Hello world";
req.setType(IQ.Type.GET);
req.setTo(Activity_title+Constants.DOMAIN);
MainActivity.connection.sendPacket(req);
Log.d(Constants.TAG, "xml value :"+req.toXML());
Log.d(Constants.TAG, "child element value :"+req.getChildElementXML());
Log.d(Constants.TAG, " custom IQ req sent");
以下是我的自定义IQ类实现:
import org.jivesoftware.smack.packet.IQ;
public class CustomIQ extends IQ {
String myData;
@Override
public String getChildElementXML() {
String request = "<query xmlns='myxmlns'>"
+ "<myData>"+ myData + "</myData>"
+ "</query>";
return request;
}
}
}
但是在发送自定义IQ之后,我将IQ监听器作为服务不可用而错误代码为503。
以下是对服务器的请求:
xml value :<iq id="BTn30-5" to="swathi@btp121374" type="get"><query xmlns='myxmlns'><myData>Hello world</myData></query></iq>
child element value :<query xmlns='myxmlns'><myData>Hello world</myData></query>
以下是服务器的响应:
xml value :<iq id="BTn30-5" to="ganesh@btp121374/Smack" from="swathi@btp121374" type="error"><query xmlns='myxmlns'><myData>Hello world</myData></query><error code="503" type="CANCEL"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
那么我从服务器获得服务不可用的原因是什么原因。
编辑:
我实现了IQProvider,如下所示
public class customIQProvider implements IQProvider{
@Override
public IQ parseIQ(XmlPullParser parser) throws Exception {
Log.d(Constants.TAG, "In custom IQ provider");
CustomIQ myIQ_ref = new CustomIQ();
int eventType = parser.next();
while(eventType == XmlPullParser.START_TAG){
switch(parser.getEventType()){
case XmlPullParser.START_TAG:
{
if(parser.getName().equals("myData")){
myIQ_ref.myData=(parser.nextText());
}
}
return myIQ_ref;
}
}
return null;
}
}
答案 0 :(得分:2)
我相信你在XMPP中违反了iq路由规则。如果您将iq节发送到&#34; swathi @ btp121374&#34;,您并不是要求将其路由到客户端,那么您要求btp121374服务器代表swathi @处理它btp121374。
鉴于发送JID的资源,我想你想发送给&#34; swathi @ btp121374 / Smack&#34;或类似的。将它发送到完整的JID(包括资源的JID)告诉服务器将其路由到客户端而不是自己处理它。
(请注意,presence,message和iq的路由规则不同 - 以上仅适用于iq)
答案 1 :(得分:0)
显然,服务器不知道如何处理新的命名空间,除非您也在服务器上实现它。您希望服务器对您的自定义元素做什么?
此外,通过连接字符串生成XML通常是个坏主意。如果myData
包含<
或任何其他需要转义的字符,则您的XML将无效。 Smack肯定有更好的方法来生成自定义数据。