mac開發(fā)系列19:蘋果設(shè)備之間利用Multipeer Connectivity進(jìn)行數(shù)據(jù)傳輸

1、基本原理:

Multipeer Connectivity是一個框架,用于蘋果設(shè)備發(fā)現(xiàn)其他近場的蘋果設(shè)備,以及蘋果設(shè)備之間基于消息數(shù)據(jù),流數(shù)據(jù)和資源數(shù)據(jù)的通信。對于iOS設(shè)備,底層數(shù)據(jù)傳輸是利用日常的WiFi網(wǎng)絡(luò),點對點wifi(也叫直連wifi,即不需要走路由器)和藍(lán)牙;對于macOS和tvOS設(shè)備,則是利用日常wifi,點對點wifi以及以太網(wǎng)。

2、代碼實現(xiàn):

1)利用設(shè)備名初始化設(shè)備的peer id:

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

2)一個peer廣播(advertise)自己的信息給近場的其他peer:

// discoveryInfo: 標(biāo)識廣播peer的身份,用于被其他peer發(fā)現(xiàn)時,進(jìn)行校驗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];

創(chuàng)建連接session,并邀請廣播peer加入連接session:

// 找到一個廣播peer- (void)browser:(MCNearbyServiceBrowser *)browser
foundPeer:(MCPeerID *)peerID
withDiscoveryInfo:(nullable NSDictionary<NSString *, NSString *> *)info
{
if(info是所需廣播peer的discoveryInfo) {// 掃描peer用自己的peer id創(chuàng)建一個連接sessionm_clientSession = [[MCSession alloc] initWithPeer:m_localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone];m_clientSession.delegate = self; // 因為要使用MCSessionDelegate的方法// 設(shè)置context,以便廣播peer收到邀請時,進(jìn)行校驗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)監(jiān)聽連接session的狀態(tài)變化:

  • (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
    {// 校驗是否是目標(biāo)peerID if(peerID is targetPeerID)
    {
    switch(state)
    {
    case MCSessionStateConnecting:
    {
    // peer正在加入連接session
    }
    break; case MCSessionStateConnected:
    {
    // peer已經(jīng)加入連接session
    }
    break; case MCSessionStateNotConnected:
    {
    // peer沒有加入連接session
    }
    break; default: break;
    }
    }
    }

7)雙方peer成功加入連接會話后,進(jìn)行數(shù)據(jù)收發(fā):

// 向目標(biāo)peer發(fā)數(shù)據(jù)[session sendData:data toPeers:@[targetPeerID] withMode:MCSessionSendDataReliable error:&error];// 收到數(shù)據(jù)- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{ // 校驗是否是目標(biāo)peerID if(peerID is targetPeerID) { }}

備注:當(dāng)然,利用Multipeer Connectivity實現(xiàn)數(shù)據(jù)傳輸?shù)姆绞讲恢挂陨线@一種,詳情可以參考下面的官方文檔。

官方文檔鏈接:

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 了解: MultiPeerConnectivityMultipeer Connectivity Framework...
    李小六_閱讀 7,355評論 8 17
  • 前言# 什么是藍(lán)牙?#### 隨著藍(lán)牙低功耗技術(shù)BLE(Bluetooth Low Energy)的發(fā)展,藍(lán)牙技術(shù)...
    maybe_mylove閱讀 979評論 1 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,832評論 0 11
  • 雨落青磚濕人心, 風(fēng)撫翠發(fā)舞不停。 最是風(fēng)流浪蕩子, 戲得柳羞湖不平。 ——三月十三日天氣...
    夢之i閱讀 221評論 0 1