利用Multipeer Connectivity框架进行WiFi传输-b
什么是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的更多相关文章
- 利用Multipeer Connectivity框架进行WiFi传输
什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框 ...
- iOS 7 与 Xamarin - MultiPeer Connectivity(转载)
随着时代的改变,移动设备在生活工作都开始取代原有的pc.设备间的数据交互就成为了必备可少的功能.比较成熟的产品有NFC.这个啪啪的操作很流行,例如分享图片,分享文件等 .但是在iOS设备中还没有NFC ...
- Git学习:利用Git和TortoiseGit把代码传输到网络服务器
版本控制这块,一直用SVN.感觉挺好用,比VSS要好用些.不过,近期在网上,又谈到时下很流行的Git.就想看看Git到底是何方神圣.趁着五一在家无事,就静下心来,简单研究一下. 当下,网络上提供的基于 ...
- 利用webBrowser获取框架内Html页面内容
原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...
- 利用layui前端框架实现对不同文件夹的多文件上传
利用layui前端框架实现对不同文件夹的多文件上传 问题场景: 普通的input标签实现多文件上传时,只能对同一个文件夹下的多个文件进行上传,如果要同时上传两个或多个文件夹下的文件,是无法实现的.这篇 ...
- 7 无线wifi传输视频开发
转载,侵删 7 无线wifi传输视频开发 MT7601的驱动源码提供了两种:AP模式和STA模式源码.此时我使用USB作为AP热点,电脑作为STA模式,并使用ORTP实现无线传输视频 7.1.AP模式 ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- python利用unittest测试框架组织测试用例的5种方法
利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...
- 利用 Dijit 组件框架打造丰富的用户界面
原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...
随机推荐
- WebSocket实时异步通信
WebSocket实时异步通信 [一]WebSocket简介 WebSocket是HTML5推出一个协议规范,用来B/S模式中服务器端和客户端之间进行实时异步通信. 众所周知,传统的HTTP协议中,服 ...
- 关于JFace的自定义对话框(Dialog类)
仅仅是使用MessageDialog,InputDialog等JFace中现成的对话框类是无法满足实际项目开发需要的. 很多时候都需要自己定制对话框,自定义对话框只要在Dialog类的基础上作扩展就行 ...
- 线程本地变量ThreadLocal
一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...
- ASP连接11种数据库的常用语法
1.Access数据库的DSN-less连接方法: 以下为引用的内容: set adocon=Server.Createobject("adodb.connection") ado ...
- Html5 Video 实现方案
来源:http://ask.dcloud.net.cn/article/569 源码下载 前言: 最近项目中需要用到html5 视频播放功能,于是稍微研究了解了下,遇到了很多坑,特此记录下. 一. H ...
- java程序执行顺序
原来自己一直都没弄明白Java程序的执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距 测试代码: 一个父类Animal 一个子类Dog 测试类Test 运行结果: 所以执行顺序是: 父类An ...
- Masonry 控件详解
1. Masonry的属性 @property (nonatomic,strong,readonly)MASConstraint *left; //左侧 @property(nonatomic,s ...
- iOS 9 适配需要注意的问题
iOS 9 适配需要注意的问题 1`网络适配_改用更安全的HTTPS iOS9把所有的http请求都改为https了:iOS9系统发送的网络请求将统一使用TLS 1.2 SSL.采用TLS 1.2 协 ...
- 【html】【15】特效篇--分页
下载参考: http://aspx.sc.chinaz.com/query.aspx?keyword=%E5%88%86%E9%A1%B5&classID=&page=1 实例: h ...
- Update files embedded inside CAB file.
References: https://community.flexerasoftware.com/showthread.php?182791-Replace-a-single-file-embedd ...