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