什么是Multipeer Connectivity?

在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接)。利用Multipeer Connectivity框架,即使在没有连接到WiFi(WLAN)或移动网络(xG)的情况下,距离较近的Apple设备(iMac/iPad/iPhone)之间可基于蓝牙和WiFi(P2P WiFi)技术进行发现和连接实现近场通信。

Multipeer Connectivity扩充的功能与利用AirDrop传输文件非常类似,可以将其看作AirDrop不能直接使用的补偿,代价是需要自己实现。

本Demo主要用到4个类:
MCBrowserViewController:MCBrowserViewController继承自UIViewController,提供了基本的UI应用框架。

MCAdvertiserAssistant、MCAdvertiserAssistant为针对Advertiser封装的管理助手,主要处理广播信息。

MCSession:类似TCP链接中的socket。创建MCSession时,需指定自身MCPeerID,类似bind。

MCPeerID:类似sockaddr,用于标识连接的两端endpoint,通常是昵称或设备名称。

1、简单地建立一个界面,主要有连接和发送2个UIButton。

create_button.png

2、Multipeer Connectivity框架初始化这4个类。

#pragma mark - Wifi Sharing Methods-(void)setUpMultipeer {    //  Setup peer ID     self.myPeerID = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];    //  Setup session     self.mySession = [[MCSession alloc] initWithPeer:self.myPeerID];    self.mySession.delegate = self;    //  Setup BrowserViewController     self.browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"chat" session:self.mySession];    self.browserVC.delegate = self;    //  Setup Advertiser     self.advertiser = [[MCAdvertiserAssistant alloc] initWithServiceType:@"chat" discoveryInfo:nil session:self.mySession];     [self.advertiser start]; }  -(void)showBrowserVC {     [self presentViewController:self.browserVC animated:YES completion:nil]; }  -(void)dismissBrowserVC {     [self.browserVC dismissViewControllerAnimated:YES completion:^(void){         [self invokeAlertMethod:@"连接成功" Body:@"Both device connected successfully." Delegate:nil];     }]; }  -(void)stopWifiSharing:(BOOL)isClear {    if(isClear && self.mySession != nil){         [self.mySession disconnect];          [self.mySession setDelegate:nil];        self.mySession = nil;        self.browserVC = nil;     } }
 

3、MCBrowserViewController代理方法

#pragma marks MCBrowserViewControllerDelegate// 点击完成-(void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController {     [self dismissBrowserVC];     [marrReceiveData removeAllObjects]; }// 点击取消-(void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController {     [self dismissBrowserVC]; }
 

4、MCSession代理方法
主要处理发送方传递的文件或者信息

// Received data from remote peer- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {    NSLog(@"data receiveddddd : %lu",(unsigned long)data.length);    if (data.length > 0) {        if (data.length < 2) {             noOfDataSend++;            NSLog(@"noofdatasend : %zd",noOfDataSend);            NSLog(@"array count : %zd",marrFileData.count);            if (noOfDataSend < ([marrFileData count])) {                 [self.mySession sendData:[marrFileData objectAtIndex:noOfDataSend] toPeers:[self.mySession connectedPeers] withMode:MCSessionSendDataReliable error:nil];             }else {                 [self.mySession sendData:[@"File Transfer Done" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[self.mySession connectedPeers] withMode:MCSessionSendDataReliable error:nil];             }         } else {            if ([[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] isEqualToString:@"File Transfer Done"]) {                 [self appendFileData];             }else {                 [self.mySession sendData:[@"1" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[self.mySession connectedPeers] withMode:MCSessionSendDataReliable error:nil];                 [marrReceiveData addObject:data];             }         }     } }// Received a byte stream from remote peer- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID {    NSLog(@"did receive stream"); }// Start receiving a resource from remote peer- (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress {    NSLog(@"start receiving"); }// Finished receiving a resource from remote peer and saved the content in a temporary location - the app is responsible for moving the file to a permanent location within its sandbox- (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error {    NSLog(@"finish receiving resource"); }  -(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {    NSLog(@"change state : %zd",state); }

5、发送图片(此Demo只是简单地做了个收发图片的Demo,此框架可实现的功能当然不止这么简单。)

-(void)sendData {     [marrFileData removeAllObjects];    NSData *sendData = UIImagePNGRepresentation([UIImage imageNamed:@"test2.png"]);    NSUInteger length = [sendData length];    NSUInteger chunkSize = 100 * 1024;    NSUInteger offset = 0;    do {        NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;        NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[sendData bytes] + offset                                              length:thisChunkSize                                        freeWhenDone:NO];        NSLog(@"chunk length : %lu",(unsigned long)chunk.length);          [marrFileData addObject:[NSData dataWithData:chunk]];         offset += thisChunkSize;     } while (offset < length);      noOfdata = [marrFileData count];     noOfDataSend = 0;    if ([marrFileData count] > 0) {         [self.mySession sendData:[marrFileData objectAtIndex:noOfDataSend] toPeers:[self.mySession connectedPeers] withMode:MCSessionSendDataReliable error:nil];     } }  -(void)appendFileData {    NSMutableData *fileData = [NSMutableData data];    for (int i = 0; i < [marrReceiveData count]; i++) {         [fileData appendData:[marrReceiveData objectAtIndex:i]];     }      [fileData writeToFile:[NSString stringWithFormat:@"%@/Image.png", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]] atomically:YES];    UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:fileData], self, @selector(image:didFinishSavingWithError:contextInfo:), nil); }  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {    if (!error) {         [self invokeAlertMethod:@"发送成功" Body:@"图片已保存到手机相册" Delegate:nil];     } }

您可在Github上下载完整Demo: https://github.com/JanzTam/WiFiShareDemo。

利用Multipeer Connectivity框架进行WiFi传输-b的更多相关文章

  1. 利用Multipeer Connectivity框架进行WiFi传输

    什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框 ...

  2. iOS 7 与 Xamarin - MultiPeer Connectivity(转载)

    随着时代的改变,移动设备在生活工作都开始取代原有的pc.设备间的数据交互就成为了必备可少的功能.比较成熟的产品有NFC.这个啪啪的操作很流行,例如分享图片,分享文件等 .但是在iOS设备中还没有NFC ...

  3. Git学习:利用Git和TortoiseGit把代码传输到网络服务器

    版本控制这块,一直用SVN.感觉挺好用,比VSS要好用些.不过,近期在网上,又谈到时下很流行的Git.就想看看Git到底是何方神圣.趁着五一在家无事,就静下心来,简单研究一下. 当下,网络上提供的基于 ...

  4. 利用webBrowser获取框架内Html页面内容

    原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...

  5. 利用layui前端框架实现对不同文件夹的多文件上传

    利用layui前端框架实现对不同文件夹的多文件上传 问题场景: 普通的input标签实现多文件上传时,只能对同一个文件夹下的多个文件进行上传,如果要同时上传两个或多个文件夹下的文件,是无法实现的.这篇 ...

  6. 7 无线wifi传输视频开发

    转载,侵删 7 无线wifi传输视频开发 MT7601的驱动源码提供了两种:AP模式和STA模式源码.此时我使用USB作为AP热点,电脑作为STA模式,并使用ORTP实现无线传输视频 7.1.AP模式 ...

  7. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  8. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  9. 利用 Dijit 组件框架打造丰富的用户界面

    原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...

随机推荐

  1. jsp The requested resource (/demo10/loginBean) is not available.

    The requested resource (/demo10/loginBean) is not available. <?xml version="1.0" encodi ...

  2. centos find

    首先你要确定你的软件是什么方式安装?如果不确定,你可知道你的软件名字,用find查找一下在哪个目录find / -name softname

  3. php图片等比例缩放

    新建文件index.php,需要在统计目录下有个图片为q.jpg(可根据源码进行更改图片的名称) 源代码如下: <?php$filename="q.jpg"; $per=0. ...

  4. LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

    解决方法即 where后加 .Compile()

  5. Linux命令行程序和内建指令

    摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...

  6. android事件分发介绍

        Android事件分发 事件分发3个步骤 dispatchTouchEvent(event)派发 onInterceptTouchEvent(event)拦截 onTouchEvent(eve ...

  7. kettle中Get Data from XML , Jason Input , 文本文件输入 使用示例

    1.Get Data from XML xml文件内容: <head> <img id="1">菜||焦溜丸子||2013-03-28/image/0/00 ...

  8. php 文件缓存

    http://www.oschina.net/code/snippet_162279_6098 <?php class cache {       private static $_instan ...

  9. sql2008存储过程解密。

    今天有一个同事在做一个项目的时候,因为现在公司不跟某一家公司合作.有一些sql的存储过程是加密,现在想打开那些存储过程来解密.故查看了一些资料终于解密成功.步骤如下: 1.需要开始DAC连接. 1.1 ...

  10. SC命令---安装、开启、配置、关闭 cmd命令行和bat批处理操作windows服务

      一.cmd命令行---进行Windows服务操作 1.安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32s ...