【问题标题】:ios Multipeer Connectivity slow image transfer through wifiios Multipeer Connectivity 通过 wifi 传输缓慢的图像
【发布时间】:2015-07-18 00:39:52
【问题描述】:

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

我已经尝试了消息和资源类型来发送图像。资源比消息数据慢。

【问题讨论】:

  • 对于图像,最好使用 'sendData' 或 'sendResourceAtURL'?每篇nshipster.com/multipeer-connectivity 的文章我一直在使用 sendResourceAtURL。我也遇到了图像发送和接收速度非常慢的问题。

标签: ios ios7 data-transfer multipeer-connectivity


【解决方案1】:

在 Multipeer Connectivity 中,蓝牙和 WiFi 之间发生传输。您无法保证任何一种数据传输方式,因此如果一台设备在 WiFi 网络上,则传输方式将默认为蓝牙(慢速传输)。

【讨论】:

  • 感谢您的评论。我也有同样的怀疑。但是您是否认为有任何解决方法可以确保数据始终通过 wifi 传输。我的两个设备都打开了 wifi,但没有连接到任何网络或路由器。
  • Multipeer 并不适用于大数据传输,而是适用于轻度到低延迟的通信。
  • 我很幸运在本地网络中的每个设备上都关闭并重新打开了 wifi。看来您可以通过自组织 wifi 网络返回传输。
【解决方案2】:

iOS 8 上的 Wifi 似乎要慢得多。

今天我实现了两个可以一起通信的应用程序。一个通过 Multipeer Connectivity 会话流 (NSOutputStream/NSInputStream) 向另一个发送 Core Motion 数据。

在任一设备上禁用 Wifi 时,它都会在蓝牙上飞行。 Core Motion 硬件的频率为每秒 50 个陀螺运动对象,连接的设备每秒接收 50 个值。

在 Wifi 上非常慢,可能是 4-5 倍?相同的代码。不知道为什么。它默认为 Wifi,所以如果两个设备都启用它,它似乎会先尝试。

我明天要安装 iOS 9 测试版,看看他们是否解决了这个问题。

【讨论】:

    【解决方案3】:

    这是一个老问题,但由于我刚刚处理了同样的问题,我认为我的经验可能对其他人有所帮助。

    在我的例子中,使用流而不是 sendData 方法发送图像的速度大约是其两倍。 (仍然注意到我希望的一样快,但这是一个相当大的收益)。

    发送功能

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

    接收功能

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
        do {
            let localData = try Data(contentsOf: localURL!)
            let image = UIImage(data: localData)
            DispatchQueue.main.async {
                // DispatchQueue.main.async necessary because modifying UI
                self.imageView.image = image
            }
        }
        catch let error {
            print("error \(error)")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多