iOS-BLE蓝牙开发

iOS开发蓝牙入门

  • 简单来说,iOS蓝牙就是有一个中心角色(可以理解为管理蓝牙的一个对象 CBCentralManager)
  • 就像是创建UITableView一样,需要先初始化 中心角色(CBCentralManager)
  • 既然存在了蓝牙管理对象,那么想要连接蓝牙,一般都是先去搜索设备。所以下一步,搜索设备(暂时不要看代码,先把思路理清楚。下面是代码,会按照这个思路再走一遍)

  • 搜索到一个设备 - didDiscoverPeripheral

    你就会在delegate方法中,得到这个设备。然后判断,如果这个设置是你需要的,那么就进行连接。如果没有特别情况,这里最好是停止设备搜索,因为你已经找到它了。

  • 连接自然会有两个结果,所以对应两个代理方法

    • 连接成功 didConnectPeripheral
    • 连接失败 didFailToConnectPeripheral
  • 连接成功 在这里去搜索服务,服务里会有特征值。特征值,是用来和蓝牙设备,做读写命令交互用的。

  • 发现服务 - didDiscoverServices 发现到服务,然后去查找这个服务中的特征值

  • 发现特征值 - didDiscoverCharacteristicsForService 这里去设置读写数据。或者是把特征值,做一个成员变量接收,这样就可以,选择什么时刻发送命令了。

  • 获取到蓝牙设备发送过来的数据 - didUpdateValueForCharacteristic 蓝牙数据一般为一堆16进制数据,然后自己根据协议去解析就好了。

总结中心模式的用法

引入CoreBluetooth.framework
引入蓝牙协议,如
@protocol CBCentralManagerDelegate;
@protocol CBPeripheralDelegate;
创建 CBCentralManager
//定义一个中心角色对象
@property (strong, nonatomic) CBCentralManager *centralManager;

//建立中心角色
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

//搜索蓝牙设备
[_centralManager scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:NO]}];

//发现蓝牙设备 - 代理方法
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
	//这里peripheral 就是搜索到的蓝牙设备对象了。
	//advertisementData 是广播消息。
	//RSSI 信号强度
	//这里名字 我随便写的。可以根据需求,来作判断。比如利用广播判断
	if ([peripheral.name isEqualToString:@"小米手环"]) {
		//连接设备 , 这里会有 连接成功, 和 连接失败两个代理方法
		[_manager connectPeripheral:peripheral options:@{CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:NO]}];

	}
}

#pragma mark - >> 连接成功
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
	[_centralManager stopScan]; //停止扫描
	//因为在后面我们要从外设蓝牙那边再获取一些信息,并与之通讯,这些过程会有一些事件可能要处理,所以要给这个外设设置代理
peripheral.delegate = self;
//找到该设备上的指定服务 调用完该方法后会调用代理CBPeripheralDelegate(现在开始调用另一个代理的方法了)
//    [peripheral discoverServices:@[[CBUUID UUIDWithString:@"7480"]]];
	//这个是发现所有服务, 上面的是发现指定服务
    [peripheral discoverServices:nil];
}

#pragma mark - >> CBPeripheralDelegate
#pragma mark - >> 发现服务
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
	if (error == nil) {
    NSLog(@"发现服务");
    for (CBService *service in peripheral.services) {
        NSLog(@"服务:%@", service);
        //设备 发现所有特征
        [peripheral discoverCharacteristics:nil forService:service];
        //下面代码,是用来查找特定服务的 特征,如果能确定只用哪个服务的,就可以用下面的方法
//if ([service.UUID isEqual:[CBUUID UUIDWithString:UUID_DEVICE_SERVER_0]]) {
//查询服务所带的特征值
//[peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:@"FFE0"]] forService:service];
//[peripheral discoverCharacteristics:nil forService:service];
//            }
        }
}

#pragma mark - >> 发现特征值
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
	if (error == nil) {
        for (CBCharacteristic *characteristic in service.characteristics) {
            
            NSLog(@"发现特征值:%@", characteristic);
                //这个FFE1是我随便写的。需要根据你们自己的硬件给的来填写.
                if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"FFE1"]]) {
                //我的这个特征是用来读取数据的。这里设置通知
                    [peripheral setNotifyValue:YES forCharacteristic:characteristic];
                    
                }else if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:UUID_DEVICE_SERVER_2]]) {
	                //给蓝牙设备发送数据, 写数据
					[peripheral writeValue:(NSData *) forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];
                }
            
        }
	}

}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy