ios Multipeer Connectivity通过wifi减慢图像传输

时间:2015-05-07 12:27:53

标签: ios ios7 data-transfer multipeer-connectivity

我有一个应用程序,我使用多个连接框架在多个设备(对等方)之间传输图像。我遇到的问题是传输的图像很慢。我想说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];
    }
}

我尝试过发送图片的消息和资源类型。资源比消息数据慢。

3 个答案:

答案 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)")
        }
    }
}