MultipeerConnectivity应用-点对点连接
来源:互联网 发布:淘宝打猎气步枪价格 编辑:程序博客网 时间:2024/06/05 07:00
概况
MultipeerConnectivity是iOS7新出现的。MultipeerConnectivity可以通过 Wi-Fi 网络, 点对点的Wifi,蓝牙来近距离传输数据(这些数据可以 是 message-based,streaming data And resources (such as files))。
介绍
MCAdvertiserAssistant //可以接收,并处理用户请求连接的响应。没有回调,会弹出默认的提示框,并处理连接。MCNearbyServiceAdvertiser //可以接收,并处理用户请求连接的响应。但是,这个类会有回调,告知有用户要与您的设备连接,然后可以自定义提示框,以及自定义连接处理。MCNearbyServiceBrowser //用于搜索附近的用户,并可以对搜索到的用户发出邀请加入某个会话中。MCPeerID //这表明是一个用户MCSession //启用和管理Multipeer连接会话中的所有人之间的沟通。 通过Sesion,给别人发送数据。MCBrowserViewController //提供一个标准的用户界面,该界面允许用户进行选择附近的设备Peer来加入一个Session
注意: 根据serviceType 创建的对象,该serviceType命名规则:serviceType;//由ASCII字母、数字和“-”组成的短文本串,最多15个字符。通常,一个服务的名字应该由应用程序的名字开始,后边跟“-”和一个独特的描述符号。如果不符合,会报错的。
使用之前先检测所用设备的蓝牙是否开启
所在的类实现协议CBCentralManagerDelegate
@import CoreBluetooth;
self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ NSString *message ; switch (central.state) { case CBCentralManagerStateUnknown : message = @"CBCentralManagerStateUnknown"; break; case CBCentralManagerStateResetting : message = @"初始化中,请稍后……"; break; case CBCentralManagerStateUnsupported : message = @"设备不支持状态,过会请重试……"; break; case CBCentralManagerStateUnauthorized : message = @"设备未授权状态,过会请重试……"; break; case CBCentralManagerStatePoweredOff : message = @"尚未打开蓝牙,请在设置中打开……"; break; case CBCentralManagerStatePoweredOn : message = @"蓝牙已经成功开启,稍后……"; break; default: break; } NSLog(@"%@",message);}
使用方法
方法一:使用MCBrowserViewController
实现协议:MCBrowserViewControllerDelegate,MCSessionDelegate,MCAdvertiserAssistantDelegate
- 步骤1:创建Session
- (void)createSession{ // Create session related functionality. self.peerID = [[MCPeerID alloc]initWithDisplayName:self.displayName]; self.session = [[MCSession alloc]initWithPeer:[[MCPeerID alloc]initWithDisplayName:self.displayName] securityIdentity:nil encryptionPreference:MCEncryptionRequired]; self.session.delegate = self; _advertiserAssistant = [[MCAdvertiserAssistant alloc] initWithServiceType:self.serviceType discoveryInfo:nil session:_session]; _advertiserAssistant.delegate = self; // Start the assistant to begin advertising your peers availability [_advertiserAssistant start];}
- 步骤2 -点击搜索进行展示附近的设备:
- (void)browseForPeers:(id)sender{ MCBrowserViewController *browserViewController = [[MCBrowserViewController alloc] initWithServiceType:self.serviceType session:self.session]; browserViewController.delegate = self; browserViewController.minimumNumberOfPeers = kMCSessionMinimumNumberOfPeers; browserViewController.maximumNumberOfPeers = kMCSessionMaximumNumberOfPeers; [self presentViewController:browserViewController animated:YES completion:nil];}
- 步骤3 -检测Session 连接状态,MCSessionDelegate,如果连接上,就可以发送数据了。
#pragma mark MCAdvertiserAssistantDelegate-(void)advertiserAssistantDidDismissInvitation:(MCAdvertiserAssistant *)advertiserAssistant { NSLog(@"advertiserAssistantDidDismissInvitation : %@",advertiserAssistant);}- (void)advertiserAssistantWillPresentInvitation:(MCAdvertiserAssistant *)advertiserAssistant{ NSLog(@"advertiserAssistantWillPresentInvitation : %@",advertiserAssistant);}#pragma mark - MCBrowserViewControllerDelegate// Override this method to filter out peers based on application specific needs- (BOOL)browserViewController:(MCBrowserViewController *)browserViewController shouldPresentNearbyPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info{ NSLog(@"peerID :%@ withDiscoveryInfo : %@",peerID.displayName,info); return YES;}// Override this to know when the user has pressed the "done" button in the MCBrowserViewController- (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController{ [browserViewController dismissViewControllerAnimated:YES completion:nil];}// Override this to know when the user has pressed the "cancel" button in the MCBrowserViewController- (void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController{ [browserViewController dismissViewControllerAnimated:YES completion:nil];}#pragma mark - MCSessionDelegate -// Remote peer changed state- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{ NSLog(@"Remote Peer [%@] changed state to %@", peerID.displayName, [self stringForPeerConnectionState:state]); if (state == MCSessionStateNotConnected) { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Not Connected" message:nil delegate:nil cancelButtonTitle :@"我知道了" otherButtonTitles: nil]; [alert show]; }); }}// MCSession Delegate callback when receiving data from a peer in a given session - Received data from remote peer- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ // Decode the incoming data to a UTF8 encoded string NSString *receivedMessage = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding]; // Notify the delegate that we have received a new chunk of data from a peer [self receivedTranscript:receivedMessage];}// MCSession delegate callback when we start to receive a resource from a peer in a given session- (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress{ NSLog(@"Start receiving resource [%@] from peer %@ with progress [%@]", resourceName, peerID.displayName, progress); [self receivedTranscript:resourceName];}// MCSession delegate callback when a incoming resource transfer ends (possibly with error)- (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error{ // If error is not nil something went wrong if (error) { NSLog(@"Error [%@] receiving resource from peer %@ ", [error localizedDescription], peerID.displayName); } else { // No error so this is a completed transfer. The resources is located in a temporary location and should be copied to a permenant locatation immediately. // Write to documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *copyPath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0], resourceName]; if (![[NSFileManager defaultManager] copyItemAtPath:[localURL path] toPath:copyPath error:nil]) { NSLog(@"Error copying resource to documents directory"); } else { // Get a URL for the path we just copied the resource to // NSURL *imageUrl = [NSURL fileURLWithPath:copyPath]; } }}// Streaming API not utilized in this sample code- Received a byte stream from remote peer- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID{ NSLog(@"Received data over stream with name %@ from peer %@", streamName, peerID.displayName);}
- 步骤4 -发送数据
- (void)sendMessageTapped:(id)sender{ [self.messageComposeTextField resignFirstResponder]; NSError *err = nil; NSData *data = [self.messageComposeTextField.text dataUsingEncoding:NSUTF8StringEncoding]; [self.session sendData:data toPeers:self.session.connectedPeers withMode:MCSessionSendDataReliable error:&err]; if (err) { NSLog(@"sendData Error:%@",err); }}
- 步骤5 - MCSessionDelegate 见步骤3,可以检测的 收到数据,可以更新你收到的数据
- (void)receivedTranscript:(NSString *)adminMessage{ //收到消息更新UI一定要放在主线程 dispatch_async(dispatch_get_main_queue(), ^{ self.messageComposeTextField.text = adminMessage; });}
方法二:使用MCNearbyServiceBrowser
- 稍后更新
- 步骤2
1 0
- MultipeerConnectivity应用-点对点连接
- MultipeerConnectivity 点对点连接
- MultipeerConnectivity 点对点连接
- iOS点对点近场传输MultipeerConnectivity.framework
- MultipeerConnectivity连接蓝牙设备
- 为MultipeerConnectivity蓝牙连接写的demo
- iOS开发MultipeerConnectivity(多点连接)
- NFC 与点对点应用
- 关于MultipeerConnectivity
- MultipeerConnectivity(简介)
- 点对点
- 点对点UDP连接(UDP hole punching)
- WIFI之点对点连接的方法
- WebRTC 建立点对点连接(日志分析)
- WebRTC 之点对点连接——浏览器
- iOS和Android的点对点连接
- iOS和Android的点对点连接
- ActiveMQ发送消息,接受消息。点对点连接
- swift语法初探 -- 1
- MoneyJFrame
- Android 跨进程事件处理(一)——模拟点击、全局截屏
- AFNetworking2.0源码解析<三>
- java总结(之四)--类型信息
- MultipeerConnectivity应用-点对点连接
- mongodb主从复制
- 如何在linux中启动scala程序 以及 命令行中启动java程序
- Windows下Openocd使用方法:
- LoanJFrame
- 博客地址
- 2015.7.2
- 重构原则
- mybatis的分页机制