iOS開發(fā) 藍(lán)牙藍(lán)牙

實用框架:
CoreBluetooth.framework(時下熱門)
可用于第三方藍(lán)牙設(shè)備交互,必須要支持藍(lán)牙4.0
硬件至少是4s,系統(tǒng)至少是iOS6
藍(lán)牙4.0以低功耗著稱,一般也叫BLE(Bluetooth Low Energy)
目前應(yīng)用比較多的案例:運(yùn)動手壞、嵌入式設(shè)備、智能家居

Core Bluetooth測試比較麻煩,正常情況下,得至少有2臺真實的藍(lán)牙4.0設(shè)備

如何讓iOS模擬器也能測試藍(lán)牙4.0程序?
買一個CSR藍(lán)牙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)圖:


6FB99117-C347-47FA-ADAB-A5560BA5E5C5.png

Core Bluetooth的基本常識:
每個藍(lán)牙4.0設(shè)備都是通過服務(wù)(Service)和特征(Characteristic)來展示自己的
一個設(shè)備必然包含一個或多個服務(wù),每個服務(wù)下面又包含若干個特征

特征是與外界交互的最小單位
比如說,一臺藍(lán)牙4.0設(shè)備,用特征A來描述自己的出廠信息,用特征B來收發(fā)數(shù)據(jù)

服務(wù)和特征都是用UUID來唯一標(biāo)識的,通過UUID就能區(qū)別不同的服務(wù)和特征

設(shè)備里面各個服務(wù)(service)和特征(characteristic)的功能,均由藍(lán)牙設(shè)備硬件廠商提供,比如哪些是用來交互(讀寫),哪些可獲取模塊信息(只讀)等

Core Bluetooth的開發(fā)步驟:
建立中心設(shè)備
// 1.創(chuàng)建一個藍(lán)牙對象
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];

掃描外設(shè)(Discover Peripheral):
// 2.進(jìn)行檢索操作
// nil: 任意的外設(shè)
[self.manager scanForPeripheralsWithServices:nil options:nil];

連接外設(shè)(Connect Peripheral):
// 3.如果發(fā)現(xiàn)了藍(lán)牙設(shè)備,就會調(diào)用這個方法

  • (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;
    {
    // 4.連接外設(shè)(別的藍(lán)牙設(shè)備)
    [self.manager connectPeripheral:peripheral options:0];
    }
    掃描外設(shè)中的服務(wù)和特征(Discover Services And Characteristics):
    // 5.連接上某個設(shè)備后,調(diào)用這個方法

  • (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
    {
    // 6.嘗試發(fā)現(xiàn)外設(shè)的某項服務(wù)
    [peripheral discoverServices:nil];

    peripheral.delegate = self;
    }

利用特征與外設(shè)做數(shù)據(jù)交互(Explore And Interact):
// 7.如果發(fā)現(xiàn)某一項服務(wù),就調(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"]) {
// 尋找所對應(yīng)的特征
[peripheral discoverCharacteristics:nil forService:service];
}
}
}
// 8.找到這個服務(wù)所組成的特征時,調(diào)用這個方法

  • (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
    {
    NSLog(@"可以進(jìn)行一些通訊操作.傳值操作");
    }

// 如果藍(lán)牙的狀態(tài)改變的話,就會調(diào)用這個方法
// 這個方法一定要實現(xiàn),要不然會出錯.

  • (void)centralManagerDidUpdateState:(CBCentralManager *)central;
    {
    NSLog(@"藍(lán)牙的狀態(tài)改變了");
    }

更多框架:
GameKit.framework(用法簡單)
只能用于iOS設(shè)備之間的連接,多用于游戲(比如五子棋對戰(zhàn)),從iOS7開始過期

MultipeerConnectivity.framework
只能用于iOS設(shè)備之間的連接,從iOS7開始引入,用于替代GameKit

ExternalAccessory.framework
可用于第三方藍(lán)牙設(shè)備交互,但是藍(lán)牙設(shè)備必須經(jīng)過蘋果MFi認(rèn)證(國內(nèi)較少)

簡單介紹GameKit:
使用GameKit框架,可以在游戲中增加對等連接,又稱對端連接或點對點連接,Peer To Peer。
使用GameKit框架中的對等網(wǎng)絡(luò)連接API,可以在游戲玩家之間建立一個對等網(wǎng)絡(luò),并在游戲/應(yīng)用實例之間交換數(shù)據(jù)。
GameKit框架可以使用藍(lán)牙在玩家之間創(chuàng)建網(wǎng)絡(luò),玩家甚至不需要連接到互聯(lián)網(wǎng),就可以彼此對戰(zhàn)。

通過藍(lán)牙實現(xiàn)對等網(wǎng)絡(luò)連接:
1.為玩家雙方呈現(xiàn)一個GKPeerPickerController,提供了一個標(biāo)準(zhǔn)的用戶界面連接兩臺設(shè)備
2.ViewControoler遵循GKPeerPickerControllerDelegate協(xié)議,處理來自GKPeerPickerController(對端選擇器)的信息
3.建立連接后,使用GKSession類可以向?qū)Χ嗽O(shè)備發(fā)送數(shù)據(jù)
4.在receiveData:fromPeer:inSession:context代理方法中編寫代碼來處理接收到的數(shù)據(jù)

GameKit的藍(lán)牙開發(fā)步驟:

顯示可以連接的藍(lán)牙設(shè)備列表
GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
ppc.delegate = self;
[ppc show];

在代理方法中監(jiān)控藍(lán)牙的連接
-(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
NSLog(@"連接到設(shè)備:%@", peerID);
// 關(guān)閉藍(lán)牙設(shè)備顯示界面
[picker dismiss];
// 設(shè)置接收到藍(lán)牙數(shù)據(jù)后的監(jiān)聽器
[session setDataReceiveHandler:self withContext:nil];
// 保存session
self.session = session;
}

處理接收到的藍(lán)牙數(shù)據(jù)
-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context {

}

利用GKSession給其他設(shè)備發(fā)送數(shù)據(jù)
給指定的連接設(shè)備發(fā)送數(shù)據(jù)
-(BOOL)sendData:(NSData)datatoPeers:(NSArray)peerswithDataMode:(GKSendDataMode)mode error:(NSError *)error;
給所有連接的設(shè)備發(fā)送數(shù)據(jù)
-(BOOL)sendDataToAllPeers:(NSData
)datawithDataMode:(GKSendDataMode)mode error:(NSError **)error;

GameKit的藍(lán)牙開發(fā)注意:

只能用于iOS設(shè)備之間的連接

只能用于同一個應(yīng)用程序之間的連接

最好別利用藍(lán)牙發(fā)送比較大的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容