藍牙設置
CoreBluetooth框架的核心其實是:peripheral和central,對應他們分別有一組相關的API和類
這兩組api粉筆對應不同的業務常見:左側叫中心模式,就是以你的app作爲中心,連接其他的外設的場景;而右側稱爲外設模式,使用`手機作爲外設`連接其他中心設備操作的場景
服務和特徵(service andcharacteristic)
* 每個設備都會有1個or多個服務
* 每個服務裏都會有1個or多個特徵
* 特徵就是具體鍵值對,提供數據的地方
* 每個特徵屬性分爲:讀,寫,通知等等
- 外設,服務,特徵的關係
BLE中心模式流程
- 1.建立中心角色
- 2.掃描外設(Discover Peripheral)
- 3.連接外設(Connect Peripheral)
- 4.掃描外設中的服務和特徵(Discover Services And Characteristics)
* 4.1 獲取外設的services
* 4.2 獲取外設的Characteristics,獲取characteristics的值,,獲取Characteristics的Descriptor和Descriptor的值
- 5.利用特徵與外設做數據交互(Explore And Interact)
- 6.訂閱Characteristic的通知
- 7.斷開連接(Disconnect)
BLE外設模式流程
- 1.啓動一個Peripheral管理對象
- 2.本地peripheral設置服務,特徵,描述,權限等等
- 3.peripheral發送廣告
- 4.設置處理訂閱,取消訂閱,讀characteristic,寫characteristic的代理方法
藍牙設備的狀態
- 1.待機狀態(standby):設備沒有傳輸和發送數據,並且沒有連接到任何外設
- 2.廣播狀態(Advertiser):週期性廣播狀態
- 3.掃描狀態(Scanner):主動搜索正在廣播的設備
- 4.發起鏈接狀態(Initiator):主動向掃描設備發起連接
- 5.主設備(Master):作爲主設備連接到其它設備.
- 6.從設備(Slave):作爲從設備鏈接到其它設備
藍牙設備的五種工作狀態
- 準備(Standby) - 廣播(Advertising)
- 監聽掃描(Scanning) - 發起連接(Initiating)
- 已連接(Connected)
牙和版本使用限制
- 藍牙2.0:越獄設備
- BLE:iOS6以上
- MFI認證設備:無限制
BLE測試
- 兩臺BLE設備
- 如何讓iOS模擬器也能測試BLE?
* 買一個CSR藍牙4.0 USB適配器,插在Mac上
* 在終端輸入sudo nvrambluetoothHostControllerSwitchBehavior="never"
* 重啓Mac
* 用Xcode4.6調試代碼,將程序跑在iOS6.1模擬器上
* 蘋果把iOS7.0模擬器對BLE的支持移除了
BLE中心模式流程-coding
BLE中心模式流程
- 1.建立中心角色
- 2.掃描外設(Discover Peripheral)
- 3.連接外設(Connect Peripheral)
- 4.掃描外設中的服務和特徵(Discover Services And Characteristics)
* 4.1 獲取外設的services
* 4.2 獲取外設的Characteristics,獲取characteristics的值,,獲取Characteristics、Descriptor和Descriptor的值
- 5.利用特徵與外設做數據交互(Explore And Interact)
- 6.訂閱Characteristic的通知
- 7.斷開連接(Disconnect)
- central模式用的都是左邊的類,而peripheral模式用的是右邊的類
peripheral模式的流程
- 1.引入CoreBluetooth框架,初始化peripheralManager
- 2.設置peripheralManager中的內容
- 3.開啓廣播advertising
- 4.對central的操作進行響應
- 4.1 讀characteristics請求
- 4.2 寫characteristics請求
- 4.4 訂閱和取消訂閱characteristics
-MFI:(make foriPhone/iPad/iTouch)專門爲蘋果設備製作的設備
- 支持MFI的設備開發使用此框架
iBeacon簡介
- iBeacon起源:蘋果在WWDC2013上正式推出了iBeacon,並且在iOS7設備商配置了該功能
- iBeacon應用:蘋果期望將其作爲一種技術標準,這個標準允許移動App(包括iOS和Android設備)監聽來自於iBeacon設備上的信號並作出響應.
- iBeacon設備:配備有BLE通信功能,並使用BLE向周圍發送自己特有的ID,移動設備上的App在接收到該ID後可以作出相應的反應.比如,我們在店鋪裏設置iBeacon發射器,便可以讓應用接收到信息並將這一信息通知給服務器,服務器向我們的App返回與該店鋪相關的產品或折扣信息.
- 本質上講,iBeacon技術允許App瞭解他們在某個局部範圍內的位置,並向用戶分發基於位置的超文本上下文內容.
MultipeerConnectivity
- 在iOS7中,引入了一個全新的框架——Multipeer Connectivity(多點連接)。
- 利用Multipeer Connectivity框架,即使在`沒有連接到WiFi(WLAN)或移動網絡(xG)`的情況下,距離較近的Apple設備(iMac/iPad/iPhone)之間可基於`藍牙和WiFi(P2P WiFi)`技術進行發現和連接實現近場通信。
- Multipeer Connectivity擴充的功能與利用AirDrop傳輸文件非常類似,可以將其看作AirDrop不能直接使用的補償,代價是需要自己實現。
- 手機不聯網也能跟附近的人聊得火熱的`FireChat`和`See You Around`等近場聊天App、近距離無網遙控交互拍照神器`拍咯App`就是基於Multipeer Connectivity框架實現。
- 相比AirDrop,Multipeer Connectivity在進行發現和會話時並不要求同時打開WiFi和藍牙,也不像AirDrop那樣強制打開這兩個開關,而是根據條件適時選擇使用藍牙或(和)WiFi。
- 粗略測試情況如下:
* 雙方WiFi和藍牙`都未打開`:無法發現。
* 雙方都開啓`藍牙`:通過藍牙發現和傳輸。
* 雙方都開啓`WiFi`:通過WiFi Direct發現和傳輸,速度接近AirDrop(Reliable速率稍低),不知道同一WLAN下是否優先走局域網?
* 雙方都`同時開啓了WiFi和藍牙`:應該是模擬AirDrop,通過低功耗藍牙技術掃描發現握手,然後通過WiFi Direct傳輸。
常用類
- MCPeerID
類似sockaddr,用於標識連接的兩端endpoint,通常是`暱稱或設備名稱`。該對象只開放了displayName屬性,私有MCPeerIDInternal對象持有的設備相關的_idString/_pid64字段並未公開
在許多情況下,客戶端同時廣播並發現同一個服務,這將導致一些混亂,尤其是在`client/server`模式中。所以,每一個服務都應有一個類型標示符——`serviceType,它是由ASCII字母、數字和“-”組成的短文本串,最多15個字符`。
-MCNearbyServiceAdvertiser
類似broadcaster,`可以接收,並處理用戶請求連接的響應。但是,這個類會有回調,告知有用戶要與您的設備連接,然後可以自定義提示框,以及自定義連接處理`。
主線程(com.apple.main-thread(serial))創建MCNearbyServiceAdvertiser並啓動startAdvertisingPeer。
MCNearbyServiceAdvertiserDelegate異步回調(didReceiveInvitationFromPeer)切換回主線程。
在主線程didReceiveInvitationFromPeer中創建MCSession並invitationHandler(YES,session)接受會話連接請求(accept參數爲YES)。
- MCNearbyServiceBrowser
類似servo listen+clientconnect,`用於搜索附近的用戶,並可以對搜索到的用戶發出邀請加入某個會話中`。
主線程(com.apple.main-thread(serial))創建MCNearbyServiceBrowser並啓動startBrowsingForPeers。
MCNearbyServiceBrowserDelegate異步回調(foundPeer/lostPeer)切換回主線程。
主線程創建MCSession並啓動invitePeer。
- MCSession
`啓用和管理Multipeer連接會話中的所有人之間的溝通。 通過Sesion,給別人發送數據`
注意,peerID並不具備設備識別屬性。
類似TCP鏈接中的socket。創建MCSession時,需指定自身MCPeerID,類似bind。
爲避免頻繁的會話數據通知阻塞主線程,MCSessionDelegate異步回調(didChangeState/didReceiveCertificate/didReceiveData/didReceiveStream)有一個專門的回調線程——com.apple.MCSession.callbackQueue(serial)。爲避免阻塞MCSeesion回調線程,最好新建數據讀(寫)線程!
-MCAdvertiserAssistant/MCBrowserViewController
`MCAdvertiserAssistant //可以接收,並處理用戶請求連接的響應。沒有回調,會彈出默認的提示框,並處理連接。`
`MCBrowserViewController彈出搜索框,需要手動modal`
MCAdvertiserAssistant爲針對Advertiser封裝的管理助手;MCBrowserViewController繼承自UIViewController,提供了基本的UI應用框架。
MCBrowser/MCAdvertiser的回調線程一般是delegate所在線程Queue:com.apple.main-thread(serial)。
iOS中的藍牙
概述:OS中提供了4個框架用於實現藍牙連接
- 1.GameKit.framework(用法簡單)
* `只能用於iOS設備之間的同個應用內連接`,多用於遊戲(eg.拳皇,棋牌類),從`iOS7開始過期`
-2.MultipeerConnectivity.framework(代替1)
* `只能用於iOS設備之間的連接,從iOS7開始引入`,主要用於`非聯網狀態`下,通過wifi或者藍牙進行文件共享(僅限於沙盒的文件),多用於附近無網聊天
- 3.ExternalAccessory.framework(MFi)
* `可用於第三方藍牙設備交互`,但是藍牙設備必須經過`蘋果MFi認證`(國內很少)
-4.CoreBluetooth.framework(時下熱門)
* `可用於第三方藍牙設備交互`,必須要支持藍牙4.0
* 硬件至少是4s,系統至少是iOS6
* 藍牙4.0以低功耗著稱,一般也叫BLE(Bluetooth Low Energy)
* 目前應用比較多的案例:運動手環,嵌入式設備,智能家居
設計到的系統/框架
- HealthKit/物聯網HomeKit/wathOS1,2/iBeacon