我为我想要接收的协议创建了一个自定义IQProvider类。提供程序eppears工作正常,因为自动响应不会发送回服务器有关未实现的消息类型。
这是我的提供者:
public class OA_IQProvider implements IQProvider{
public static final String NAMESPACE = "connect.logitech.com";
public static final String ELEMENT_NAME = "oa";
public static final String result = "RESULT";
private Map<String, String> list = new HashMap<String, String>();
@Override
public IQ parseIQ(XmlPullParser parser) throws Exception
{
boolean stop = false;
String name = parser.getName();
while(false == stop)
{
switch (parser.getEventType())
{
case XmlPullParser.START_TAG:
{
if(ELEMENT_NAME.equals(name))
{
list.put(result, parser.getText());
}
break;
}
case XmlPullParser.END_TAG:
{
stop = ELEMENT_NAME.equals(name);
break;
}
}
}
name = null;
return new OA_IQ(list);
}
}
public class OA_IQ extends IQ
{
public static final String ID = "servertime";
private Map<String, String> list;
public OA_IQ(Map<String, String> l)
{
list = l;
}
@Override
public String getChildElementXML()
{
return null;
}
public String getResult()
{
return list.get(OA_IQProvider.result);
}
}
在我的主要活动中,我添加了此提供程序:
ProviderManager.getInstance().addIQProvider(OA_IQProvider.ELEMENT_NAME, OA_IQProvider.NAMESPACE, new OA_IQProvider());
我已经实现了以下PacketListener:
conn2.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet p) {
Log.d(TAG, p.toXML());
}
}, new PacketTypeFilter(Packet.class));
我还尝试了各种其他过滤器,例如IQFilters。 在调试日志中,我收到消息:
08-01 23:13:45.188 22174-23246/com.xxx.testingapp D/SMACK﹕ 11:13:45 PM RCV (1105212208): <iq id="v3" to="guest" type="get"><oa xmlns='connect.logitech.com' mime='vnd.logitech.connect/vnd.logitech.pair' errorcode='200' errorstring='OK'><![CDATA[serverIdentity=xxx:hubId=97:identity=xxx:status=succeeded:protocolVersion={XMPP="1.0", HTTP="1.0", RF="1.0"}:hubProfiles={Harmony="2.0"}:productId=Pimento:friendlyName=xxx]]></oa></iq>
我想要完成的是从服务器响应中获取身份。我已经尝试查看调试源代码,因为基本上我要完成的是调试功能已经完成的内容。但我无法找到解析PM RCV的位置。
也许我的问题是PacketListener没有捕获PM RCV?