什么是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. CSS3 旋转的八卦图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 第二次作业第3题_JH

    3.完成小组的“四则运算”项目的需求文档(使用Markdown写文档),尝试同组成员在各自PC上修改同一文档后,如何使用Git命令完成GitHub上的文档的更新,而不产生冲突.并验证GitHub上的文 ...

  3. posix thread概述(示例代码)

    一个简单的alarm实例 errors.h头文件 #ifndef __ERRORS_H #define __ERORRS_H #include<stdio.h> #include<u ...

  4. [转]在64位的环境中使用VS建立Web项目进行Oracle连接需要注意WebDev是32位的

    本文转自:http://www.cnblogs.com/studyzy/archive/2010/10/28/1863056.html 我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但 ...

  5. 为ubuntu只带的network-manager添加latp/ipsec VPN

    sudo apt-add-repository ppa:seriy-pr/network-manager-l2tp sudo apt-get update sudo apt-get install n ...

  6. -bash: lampp: command not found解决方案

    在/opt目录下安装完lampp后,需要到/opt/lampp/下执行lampp启动或者停止服务,如果在其余目录下执行lampp,会提示:-bash: lampp: command not found ...

  7. HTML5 服务器发送事件

    单向传输:服务器端——>客户端   作用:传回的能每过3s重新刷新一遍.从而能过跟数据库同步,与ajax配合使用   一.客户端写法 必须的用 message 方法   JSON.parse() ...

  8. 页面javascript 和jquery 的一些用法

    confirm:提交之前的提示验证 if(confirm("确认是否提交?")){ alert("确认提交..."); } input按钮的禁用: $(&quo ...

  9. C#学习笔记3:提示“截断字符串或二进制数据”错误解决方法

    1.调试程序如出现“截断字符串或二进制数据”的关于数据库的错误,可以先试一试修改数据库中字符定义的长度. 2.使用ManualResetEvent前需导入 命名空间System.Threading; ...

  10. 几个linux命令

    常用linux命令: 普通用户命令: 一.文件和目录查看类命令 1. ls (常用参数 -l 和-h) 蓝颜色:表示目录 绿颜色:表示可执行文件 红颜色:表示压缩文件 白颜色:表示普通文件 青色:表示 ...