zoukankan      html  css  js  c++  java
  • iOS 蓝牙开发之(mutipeerConnectivity)

    蓝牙

    mutipeerConnectivity

    iOS7 引入的一个全新框架

    替代GameKit框架

    多用于文件传输

    iOS设备不联网也能给附近的人聊天

    搜索和传输的方式

    * 双方WIFI和蓝牙都没有打开:无法实现
    * 双方都开启蓝牙:通过蓝牙发现和传输
    * 双方都开启WIFI:通过WIFI Direct发现和传输,速度接近AirDrop
    * 双方同时开启了WIFI和蓝牙:模拟AirDrop,通过低功耗蓝牙技术扫描发现握手,然后通过WIFI Direct传输 

    示例代码

    步骤

    1.注册一个广播  告诉别人 我的设备是可以被发现的
    2.扫描蓝牙设备  需要实现代理方法
    3.使用一个MCSession对象  存储当前的会话  需要实现代理方法
    4.使用MCSession对象 发送和接收数据

    连接设备

    创建MCSession对象用于存放当前连接的会话

    //初始化会话 
    MCPeerID *peerId = [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];
    self.mySession
    = [[MCSession alloc] initWithPeer:peerId];

    开启广播对象,通知正在搜索的设备他们是可用的

    //设置可被发现
    - (IBAction)fount:(id)sender {
        UISwitch *s = (UISwitch *)sender;
        if (s.isOn) {
            //注册广告
            /*
             服务类型 可能一个app发送了多个广告 所以需要给广告绑定一个唯一标识
         session:当前会话
    */ _assistant = [[MCAdvertiserAssistant alloc]initWithServiceType:SERVICE_TYPE discoveryInfo:nil session:_mySession]; //开启广播 [_assistant start]; } }

    开始搜索蓝牙设备

    - (IBAction)lianjieshebei:(id)sender {
        //创建搜索蓝牙设备设备控制器
        MCBrowserViewController *browser = [[MCBrowserViewController alloc] initWithServiceType:SERVICE_TYPE session:_mySession];
        browser.delegate = self;
        [self presentViewController:browser animated:YES completion:nil];
    }

    连接以后选择数据发送

    - (IBAction)xuanzewenjian:(id)sender {
        UIImagePickerController *imagepicker = [[UIImagePickerController alloc] init];
        imagepicker.delegate = self;
        imagepicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        [self presentViewController:imagepicker animated:YES completion:nil];
    }
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
        self.imageView.image = info[UIImagePickerControllerOriginalImage];
        [picker dismissViewControllerAnimated:YES completion:nil];
    }

    在搜索控制器的连接完成代理方法中隐藏搜索设备控制器

    #pragma mark - 扫描设备的代理
    //发现设备以后可以通过代理方法来实现传送数据 扫描设备的代理
    //链接成功
    - (void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController{
        [browserViewController dismissViewControllerAnimated:YES completion:nil];
    }

    实现搜索控制器的代理方法,获取连接上的设备ID

    #pragma mark - MCBrowserViewControllerDelegate
    /**
     *  连接成功
     *
     *  @param browserViewController 搜索控制器
     *  @param peerID                连接上的设备ID
     *  @param info                  连接的信息
     *
     *  @return                      YES : 只发送连接上的用户
     */
    - (BOOL)browserViewController:(MCBrowserViewController *)browserViewController
          shouldPresentNearbyPeer:(MCPeerID *)peerID
                withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
    {
        self.peerID = peerID;
        NSLog(@"info == %@   peer = %@",info, peerID);
        return YES;
    }

    将选择好的文件发送到连接到的设备ID上

    - (IBAction)sendImage {
    
        // 判断是否有图片
        if (!self.showImage.image) return;
        
        // 获取图片
        UIImage *image = self.showImage.image;
        // 将图片转换成NSData类型
        NSData *data = UIImagePNGRepresentation(image);
        /**
         *  发送数据
         *  toPeers : 发给的设备ID的数组
         *  withMode: 发送模式,是否是安全模式
         */
        if (self.peerID != nil) {
            [self.mc_Session sendData:data toPeers:@[self.peerID] withMode:MCSessionSendDataUnreliable error:nil];
        }
    }

    接收数据

    #pragma mark MCSessionDelegate
    //接收到数据
    - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = [UIImage imageWithData:data];
        });
        
    }
    //必须实现的
    - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {
        
    }
  • 相关阅读:
    Django ajax 实现 loading 效果
    K8S service 简单介绍
    K8S Pod 生命周期 (二)
    异度之刃 Xenoblade 后感
    Nested Prefab Mode 嵌套预制体 保存问题 Dirty
    GIT速成
    Surface电池阈值
    如何删除通知栏无效图标(重置任务栏通知区域)
    Mouse For Winpad
    Re:LieF ~親愛なるあなたへ~ 后感
  • 原文地址:https://www.cnblogs.com/huanying2000/p/6559752.html
Copyright © 2011-2022 走看看