我正面临着使用XEP-0198流管理的问题。
基本上,我想在Android上启用这个消息丢弃问题,当互联网随机中断,服务器仍然有客户端在线。
为了解决这个问题,我想使用XEP-0198,它使用请求和确认过程。你可以找到更多的here。
基本上我使用sm:3来做这件事。问题是,当我设置
XMPPConnection.DEBUG_ENABLED=true;
我在日志中得到了sm:3,这是asmack内部的,但我无法通过连接上添加任何packetListner来获得它。
这是内部asmack debug打印的内容:
<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'/>
,以便我可以返回到现在收到的包的数量到服务器,以便服务器可以发送回我任何丢失的包。
我还通过添加以下代码为其配置了提供程序管理器:
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而不是数据包。我得到了here的帮助。
我也见过a git branch of asmack like this,但不能理解如何实现它。
如果您以任何方式使用任何库实现它,如chat secure,yaxim或任何其他android XMPP客户端,请提供帮助。
https://stackoverflow.com/questions/23222894
复制相似问题