基本流程
1.将手机作为调试机,用来搜索附近的蓝牙设备(在本次练习中,指小米手环)并连接。所以,手机是中央设备central。
2.调试机先扫描周边蓝牙设备,用UITableview展示所扫描到的周边蓝牙设备。
3.将扫描到的蓝牙设备(小米手环)设置为蓝牙发射器,即是周边设备peripheral,进行连接connect。
4.连接上蓝牙设备(小米手环)后,获取蓝牙设备(小米手环)中的所有服务services。
5.对每一个服务service进行遍历,获取其中所有的特性characteristic。
6.读取每一个特性,获取每个特性的值value。
7.对蓝牙设备(小米手环)的指定服务中的指定特性写入数据,实现我们想要达到的效果。
1.扫描设备
新建一个project,我在最开始的ViewController中添加了一个UIButton,title为@“扫描蓝牙”,点击这个按钮会跳到下一个界面BLEViewController,在这个界面中开始扫描附近的蓝牙设备。
首先在BLEViewController中导入蓝牙框架头文件
#import <CoreBluetooth/CoreBluetooth.h>
@interfaceBLEViewController ()<CBCentralManagerDelegate>
/**
* 用于管理中央设备的manager
*/
@property (nonatomic,strong)CBCentralManager *centralManager;
/**
* 用于保存扫描出来的周边设备的数组
*/
@property (nonatomic,strong)NSMutableArray *arrayBLE;
/**
* 用于处理蓝牙事件的线程
*/
@property (nonatomic)dispatch_queue_t bleGCD;
//初始化周边设备数组
self.arrayBLE = [[NSMutableArray alloc]init];
//初始化蓝牙线程
self.bleGCD =dispatch_queue_create("BLEgcd",NULL);
//初始化中央设备管理者
self.centralManager = [[CBCentralManager alloc]initWithDelegate:self queue:self.bleGCD];
实现CBCentralManagerDelegate中的代理方法centralManagerDidUpdateState,该方法会监听centralManager的状态变化,当运行程序的设备处在蓝牙开启状态下才开始扫描附近的蓝牙设备。
-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state)
{
caseCBCentralManagerStatePoweredOn:
//当前运行程序的设备处于蓝牙开启状态,开始扫描附近的蓝牙设备
[self.centralManager scanForPeripheralsWithServices:niloptions:nil];
break;
default:
NSLog(@"central Manager Did change State");
break;
}
}
- (void)scanForPeripheralsWithServices:(nullableNSArray<CBUUID *> *)serviceUUIDs options:(nullableNSDictionary<NSString *,id> *)options;这个方法会一直不停地调用,在这个方法中,services参数可以传入包含CBUUID的数组,以便只扫描到拥有指定service的蓝牙设备;options参数可以传入包含CBCentralManagerScanOptionAllowDuplicatesKey或
CBCentralManagerScanOptionSolicitedServiceUUIDsKey的字典,前一个键表示是否过滤每次扫描中发现的同一蓝牙设备,后一个键对应的值可以是一个包含CBUUID的数组,以便只扫描指定service,我感觉似乎和本方法第一个参数services有点重复?这里想扫描到附近的所有蓝牙设备,所以都传入nil。
开始扫描之后,当扫描到蓝牙设备时,会来到下面这个方法。
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
BLEinfo * discoveredBLEinfo = [[BLEinfo