我有一个应用程序,我使用多个连接框架在多个设备(对等方)之间传输图像。我遇到的问题是传输的图像很慢。我想说500kb图像需要大约2秒才能发送给同行。
以下是我的应用架构
我有多个设备通过wifi连接到彼此(没有任何路由器。请注意,设备没有连接到任何外部网络。我只是打开wifi并且不将它连接到任何网络。)我不是确定为什么,但我必须在所有设备上启动蓝牙,以便由充当服务器并搜索其他对等连接的设备发现它们。当我将图像从服务器设备发送到对等设备时,图像传输速度非常慢。我认为图像应该通过wifi通道传输,我想应该是5 MB /秒的传输速度。我得到的是2秒内500 KB。请检查我用于多路连接的代码。
发送图片代码
-(void)sendImage
{
UIGraphicsBeginImageContextWithOptions(_imgSize, NO, 0.0);
[fullImage drawInRect:CGRectMake(0, 0, _imgSize.width, _imgSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *sendData = UIImageJPEGRepresentation(fullImage, 0.2);
NSLog(@"uiimage IMAGE data:- %lu",(unsigned long)sendData.length);
NSArray *allPeers = appDelegate.mcManager.mySession.connectedPeers;
NSString *strDeviceInfo=appDelegate.mcManager.mySession.description;
NSLog(@"%@",strDeviceInfo);
NSError *error;
if(allPeers.count<=0)
{
[self.imgView setImage:fullImage];
}
else
{
[appDelegate.mcManager.mySession sendData:sendData toPeers:allPeers withMode:MCSessionSendDataReliable error:&error];
if (error)
{
NSLog(@"%@", [error localizedDescription]);
}
}
//imgView.layer.contentsRect=_myFrame;
imgView.image=fullImage;
imgView.backgroundColor=[UIColor darkGrayColor];
imgView.contentMode = UIViewContentModeScaleAspectFit;
}
接收图片代码
-(void)didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
{
NSDictionary *dict = @{@"data": data,@"peerID": peerID};
if([strPerform isEqualToString:@"orientation"])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveContentSize" object:data userInfo:dict];
[clientViewObj receivedContentSize:data];
}
else if ([strPerform isEqualToString:@"image"])
{
dispatch_async(dispatch_get_main_queue(), ^(void)
{
UIImage *image = [UIImage imageWithData:data];
clientViewObj.imgView.image = image;
//[clientViewObj ReceivedData:data];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveDataNotification" object:data userInfo:dict];
});
}
else if ([strPerform isEqualToString:@"pinch"])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceivePinch" object:data userInfo:dict];
[clientViewObj pinched:data];
}
else if ([strPerform isEqualToString:@"change"])
{
NSDictionary *dict = @{@"data": data,@"peerID": peerID};
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidChangeProcess" object:data userInfo:dict];
}
else if([strPerform isEqualToString:@"client"])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidChangeServer" object:data userInfo:dict];
//[_orientationViewObj receiveFromClient];
}
else if([strPerform isEqualToString:@"up"])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidRotateImageUp" object:data userInfo:dict];
}
else if([strPerform isEqualToString:@"down"])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidRotateImageDown" object:data userInfo:dict];
}
}
我尝试过发送图片的消息和资源类型。资源比消息数据慢。
答案 0 :(得分:0)
在Multipeer Connectivity中,传输在蓝牙和WiFi之间进行。您不能保证任何数据传输方法,因此如果一个设备在WiFi网络上,传输方法将默认为蓝牙(慢速传输)。
答案 1 :(得分:0)
iOS 8上的Wifi似乎要慢得多。
今天我实现了两个一起通信的应用程序。一个通过Multipeer Connectivity会话流(NSOutputStream / NSInputStream)将Core Motion数据发送到另一个。
在任一设备上禁用Wifi时,它都会依赖蓝牙。频率是Core Motion硬件每秒50个陀螺动作对象,连接的设备每秒接收50个值。
在Wifi上,它很慢,可能是4-5倍?相同的代码。不知道为什么。它默认为Wifi,所以如果两个设备都启用它,它似乎首先尝试。
我明天要安装iOS 9测试版,看看他们是否解决了这个问题。
答案 2 :(得分:0)
这是一个古老的问题,但是由于我只是处理相同的问题,所以我认为我的经验可能会对其他人有所帮助。
就我而言,使用流而不是sendData方法发送图像的速度大约是以前的两倍。 (仍然请注意我想要的速度,但这是一笔可观的收益)。
发送功能
BEGIN
--add 200rs
--add 100rs
--substract 50rs
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
接收功能
func sendImage(imageURL: URL) {
DispatchQueue.main.async {
do {
try self.mcSession.startStream(withName: "Image", toPeer: self.mcSession.connectedPeers[0])
self.mcSession.sendResource(at: imageURL, withName: fileName, toPeer: self.mcSession.connectedPeers[0], withCompletionHandler: nil)
}
catch let error {
print("error: \(error)")
}
}
}