iOS 蓝牙算是比较独立的一门技术了但是在ios上面蓝牙有很多限制个人感觉这事影响ios蓝牙发展壮大的原因了。今天我门一般是从蓝牙4.0开始学习。
话不多说直接进入正题
首先导入 <CoreBluetooth/CoreBluetooth.h>
蓝牙有一个中心管理者 CBCentralManager 与外设 CBPeripheral
/** 中心管理者 */
@property (nonatomic, strong) CBCentralManager *cMgr;
/** 连接到的外设 */
@property (nonatomic, strong) CBPeripheral *peripheral;
懒加载
- (CBCentralManager *)cMgr
{
if (!_cMgr) {
_cMgr = [[CBCentralManager alloc] initWithDelegate:self
queue:dispatch_get_main_queue() options:nil];
}
return _cMgr;
}
只要中心管理者初始化,就会触发此代理方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch (central.state) {
case CBCentralManagerStateUnknown:
break;
case CBCentralManagerStateResetting:
break;
case CBCentralManagerStateUnsupported:
break;
case CBCentralManagerStateUnauthorized:
break;
case CBCentralManagerStatePoweredOff:
break;
case CBCentralManagerStatePoweredOn:
{
// 在中心管理者成功开启后再进行一些操作
// 搜索外设
[self.cMgr scanForPeripheralsWithServices:nil // 通过某些服务筛选外设
options:nil];
}
break;
default:
break;
}
}
// 发现外设后调用的方法
- (void)centralManager:(CBCentralManager *)central // 中心管理者 didDiscoverPeripheral:(CBPeripheral *)peripheral // 外设 advertisementData:(NSDictionary *)advertisementData // 外设携带的数据 RSSI:(NSNumber *)RSSI // 外设发出的蓝牙信号强度{
*/
//过滤
if ([peripheral.name hasPrefix:@"slap"] && (ABS(RSSI.integerValue) > 35)) {
self.peripheral = peripheral;
// 发现完之后就是进行连接
[self.cMgr connectPeripheral:self.peripheral options:nil];
}
}
// 中心管理者连接外设成功
- (void)centralManager:(CBCentralManager *)central // 中心管理者
didConnectPeripheral:(CBPeripheral *)peripheral // 外设
{
[self.peripheral discoverServices:nil];
}
// 外设连接失败
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
}
// 丢失连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
}
#pragma mark - 外设代理
// 发现外设的服务后调用的方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
for (CBService *service in peripheral.services) {
// 发现服务后,让设备再发现服务内部的特征们 didDiscoverCharacteristicsForService
[peripheral discoverCharacteristics:nil forService:service];
}
}
// 发现外设服务里的特征的时候调用的代理方法
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
for (CBCharacteristic *cha in service.characteristics) {
//NSLog(@"%s, line = %d, char = %@", __FUNCTION__, __LINE__, cha);
// 获取特征对应的描述 didUpdateValueForDescriptor
[peripheral discoverDescriptorsForCharacteristic:cha];
// 获取特征的值 didUpdateValueForCharacteristic
[peripheral readValueForCharacteristic:cha];
}
}
// 更新特征的value的时候会调用
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
{
for (CBDescriptor *descriptor in characteristic.descriptors) {
// 它会触发
[peripheral readValueForDescriptor:descriptor];
}
}
// 更新特征的描述的值的时候会调用
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(NSError *)error
{
// 这里当描述的值更新的时候,直接调用此方法即可
[peripheral readValueForDescriptor:descriptor];
}
// 发现外设的特征的描述数组
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
{
// 在此处读取描述即可
for (CBDescriptor *descriptor in characteristic.descriptors) {
// 它会触发
[peripheral readValueForDescriptor:descriptor];
}
}
断开连接久调用
// 停止扫描
[self.cMgr stopScan];
// 断开连接
[self.cMgr cancelPeripheralConnection:peripheral];
基本连接就这样啦这样也只能装逼实际应用还有很多场景需要考虑!后续我会更新
第一次写简书写的不好哦还请原谅