首先导入框架
#import <CoreBluetooth/CoreBluetooth.h>
我们需要一个管理者来管理蓝牙设备,CBCentralManager
首先创建管理者
self.manager = [[CBCentralManager alloc]initWithDelegate:self queue:[NSOperationQueue mainQueue] options:nil]; //options是筛选设备的条件
创建完管理者后 会执行代理方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
可以查看manager的一个属性 : state 来识别蓝牙的状态 ,该属性是一个枚举值 CBCentralManagerState
typedef NS_ENUM(NSInteger, CBCentralManagerState) {
CBCentralManagerStateUnknown = 0, //初始的时候是未知的(刚刚创建的时候)
CBCentralManagerStateResetting, //正在重置状态
CBCentralManagerStateUnsupported, //设备不支持的状态
CBCentralManagerStateUnauthorized, //设备未授权状态
CBCentralManagerStatePoweredOff, //设备关闭状态
CBCentralManagerStatePoweredOn, //设备开启状态 -- 可用状态
};
如果是处于 CBCentralManagerStatePoweredOn 状态,就可以开始搜索设备
[self.manager scanForPeripheralsWithServices:nil options:nil];
可以设置一个计时器 在一段时间后停止搜索,避免耗电
[self.manager stopScan];
如果搜索到了设备,那么会调用代理方法
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
其中 peripheral是搜索到的设备,advertisementData是关于设备的一些信息,RSSI是设备的信号强度
可以根据 advertisementData 里面的 kCBAdvDataServiceUUIDs 的值 UUID来筛选某种设备
搜索到设备后就可以进行连接了,蓝牙4.0支持一对多连接。
连接设备
[self.manager connectPeripheral:peripheral options:nil];
连接成功后 会执行代理方法
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
如果需要断开某个设备,则调用方法
[self.manager cancelPeripheralConnection:peripheral];
设备不管是自己断开还是手动断开,都会调用代理方法
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
在这里可以判断一下,如果不是手动断开的连接,则可以再连接断开的设备,实现断开设备自动连接的功能
CBCentralManager就是用来做以上这些事情的,要给设备发送数据和接受数据 则要用到 CBPeripheral
首先设置设备的代理
peripheral.delegate = self;
然后开始搜索设备服务
[peripheral discoverServices:nil];
搜索成功后会执行代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
在这里 设备的 services 属性里面就有设备服务的数据了,可以遍历这个数组来匹配到我们需要的服务,这个一般跟硬件厂商协商,这里我们假如需要UUID为FF00的服务
for(CBService *s in peripheral.services){
if([s.UUID isEqual:[CBUUID UUIDWithString:@"FF00"]]){
[peripheral discoverCharachteristics:nil forService:s];
}
}
如果成功匹配到服务,那么调用方法
[peripheral discoverCharacteristics:nil forService:s];
成功后会执行代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
在这个方法里面,服务的属性 characteristics ,会是一组的 CBCharacteristic,是服务的一些特征,在这里,我们假设发送数据需要用到特征的UUID为 FF02
for (CBCharacteristic *c in service.characteristics){
if([c.UUID isEqual:[CBUUID UUIDWithString:@"FF02"]]){
NSData *data = [self stringToHex:@"550504010101AA"];
[peripheral writeValue:data forCharacteristic:c type:CBCharacteristicWriteWithoutResponse];
}
}
发送的数据为 550504010101AA,我们将其转换为 NSData 类型 调用方法
[peripheral writeValue:data forCharacteristic:ctype:CBCharacteristicWriteWithoutResponse] //将数据发送给设备
发送成功后会执行代理方法
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
如果是读取设备的数据 那么使用方法
[peripheral readValueForCharacteristic:c]
读取数据后会执行代理方法
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
完成