【问题标题】:Android Smack4.1.1 XMPP FileTransfer Issue with IphoneAndroid Smack4.1.1 XMPP 文件传输问题与 Iphone
【发布时间】:2015-06-08 06:52:52
【问题描述】:

我们在新的 android 4.1.1 中实现了 FileTransfer 功能。 除了将文件传输到 iphone 客户端外,一切正常。协商时传输失败。

当使用 windows smack 客户端传输成功时,我们会收到以下日志。

D/SMACK(25089): SENT (0): <iq to='yeryes@192.168.100.239/QXmpp' id='tmfCy-335' type='set'><si xmlns='http://jabber.org/protocol/si' id='jsi_1094412687185521586' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="5_224724.jpg" size="630784" ><desc>normal</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq>

D/SMACK(25089): RECV (0): <iq from='yeryes@192.168.100.239/QXmpp' to='pgunjasfv@192.168.100.239/Tablet' id='tmfCy-335' type='result'><si xmlns='http://jabber.org/protocol/si' profile='http://jabber.org/protocol/si/profile/file-transfer'><feature xmlns='http://jabber.org/protocol/feature-neg'><x xmlns='jabber:x:data' type='submit'><field type='list-single' var='stream-method'><value>http://jabber.org/protocol/bytestreams</value></field></x></feature></si></iq>

D/SMACK(25089): SENT (0): <iq to='192.168.100.239' id='tmfCy-341' type='get'><query xmlns='http://jabber.org/protocol/disco#items'></query></iq>

D/SMACK(25089): SENT (0): <iq to='yeryes@192.168.100.239/QXmpp' id='tmfCy-353' type='set'><query xmlns='http://jabber.org/protocol/bytestreams' sid='jsi_1094412687185521586' mode='tcp'><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='192.168.100.133' port='7777'/><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='fe80::5cf8:a1ff:fe8b:b73b%p2p0' port='7777'/><streamhost jid='pgunjasfv@192.168.100.239/Tablet' host='fe80::5ef8:a1ff:fe8b:b73b%wlan0' port='7777'/><streamhost jid='proxy.192.168.100.239' host='192.168.100.239' port='7777'/></query></iq>

D/SMACK(25089): RECV (0): <iq from='yeryes@192.168.100.239/QXmpp' to='pgunjasfv@192.168.100.239/Tablet' id='tmfCy-353' type='result'><query xmlns='http://jabber.org/protocol/bytestreams' sid='jsi_1094412687185521586'><streamhost-used jid='pgunjasfv@192.168.100.239/Tablet'/></query></iq>

D/SMACK(25089): RECV (0): <iq from='192.168.100.239' to='pgunjasfv@192.168.100.239/Tablet' id='4072246770' type='get'><ping xmlns='urn:xmpp:ping'/></iq>

D/SMACK(25089): SENT (0): <iq to='192.168.100.239' id='4072246770' type='result'></iq>

当使用 iphone smack 客户端传输不成功时,我们会收到以下日志:

D/SMACK(25089): SENT (0): <iq to='iphone@192.168.100.239/iPad' id='tmfCy-441' type='set'><si xmlns='http://jabber.org/protocol/si' id='jsi_1968597579584741254' mime-type='image/jpeg' profile='http://jabber.org/protocol/si/profile/file-transfer'><file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="5_224724.jpg" size="630784" ><desc>normal</desc></file><feature xmlns="http://jabber.org/protocol/feature-neg"><x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'><option><value>http://jabber.org/protocol/bytestreams</value></option><option><value>http://jabber.org/protocol/ibb</value></option></field></x></feature></si></iq>

D/SMACK(25089): RECV (0): <iq from='iphone@192.168.100.239/iPad' to='pgunjasfv@192.168.100.239/Tablet' type='result' id='tmfCy-441'><si xmlns='http://jabber.org/protocol/si'><feature xmlns='http://jabber.org/protocol/feature-neg'><x xmlns='jabber:x:data' type='submit'><field var='stream-method'><value>http://jabber.org/protocol/bytestreams</value></field></x></feature></si></iq>


D/SMACK(25089): SENT (0): <iq to='iphone@192.168.100.239/iPad' id='tmfCy-443' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>

D/SMACK(25089): RECV (0): <iq from='iphone@192.168.100.239/iPad' to='pgunjasfv@192.168.100.239/Tablet' type='error' id='tmfCy-443'><query xmlns='http://jabber.org/protocol/disco#info'/><error type='cancel' code='501'><feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></iq>

通过比较日志,我觉得这是为 xmpp 登录连接设置错误代理的问题。

XMPP 登录代码:

ProxyInfo proxy = new ProxyInfo(null, loc_IP, 7777, null,null);

我真的很想这样用,

ProxyInfo proxy = new ProxyInfo(ProxyType.SOCKS5, loc_IP, 7777, null,null);

,但随后登录过程失败。

= XMPPTCPConnectionConfiguration.builder()
    .setProxyInfo(proxy)
    .setServiceName(loc_IP)
    .setHost(loc_IP)
    .setPort(XMPP_PORT)
    .setCompressionEnabled(false)
    .setDebuggerEnabled(true)
    .setCustomSSLContext(sslContext)
    .setSecurityMode(SecurityMode.ifpossible)
    .setHostnameVerifier(verifier)
    .setUsernameAndPassword(username, pwd)
    .setResource(resourcestring)
    .build();

文件传输启用服务代码:

    ServiceDiscoveryManager sdm=ServiceDiscoveryManager.getInstanceFor(main.login.connection);

    if (sdm == null) {
     sdm = ServiceDiscoveryManager.getInstanceFor(main.login.connection);
     sdm.addFeature("http://jabber.org/protocol/disco#info");
     sdm.addFeature("jabber:iq:privacy");
     sdm.removeFeature("http://jabber.org/protocol/ibb");
    }
		
    SmackConfiguration.DEBUG  = true;
		
    //   FileTransfer Service
        ProviderManager.addIQProvider("query",
				"http://jabber.org/protocol/bytestreams",new     BytestreamsProvider());

    ProviderManager.addIQProvider("query",
				"http://jabber.org/protocol/disco#items",new  DiscoverItemsProvider());

    ProviderManager.addIQProvider("query",
				"http://jabber.org/protocol/disco#info",new  DiscoverInfoProvider());

    ProviderManager.addIQProvider("si","http://jabber.org/protocol/si",new StreamInitiationProvider());

 
    fileTransferNegotiator =     FileTransferNegotiator.getInstanceFor(main.login.connection);
    fileTransferNegotiator.IBB_ONLY = false;

    fileTransferManager = FileTransferManager.getInstanceFor(main.login.connection);
    fileTransferManager.addFileTransferListener(fileTransferListener);

    fileTransferListener =new FileTransferListener() {

    @Override
     public void fileTransferRequest(FileTransferRequest request) {

	     IncomingFileTransfer inComingFileTransfer = request.accept();
     //followed by status handling code in a thread
				}
			};

【问题讨论】:

  • 你能解决这个问题吗?

标签: android xmpp smack


【解决方案1】:

以下设置帮助我实现了一对一的文件传输:

我们需要创建一个基于 Socks5 的文件传输监听器,这个问题发生在 iphone 和 android 之间进行文件传输时。

1) 由于文件传输是通过 WIFI 进行的,Android 包含所有类型的 ip:ipV4 + ipv6(如果在设备中可用),因此我们需要去除任何 ipv6 类型地址的默认代理设置或空白 0.0。 0.0 类型地址。 2)我们没有正确实现代理,需要实现socks5代理设置。

最后,这些是连接配置上的设置。

//XMPP Connection Setup
connConfig = XMPPTCPConnectionConfiguration
  .builder()
  .setServiceName(loc_IP)
  .setHost(loc_IP)
  .setPort(XMPP_PORT)
  .setCompressionEnabled(false)
  .setDebuggerEnabled(true)
  .setCustomSSLContext(sslContext)
  .setSecurityMode(SecurityMode.disabled)
  .setHostnameVerifier(verifier)
  .setUsernameAndPassword(nick_Name, password)
  .setResource(resourcestring)
  .build();

SmackConfiguration.setDefaultPacketReplyTimeout(50000);
Socks5Proxy.setLocalSocks5ProxyEnabled(false);
Socks5Proxy.setLocalSocks5ProxyPort(7777);

removeAbnormalIP();

SASLPlainMechanism saslPlainMechanism = new SASLPlainMechanism();
SASLAuthentication.registerSASLMechanism(saslPlainMechanism);


CXmppFileTransferManager xmppFileManager = main.getXMPPTransferManager();
xmppFileManager.serviceEnabledForXmppFileTransfer();

////////////////////////////////////////////////////////////////////////

private void removeAbnormalIP() {

WifiManager wifiManager = (WifiManager) main.currentContext.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();

Socks5Proxy mProxy = Socks5Proxy.getSocks5Proxy();
List<String> addresses = new ArrayList<String>();

if (wifiInfo != null) {
	int ipAddress = wifiInfo.getIpAddress();
	String strIPAddess = ((ipAddress >> 0) & 0xFF) + "."
			+ ((ipAddress >> 8) & 0xFF) + "."
			+ ((ipAddress >> 16) & 0xFF) + "."
			+ ((ipAddress >> 24) & 0xFF);

	// ignore "0.0.0.0"
	if (!strIPAddess.equals("0.0.0.0"))
		addresses.add(strIPAddess);

}
// set an ip in case there is a Wifi Connection
// otherwise addresses will be empty and local S5B proxy will not be
// used
mProxy.replaceLocalAddresses(addresses);
}

/////////////////////////////////////////////////////////////////////
XmppFileTransferManager Class:

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(main.login.connection);

if (sdm == null) {
  sdm = ServiceDiscoveryManager.getInstanceFor(main.login.connection);
  sdm.addFeature("http://jabber.org/protocol/disco#info");
  sdm.addFeature("jabber:iq:privacy");
  sdm.addFeature("jabber.org/protocol/si"); 
  sdm.removeFeature("http://jabber.org/protocol/ibb");

}
    		
SmackConfiguration.DEBUG  = true;
    		
    		
    	//   FileTransfer
ProviderManager.addIQProvider("query","http://jabber.org/protocol/bytestreams",new BytestreamsProvider());

ProviderManager.addIQProvider("query",
    "http://jabber.org/protocol/disco#items",new DiscoverItemsProvider());

ProviderManager.addIQProvider("si","http://jabber.org/protocol/si",new StreamInitiationProvider());
    		
ProviderManager.addIQProvider("x","jabber:x:roster", new RosterPacketProvider());
    		
fileTransferNegotiator=FileTransferNegotiator.getInstanceFor(main.login.connection);
fileTransferNegotiator.IBB_ONLY = false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2011-09-14
    • 2012-12-12
    • 2014-06-29
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多