mac开发系列19:苹果设备之间利用Multipeer Connectivity进行数据传输

1、基本原理:

Multipeer Connectivity是一个框架,用于苹果设备发现其他近场的苹果设备,以及苹果设备之间基于消息数据,流数据和资源数据的通信。对于iOS设备,底层数据传输是利用日常的WiFi网络,点对点wifi(也叫直连wifi,即不需要走路由器)和蓝牙;对于macOS和tvOS设备,则是利用日常wifi,点对点wifi以及以太网。

2、代码实现:

1)利用设备名初始化设备的peer id:

m_localPeerID = [[MCPeerID alloc] initWithDisplayName:[[MMDevice currentDevice] GetDeviceName]];

2)一个peer广播(advertise)自己的信息给近场的其他peer:

// discoveryInfo: 标识广播peer的身份,用于被其他peer发现时,进行校验m_advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:m_localPeerID discoveryInfo:discoveryInfo serviceType:serviceType];
m_advertiser.delegate = self; // 因为要使用MCNearbyServiceAdvertiseDelegate的方法
[m_advertiser startAdvertisingPeer];

3)另一个peer扫描自己所需的peer:

m_browser = [[MCNearbyServiceBrowser alloc] initWithPeer:m_localPeerID serviceType:serviceType];
m_browser.delegate = self; // 因为要使用MCNearbyServiceBrowserDelegate的方法[m_browser startBrowsingForPeers];

创建连接session,并邀请广播peer加入连接session:

// 找到一个广播peer- (void)browser:(MCNearbyServiceBrowser *)browser
foundPeer:(MCPeerID *)peerID
withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
{
if(info是所需广播peer的discoveryInfo) {// 扫描peer用自己的peer id创建一个连接sessionm_clientSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];m_clientSession.delegate = self; // 因为要使用MCSessionDelegate的方法// 设置context,以便广播peer收到邀请时,进行校验context = 双方事先商定好的校验信息:answerInfo;// 邀请广播peer加入连接session [browser invitePeer:peerID toSession:m_clientSession withContext:context timeout:30];// 停止扫描[browser stopBrowsingForPeers];}
}

5)广播peer收到扫描peer的“加入连接session”邀请:

  • (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser
    didReceiveInvitationFromPeer:(MCPeerID *)peerID
    withContext:(NSData *)context
    invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler
    { if (context is 事先商定好的answerInfo) {// 初始化“连接session” m_serverSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];
    m_serverSession.delegate = self;
    // 接受邀请
    invitationHandler(true, m_serverSession);
    // 停止广播 [m_advertiser stopAdvertisingPeer];
    } else {
    invitationHandler(false, nil);
    }
    }

6)监听连接session的状态变化:

  • (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
    {// 校验是否是目标peerID if(peerID is targetPeerID)
    {
    switch(state)
    {
    case MCSessionStateConnecting:
    {
    // peer正在加入连接session
    }
    break; case MCSessionStateConnected:
    {
    // peer已经加入连接session
    }
    break; case MCSessionStateNotConnected:
    {
    // peer没有加入连接session
    }
    break; default: break;
    }
    }
    }

7)双方peer成功加入连接会话后,进行数据收发:

// 向目标peer发数据[session sendData:data toPeers:@[targetPeerID] withMode:MCSessionSendDataReliable error:&error];// 收到数据- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ // 校验是否是目标peerID if(peerID is targetPeerID) { }}

备注:当然,利用Multipeer Connectivity实现数据传输的方式不止以上这一种,详情可以参考下面的官方文档。

官方文档链接:

[https://developer.apple.com/reference/multipeerconnectivity

](https://developer.apple.com/reference/multipeerconnectivity)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 了解: MultiPeerConnectivityMultipeer Connectivity Framework...
    李小六_阅读 12,091评论 8 17
  • 前言# 什么是蓝牙?#### 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术...
    maybe_mylove阅读 4,547评论 1 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 一. Java基础部分.................................................
    wy_sure阅读 9,291评论 0 11
  • 雨落青砖湿人心, 风抚翠发舞不停。 最是风流浪荡子, 戏得柳羞湖不平。 ——三月十三日天气...
    梦之i阅读 1,688评论 0 1

友情链接更多精彩内容