CoreBlueTooth簡介:
- 可用于第三方藍(lán)牙設(shè)備交互徐许,設(shè)備必須支持藍(lán)牙4.0
- iPhone的設(shè)備必須是4S或者更新
- iPad設(shè)備必須是iPad mini或者更新
- iOS的系統(tǒng)必須是iOS 6或者更新
- 藍(lán)牙4.0以
低功耗
著稱设凹,所以一般被稱為BLE(bluetooth low energy) - 應(yīng)用場景
- 運(yùn)動手環(huán)
- 智能家居
- 拉卡拉藍(lán)牙刷卡器
核心概念
- CBCentralManager:中心設(shè)備(用來連接到外部設(shè)備的管家)
- CBPeripheralManager:外部設(shè)備(第三方的藍(lán)牙4.0設(shè)備)
開發(fā)步驟
- 建立中心管家
// 1. 創(chuàng)建中心管家,并且設(shè)置代理
self.cmgr = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
- 掃描外設(shè)(discover)
// 2. 在代理方法中掃描外部設(shè)備
/**
* scanForPeripheralsWithServices :如果傳入指定的數(shù)組政基,那么就只會掃描數(shù)組中對應(yīng)ID的設(shè)備
* 如果傳入nil激捏,那么就是掃描所有可以發(fā)現(xiàn)的設(shè)備
* 掃描完外部設(shè)備就會通知CBCentralManager的代理
*/
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if ([central state] == CBCentralManagerStatePoweredOn) {
[self.cmgr scanForPeripheralsWithServices:nil options:nil];
}
}
/**
* 發(fā)現(xiàn)外部設(shè)備,每發(fā)現(xiàn)一個(gè)就會調(diào)用這個(gè)方法
* 所以可以使用一個(gè)數(shù)組來存儲每次掃描完成的數(shù)組
*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
// 有可能會導(dǎo)致重復(fù)添加掃描到的外設(shè)
// 所以需要先判斷數(shù)組中是否包含這個(gè)外設(shè)
if(![self.peripherals containsObject:peripheral]){
[self.peripherals addObject:peripheral];
}
}
- 連接外設(shè)
/**
* 模擬開始連接方法
*/
- (void)start
{
// 3. 連接外設(shè)
for (CBPeripheral *ppl in self.peripherals) {
// 掃描外設(shè)的服務(wù)
// 這個(gè)操作應(yīng)該交給外設(shè)的代理方法來做
// 設(shè)置代理
ppl.delegate = self;
[self.cmgr connectPeripheral:ppl options:nil];
}
}
- 掃描外設(shè)中的服務(wù)和特征
-
服務(wù)和特征的關(guān)系
每個(gè)藍(lán)牙4.0的設(shè)備都是通過服務(wù)和特征來展示自己的矾削,一個(gè)設(shè)備必然包含一個(gè)或多個(gè)服務(wù)肩刃,每個(gè)服務(wù)下面又包含若干個(gè)特征。
-
/**
* 連接外設(shè)成功調(diào)用
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
// 查找外設(shè)服務(wù)
[peripheral discoverServices:nil];
}
/**
* 發(fā)現(xiàn)服務(wù)就會調(diào)用代理方法
*
* @param peripheral 外設(shè)
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
// 掃描到設(shè)備的所有服務(wù)
NSArray *services = peripheral.services;
// 根據(jù)服務(wù)再次掃描每個(gè)服務(wù)對應(yīng)的特征
for (CBService *ses in services) {
[peripheral discoverCharacteristics:nil forService:ses];
}
}
- 與外設(shè)做數(shù)據(jù)交互
- 在指定的特征下做相應(yīng)的操作
/**
* 發(fā)現(xiàn)服務(wù)對應(yīng)的特征
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
// 服務(wù)對應(yīng)的特征
NSArray *ctcs = service.characteristics;
// 遍歷所有的特征
for (CBCharacteristic *character in ctcs) {
// 根據(jù)特征的唯一標(biāo)示過濾
if ([character.UUID.UUIDString isEqualToString:@"XMG"]) {
NSLog(@"可以吃飯了");
}
}
}
- 斷開連接
/**
* 斷開連接
*/
- (void)stop
{
// 斷開所有連接上的外設(shè)
for (CBPeripheral *per in self.peripherals) {
[self.cmgr cancelPeripheralConnection:per];
}
}