實用框架:
CoreBluetooth.framework(時下熱門)
可用于第三方藍牙設備交互,必須要支持藍牙4.0
硬件至少是4s魂迄,系統(tǒng)至少是iOS6
藍牙4.0以低功耗著稱粗截,一般也叫BLE(Bluetooth Low Energy)
目前應用比較多的案例:運動手壞、嵌入式設備捣炬、智能家居
Core Bluetooth測試比較麻煩熊昌,正常情況下,得至少有2臺真實的藍牙4.0設備
如何讓iOS模擬器也能測試藍牙4.0程序湿酸?
買一個CSR藍牙4.0 USB適配器婿屹,插在Mac上
在終端輸入sudo nvram bluetoothHostControllerSwitchBehavior="never"
重啟Mac
用Xcode 4.6調(diào)試代碼,將程序跑在iOS 6.1的模擬器上
(蘋果把iOS 7.0模擬器對BLE的支持移除掉了)
Core Bluetooth的核心結(jié)構(gòu)圖:
Core Bluetooth的基本常識:
每個藍牙4.0設備都是通過服務(Service)和特征(Characteristic)來展示自己的
一個設備必然包含一個或多個服務推溃,每個服務下面又包含若干個特征
特征是與外界交互的最小單位
比如說昂利,一臺藍牙4.0設備,用特征A來描述自己的出廠信息铁坎,用特征B來收發(fā)數(shù)據(jù)
服務和特征都是用UUID來唯一標識的蜂奸,通過UUID就能區(qū)別不同的服務和特征
設備里面各個服務(service)和特征(characteristic)的功能,均由藍牙設備硬件廠商提供硬萍,比如哪些是用來交互(讀寫)扩所,哪些可獲取模塊信息(只讀)等
Core Bluetooth的開發(fā)步驟:
建立中心設備
// 1.創(chuàng)建一個藍牙對象
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
掃描外設(Discover Peripheral):
// 2.進行檢索操作
// nil: 任意的外設
[self.manager scanForPeripheralsWithServices:nil options:nil];
連接外設(Connect Peripheral):
// 3.如果發(fā)現(xiàn)了藍牙設備,就會調(diào)用這個方法
(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;
{
// 4.連接外設(別的藍牙設備)
[self.manager connectPeripheral:peripheral options:0];
}
掃描外設中的服務和特征(Discover Services And Characteristics):
// 5.連接上某個設備后,調(diào)用這個方法-
(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
// 6.嘗試發(fā)現(xiàn)外設的某項服務
[peripheral discoverServices:nil];peripheral.delegate = self;
}
利用特征與外設做數(shù)據(jù)交互(Explore And Interact):
// 7.如果發(fā)現(xiàn)某一項服務,就調(diào)用這個方法
-
(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;
{
if (error) {return;
}
for (CBService *service in peripheral.services) {
if ([service.UUID.UUIDString isEqualToString:@"123"]) {
// 尋找所對應的特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
// 8.找到這個服務所組成的特征時,調(diào)用這個方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
NSLog(@"可以進行一些通訊操作.傳值操作");
}
// 如果藍牙的狀態(tài)改變的話,就會調(diào)用這個方法
// 這個方法一定要實現(xiàn),要不然會出錯.
- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
{
NSLog(@"藍牙的狀態(tài)改變了");
}
更多框架:
GameKit.framework(用法簡單)
只能用于iOS設備之間的連接,多用于游戲(比如五子棋對戰(zhàn))朴乖,從iOS7開始過期
MultipeerConnectivity.framework
只能用于iOS設備之間的連接祖屏,從iOS7開始引入,用于替代GameKit
ExternalAccessory.framework
可用于第三方藍牙設備交互买羞,但是藍牙設備必須經(jīng)過蘋果MFi認證(國內(nèi)較少)
簡單介紹GameKit:
使用GameKit框架袁勺,可以在游戲中增加對等連接,又稱對端連接或點對點連接畜普,Peer To Peer魁兼。
使用GameKit框架中的對等網(wǎng)絡連接API,可以在游戲玩家之間建立一個對等網(wǎng)絡漠嵌,并在游戲/應用實例之間交換數(shù)據(jù)咐汞。
GameKit框架可以使用藍牙在玩家之間創(chuàng)建網(wǎng)絡,玩家甚至不需要連接到互聯(lián)網(wǎng)儒鹿,就可以彼此對戰(zhàn)化撕。
通過藍牙實現(xiàn)對等網(wǎng)絡連接:
1.為玩家雙方呈現(xiàn)一個GKPeerPickerController,提供了一個標準的用戶界面連接兩臺設備
2.ViewControoler遵循GKPeerPickerControllerDelegate協(xié)議约炎,處理來自GKPeerPickerController(對端選擇器)的信息
3.建立連接后植阴,使用GKSession類可以向?qū)Χ嗽O備發(fā)送數(shù)據(jù)
4.在receiveData:fromPeer:inSession:context代理方法中編寫代碼來處理接收到的數(shù)據(jù)
GameKit的藍牙開發(fā)步驟:
顯示可以連接的藍牙設備列表
GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
ppc.delegate = self;
[ppc show];
在代理方法中監(jiān)控藍牙的連接
-(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
NSLog(@"連接到設備:%@", peerID);
// 關閉藍牙設備顯示界面
[picker dismiss];
// 設置接收到藍牙數(shù)據(jù)后的監(jiān)聽器
[session setDataReceiveHandler:self withContext:nil];
// 保存session
self.session = session;
}
處理接收到的藍牙數(shù)據(jù)
-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context {
}
利用GKSession給其他設備發(fā)送數(shù)據(jù)
給指定的連接設備發(fā)送數(shù)據(jù)
-(BOOL)sendData:(NSData)datatoPeers:(NSArray)peerswithDataMode:(GKSendDataMode)mode error:(NSError *)error;
給所有連接的設備發(fā)送數(shù)據(jù)
-(BOOL)sendDataToAllPeers:(NSData)datawithDataMode:(GKSendDataMode)mode error:(NSError **)error;
GameKit的藍牙開發(fā)注意:
只能用于iOS設備之間的連接
只能用于同一個應用程序之間的連接
最好別利用藍牙發(fā)送比較大的數(shù)據(jù)