MultipeerConnectivity拓展
從上一篇博客我們對MultipeerConnectivity的開發,以及藍牙4.0都有了一定的基礎認識。藍牙4.0因爲傳輸速度的原因,所以做了一點便擱置了,主要嘗試的是MultipeerConnectivity的開發,對MultipeerConnectivity簡單做下總結。
MultipeerConnectivity信息交互流程
- a設備發送廣播,並在廣播中標記了特定的服務。
- b設備搜索附近中有相同特定服務的廣播,然後發送連接請求。
- a設備收到b發送過來的請求,同意之後,會把b的一些基本信息保存在a中的會話session中
- b也會保存一些a的必要信息在b的會話session中,也就是說a和b都有自己連接的藍牙的session信息,兩個session是獨立存在的
- a或b發送信息時選擇自己session中連接的藍牙peerID,進行發送,另外一端在時刻監聽着會話代理
- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
中是否有接收數據。
自定義MultipeerConnectivity的Demo概要
利用系統自帶的廣播搜索連接,無法自定義搜索到的UI界面,而且對於連接請求需要手動點擊確認。蘋果sdk有提供自定義方法,sdk內容不多,可以自行查看。MultipeerConnectivitySDK
如截圖所示,現在我們就來做一個自動搜索附近藍牙設備,並自動連接的demo,可實現消息發送給指定的人。從sdk可知,若想實現自動連接附近藍牙或斷開需要用到MCNearbyServiceAdvertiser
和MCNearbyServiceBrowser
,關鍵內容如下:
- a設備既要發送廣播又要搜索廣播,即同時做以上a和b設備都要做的事,也就是說a類裏同時有發送廣播讓別人搜索到進行連接的session,也有搜索別人的廣播進行連接的session。兩個session互不干擾。
- 多個設備進行連接,將消息通過中間連接的藍牙中轉設備發送給指定的人。
- 根據接收到的不同消息類型進行不同的處理。demo效果如下
MultipeerConnectivity代碼詳解
代碼詳解,因爲這個博客工具還不太會用,所以暫且先用截圖來展示代碼,源代碼下載見最底部
初始化,你需要兩個會話session,一個用來保存自己連接的別人的廣播,一個用來保存別人連接了你的廣播。
點擊“開始”開啓廣播並同時搜索附近的廣播服務
當搜索到附近有對應的廣播時會調用代理進行連接
連接開始或斷開等,session的狀態會發生改變,調用代理
- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
因爲你在搜索附近廣播的同時也在向附近發送着廣播,所以一旦有附近的藍牙進行連接請求的時候會調用廣播代理- (void) advertiser:(MCNearbyServiceAdvertiser )advertiser didReceiveInvitationFromPeer:(MCPeerID )peerID
withContext:(nullable NSData *)context
這裏注意一個app的bug,當使用
MCNearbyServiceAdvertiser
時,一定要調用代理- (void) session:(MCSession *)session
didReceiveCertificate:(nullable NSArray *)certificate
fromPeer:(MCPeerID *)peerID
certificateHandler:(void (^)(BOOL accept))certificateHandler,在block中返回yes。
連接完成,發送數據就是比較簡單的了,用發送文字進行舉例,demo只進行了發送給全部的我正在連接的session中的所有設備,需要調試者可自行修改
發送文字
接收數據,需要特別注意
因爲消息的發送是異步,所以此方法沒有在主線程中,爲防止ui處理報錯,所以切換爲主線程!!!!!