近幾年,智能設備愈來愈火,這些智能設備中,有很大一部分是經過手機來控制硬件設備,來達到預期的效果,這中間少不了要使用到藍牙功能,經過藍牙來通訊來控制設備。編程
藍牙分爲藍牙2.0和藍牙4.0。 藍牙2.0爲傳統藍牙,傳統藍牙也稱爲經典藍牙。 藍牙4.0由於低耗電,因此也叫作低功耗藍(BLE),它將三種規格集一體,包括傳統藍牙技術、高速技術和低耗能技術。安全
這篇文章用來介紹BLE 4.0的使用以及相關問題的解決。bash
BLE的兩種模式分爲CBCentralMannager 中心模式 和CBPeripheralManager 外設模式,在這裏主要和你們分享CBCentralMannager 中心模式的開發和使用。微信
以手機(app)做爲中心,鏈接其餘外設的場景。詳細流程以下:app
使用手機做爲外設鏈接其餘中心設備操做的場景。 PS:由於蘋果設備的安全性和封閉性,蘋果設備不能經過與其餘設備藍牙連接進行文件傳輸等功能,因此在iOS與藍牙開發的編程中是CBCentralMannager 中心模式編程居多.框架
在介紹CBCentralMannager 中心模式開發步驟以前,首先須要對項目進行以下配置:ui
#import "ESPFBYBLEHelper.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>
// 中心管理者(管理設備的掃描和鏈接)
@property (nonatomic, strong) CBCentralManager *centralManager;
// 存儲的設備
@property (nonatomic, strong) NSMutableArray *peripherals;
// 掃描到的設備
@property (nonatomic, strong) CBPeripheral *cbPeripheral;
// 外設狀態
@property (nonatomic, assign) CBManagerState peripheralState;
@end
// 藍牙4.0設備名
static NSString * const kBlePeripheralName = @"lighte290";
// 通知服務
static NSString * const kNotifyServerUUID = @"FF03";
// 寫服務
static NSString * const kWriteServerUUID = @"FFFF";
// 通知特徵值
static NSString * const kNotifyCharacteristicUUID = @"FF05";
// 寫特徵值
static NSString * const kWriteCharacteristicUUID = @"FF08";
@implementation ESPFBYBLEHelper
複製代碼
這其中須要導入CoreBluetooth框架atom
#import <CoreBluetooth/CoreBluetooth.h>
複製代碼
遵照CBCentralManagerDelegate,CBPeripheralDelegate協議spa
@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>
複製代碼
而後須要檢測藍牙狀態,代碼以下:代理
// 狀態更新時調用
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch (central.state) {
case CBManagerStateUnknown:{
NSLog(@"爲知狀態");
self.peripheralState = central.state;
}
break;
case CBManagerStateResetting:
{
NSLog(@"重置狀態");
self.peripheralState = central.state;
}
break;
case CBManagerStateUnsupported:
{
NSLog(@"不支持的狀態");
self.peripheralState = central.state;
}
break;
case CBManagerStateUnauthorized:
{
NSLog(@"未受權的狀態");
self.peripheralState = central.state;
}
break;
case CBManagerStatePoweredOff:
{
NSLog(@"關閉狀態");
self.peripheralState = central.state;
}
break;
case CBManagerStatePoweredOn:
{
NSLog(@"開啓狀態-可用狀態");
self.peripheralState = central.state;
NSLog(@"%ld",(long)self.peripheralState);
}
break;
default:
break;
}
}
複製代碼
添加屬性和常量,常量須要根據本身的項目來進行配置。 下面只須要根據實現流程一步步實現便可,核心代碼以下:
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
複製代碼
if (self.peripheralState == CBManagerStatePoweredOn){
[self.centralManager scanForPeripheralsWithServices:nil options:nil];
}
複製代碼
/**
掃描到設備
@param central 中心管理者
@param peripheral 掃描到的設備
@param advertisementData 廣告信息
@param RSSI 信號強度
*/
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
NSLog(@"%@",[NSString stringWithFormat:@"發現設備,設備名:%@",peripheral.name]);
}
複製代碼
[self.centralManager connectPeripheral:peripheral options:nil];
複製代碼
/**
鏈接失敗
@param central 中心管理者
@param peripheral 鏈接失敗的設備
@param error 錯誤信息
*/
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"%@",@"鏈接失敗");
}
複製代碼
/**
鏈接斷開
@param central 中心管理者
@param peripheral 鏈接斷開的設備
@param error 錯誤信息
*/
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
NSLog(@"%@",@"斷開鏈接");
}
複製代碼
/**
鏈接成功
@param central 中心管理者
@param peripheral 鏈接成功的設備
*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
NSLog(@"鏈接設備:%@成功",peripheral.name);
[self.centralManager stopScan];
}
複製代碼
// 設置設備的代理
peripheral.delegate = self;
// services:傳入nil 表明掃描全部服務
[peripheral discoverServices:nil];
複製代碼
5.1 發現並獲取外設中的服務
/**
掃描到服務
@param peripheral 服務對應的設備
@param error 掃描錯誤信息
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
// 遍歷全部的服務
for (CBService *service in peripheral.services)
{
NSLog(@"服務:%@",service.UUID.UUIDString);
}
}
複製代碼
// 獲取對應的服務
if (![service.UUID.UUIDString isEqualToString:kWriteServerUUID])
{
return;
}
// 根據服務去掃描特徵
[peripheral discoverCharacteristics:nil forService:service];
複製代碼
6.1 發現並獲取外設對應服務的特徵
/**
掃描到對應的特徵
@param peripheral 設備
@param service 特徵對應的服務
@param error 錯誤信息
*/
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
NSLog(@"%@",peripheral);
}
複製代碼
6.2 給對應特徵寫數據
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
複製代碼
if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID]){
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
複製代碼
7.1 根據特徵讀取數據 didUpdateValueForCharacteristic
/**
根據特徵讀到數據
@param peripheral 讀取到數據對應的設備
@param characteristic 特徵
@param error 錯誤信息
*/
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
{
if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID])
{
NSData *data = characteristic.value;
NSLog(@"%@",data);
}
}
複製代碼
若是須要源碼demo,歡迎關注 【網羅開發】微信公衆號,回覆【94】即可領取。 網羅天下方法,方便你我開發,全部文檔會持續更新,歡迎關注一塊兒成長!
歡迎關注公衆號「網羅開發」