iOS7—Day by day—Day23:Multipeer Connectivity

这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点


Introducation – 介绍

在iOS7中介绍了一个全新的框架 MultipeerConnectivity。这个是代表这传统苹果中第一个困难问题:考虑到移动设备都有多种不同的无线电技术建成的,当然,他们应该能够相互通信而无需通过互联网发送数据。在过去就可以创建一个特别的wifi网络,在蓝牙或对设备,但这些选项提供了一个非常友好的方法。伴随MultipeerConnectivity框架的变化——设置网络脱离用户和开发人员,通过与技术无关的API,而通信发生。

框架在现实中无论技术具备——无论是蓝牙,或wifi,要么使用基础设施网络,或特别的网络如果设备不共享相同的网络。这是真正的,用户就可以选择它周围的设备希望连接到框架将处理所有的休息。甚至能够使用一个节点作为一个路由器2节点之间相互看不到mesh-network的方式。

在今天的帖子里,我们会通过代码的运行需要建立一个multipeer这样的网络,以及如何在设备之间发送数据。

本章的实例程序能够在github上面进行访问,访问地址:github.com/ShinobiControls/iOS7-day-by-day

Browsing for devices – 查找浏览设备

为了发送数据,有必要建立一个设备之间的连接,这是完成一个设备“浏览”适当的设备范围内。可以请求发送到这些设备之一,它将提醒用户,允许他们接受或拒绝连接。如果连接被接受,那么框架将建立链接,允许数据被转移。

有2种方法可以浏览本地设备——一个视觉的,和一个可编程的版本。我们只是去看看视觉的方法。

multipeer网络中的所有节点必须有一个ID——这是由MCPeerID类:

1
_peerID = [[MCPeerID alloc] initWithDisplayName:self.peerNameTextField.text];

在这里我们允许用户输入一个名称将用于识别用户试图收集装置。

MCSession对象是用来协调同事之间发送数据在该会话。我们首先创建一个,然后添加同行:

1
2
_session = [[MCSession alloc] initWithPeer:_peerID];
_session.delegate = self;

MCSession委托财产采用MCSessionDelegate协议。这包括方法监测同行改变状态(如断开),以及方法,对等网络中的启动时被调用的数据传输。

为了同伴添加到会话有ViewController子类提供了一个列表,本地设备的用户,并允许他们选择他们想建立一个连接。我们创建一个,然后将其归纳为一个模态视图控制器:

1
2
3
MCBrowserViewController *browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"shinobi-stream" session:_session];
browserVC.delegate = self;
[self presentViewController:browserVC animated:YES completion:NULL];

serviceType参数是一个字符串代表我们试图连接到的服务。这个字符串可以包含小写字母,数字和连字符,应该hi 类似于bonjour域。

我们再次分配委托——这一次采用MCBrowserViewControllerDelegate协议。有两个方法,我们需要为完成和实现——取消浏览器视图控制器。这里我们将把浏览器和启用按钮,如果我们成功:

1
2
3
4
5
6
7
8
9
10
11
12
#pragma mark - MCBrowserViewControllerDelegate methods
- (void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController
{
    [browserViewController dismissViewControllerAnimated:YES completion:NULL];
}

- (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController
{
    [browserViewController dismissViewControllerAnimated:YES completion:^{
        self.takePhotoButton.enabled = YES;
    }];
}

如果我们运行应用程序在这一点上我们可以输入一个同伴的名字,然后打开浏览器搜索其他设备。在这个阶段我们不没有其他设备实现广告的功能,所以我们不能连接到任何东西。这在下一节中,我们会执行下面的图片显示了连接过程,如果我们有一个设备连接,连接被接受:

  

Advertising avaiability – 广告可用性

广告通过MCAdvertiserAssistant类可用性成为可能,这既要负责管理网络层,并向用户呈现一个警告的让他们接受或拒绝传入的连接。

以同样的方式,我们需要一个会话和同行ID来浏览,我们需要他们的广告,所以我们允许用户指定一个字符串用作对等名称:

1
2
3
4
_peerID = [[MCPeerID alloc] initWithDisplayName:self.peerNameTextField.text];
_session = [[MCSession alloc] initWithPeer:_peerID];
_session.delegate = self;
_advertiserAssistant = [[MCAdvertiserAssistant alloc] initWithServiceType:@"shinobi-stream" discoveryInfo:nil session:_session];

我们使用相同的字符串serviceType参数是在浏览器中——这将使与适当的连接。      

最后,我们需要开始广告我们的可用性:

1
[_advertiserAssistant start];

如果我们现在启动浏览器在一个设备,然后广告商在另一个他们应该能够找到彼此。当设备出现在浏览器,用户水龙头,然后用广告设备用户将看到一个警告让他们选择是否连接:

Sending Data – 发送数据

有三个方法可以通过multipeer网络传输数据,我们建立了——一个NSData对象,一个NSStream或发送一个基于文件的资源。所有这三个共享一个共同的范式——MCSession对象发起这些转移的方法,然后在接收端将会话调用适当的代表方法。

例如,我们要拍照与一个设备,然后让它自动显示在屏幕上的其他设备。我们将使用NSData方法对于这个示例,但每个人的方法非常相似。

我们使用UIImagePickerController简单的照片

1
2
3
4
UIImagePickerController *imagePicker = [UIImagePickerController new];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
[self presentViewController:imagePicker animated:YES completion:NULL];

并实现以下委托方法获得预想的照片:

1
2
3
4
5
6
7
8
9
10
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *photo = info[UIImagePickerControllerOriginalImage];
    UIImage *smallerPhoto = [self rescaleImage:photo toSize:CGSizeMake(800, 600)];
    NSData *jpeg = UIImageJPEGRepresentation(smallerPhoto, 0.2);
    [self dismissViewControllerAnimated:YES completion:^{
        NSError *error = nil;
        [_session sendData:jpeg toPeers:[_session connectedPeers] withMode:MCSessionSendDataReliable error:&error];
    }];
}

我们感兴趣的是MCSession对象调用sendData:toPeers:withMode:error:方法。这可以采取一个NSDataobject网络中并将其发送到其他同行。在这里我们选择寄给所有的同事网络。模式允许您选择要传输的数据是否可靠。如果您选择可靠然后肯定会到达的消息,将会以正确的顺序,但将有一个更高的时间开销。使用不可靠的模式意味着一些消息可能会丢失,但延误将会小得多。

接受其他设备上的数据我们只是为正确的代表提供一个适当的实现方法:

1
2
3
4
5
6
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
{
    UIImage *image = [UIImage imageWithData:data];
    self.imageView.image = image;
    self.imageView.contentScaleFactor = UIViewContentModeScaleAspectFill;
}

在这里我们简单地创建一个从NSData UIImage对象,然后设置UIImageView的形象。以下图片显示这张照片上一个设备,然后显示在另一个问题:

 

流和资源API几乎以相同的方式工作,虽然资源API提供了异步更新进展,因此更适用于大型数据传输。

Conclusion – 总结

MultipeerConnectivity框架非常强大,是类似的概念抽象的技术细节的开发人员。很明显,出现的新的空投功能iOS7是建立在这个框架,非常的冰山一角的可以使用这个框架构建。想象一个iBeacon,当你靠近它时,不仅会通知你的,然后给你发送信息不使用互联网。也许你可以多角度的视频到你的设备在一个体育赛事,但只有如果你在会场?我等不及要看别人怎么构建!

本文翻译自:iOS7 Day-by-Day :: Day 23 :: Multipeer Connectivity

 2014-01-26 Sun  iOS7iOS7 Day-by-Day翻译

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值