启用streampipe理asmack android

我正在使用XEP-0198streampipe理面临一个问题。

基本上,我想要启用这个在Android上的消息丢失问题时,互联网随机disconect和服务器仍然有客户在线存在。

为了解决这个问题,我想使用XEP-0198,它使用请求和确认过程。 你可以在这里find更多。

基本上我用这个sm:3。 问题是,当我设置

XMPPConnection.DEBUG_ENABLED=true; 

我得到sm:3在asmack内部的日志,但我无法通过任何连接添加任何packetListner。

这是asmackdebugging打印的内容:

 <r xmlns='urn:xmpp:sm:3'/><message from='test1@pinmessage.com/Smack' to='test1@pinmessage.com' id='CQUe6-5'><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message><r xmlns='urn:xmpp:sm:3'/> 

这是我从packetFilter得到的:

 <message id="CQUe6-5" to="test1@pinmessage.com" from="test1@pinmessage.com/Smack"><received xmlns='urn:xmpp:receipts' id='CQUe6-4'/></message> 

我已经尝试了自定义数据包筛选器,通过查看聊天安全和yaxim的代码,但我没有得到如何获得这个<r xmlns='urn:xmpp:sm:3'/>在我的代码,以便我可以将收到的数据包的数量直接返回给服务器,这样服务器就可以将任何丢失的数据包发回给我。

我还通过添加下面的代码configuration提供商pipe理器:

  addSimplePacketExtension("sm", URN_SM_3); addSimplePacketExtension("r", URN_SM_3); addSimplePacketExtension("a", URN_SM_3); addSimplePacketExtension("enabled", URN_SM_3); addSimplePacketExtension("resumed", URN_SM_3); addSimplePacketExtension("failed", URN_SM_3); private static final String URN_SM_3 = "urn:xmpp:sm:3"; private static void addSimplePacketExtension(final String name, final String namespace) { Log.e("adding simple packet extension", namespace+"---"+name); ProviderManager.getInstance().addExtensionProvider(name, namespace, new PacketExtensionProvider() { public PacketExtension parseExtension(XmlPullParser parser) throws Exception { StreamHandlingPacket packet = new StreamHandlingPacket(name, namespace); Log.e("Stream ahndling packet ","------>"+packet.toXML()); int attributeCount = parser.getAttributeCount(); for (int i = 0 ; i < attributeCount ; i++) { packet.addAttribute(parser.getAttributeName(i), parser.getAttributeValue(i)); } return (PacketExtension) packet; } }); } static class StreamHandlingPacket extends Packet { private String name; private String namespace; Map<String, String> attributes; StreamHandlingPacket(String name, String namespace) { this.name = name; this.namespace = namespace; attributes = Collections.emptyMap(); } public void addAttribute(String name, String value) { if (attributes == Collections.EMPTY_MAP) attributes = new HashMap<String, String>(); attributes.put(name, value); } public String getAttribute(String name) { return attributes.get(name); } public String getNamespace() { return namespace; } public String getElementName() { return name; } public String toXML() { StringBuilder buf = new StringBuilder(); buf.append("<").append(getElementName()); // TODO Xmlns?? if (getNamespace() != null) { buf.append(" xmlns=\"").append(getNamespace()).append("\""); } for (String key : attributes.keySet()) { buf.append(" ").append(key).append("=\"").append(StringUtils.escapeForXML(attributes.get(key))).append("\""); } buf.append("/>"); Log.e("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&","&&&&&&&&&&&&&&&&&&&&&&&&&&&&=>"+buf.toString()); return buf.toString(); } } 

基本上我通过看到聊天安全的实现来得到这个想法,但它扩展了UnkownPacket而不是Packet。 我从这里得到了帮助。

我也看到了像这样的asmack的git分支,但是不能理解如何实现它。

请帮助,如果你已经以任何方式与像chat安全,yaxim或任何其他的android XMPP客户端的图书馆实施它。

我build议使用运行在Android上的Smack 4.1, 支持XEP-198streampipe理。

我无法为您提供解决scheme,因为我遇到了类似的问题,但是我可以从第二个链接告诉您,UnknownPacket扩展Packet AND实现了PacketExtension ,这就是为什么您必须在返回语句中将您的StreamHandlingPacket转换为(PacketExtension)你的parseExtension方法。

当你发送<enable xmlns='urn:xmpp:sm:3' etc> <enabled xmlns='urn:xmpp:sm:3' etc> ,你能够捕获XMPP服务器返回的<enabled xmlns='urn:xmpp:sm:3' etc> xml吗? 如果是这样,这将是你的问题的开始。

让我们知道怎么回事!

修正的asmack yaxim使用可以在这里find(创build者很友好的引导我,感谢Ge0rG!):

https://github.com/pfleidi/yaxim/tree/master/libs

一定要得到libidn。