前言:进行本次阅读在之前,博主默认读者已经熟悉CoreBluetooth系统框架,并能够基本使用。
当我们使用CoreBuletooth系统框架进行蓝牙开发的时候,有时候因为某种功能需求需要拿到特定的蓝牙设备进行特定的操作,这个就表示我们能够拿到代表特定的蓝牙设备的唯一标识,通过唯一标识来确认是哪一台蓝牙设备。
在正式讲解之前,我们先讲解基础,在CoreBluetooth系统框架中,我们能够看到当我们通过中心模式扫描到蓝牙设备的时候,会返回一些属性:蓝牙设备的名字、信号强度、状态、服务、标识符。
//蓝牙设备的名字
@property(retain, readonly, nullable) NSString *name;
//蓝牙设备的信号强度
@property(retain, readonly, nullable) NSNumber *RSSI NS_DEPRECATED(NA, NA, 5_0, 8_0);
//蓝牙设备的状态
/*
typedef NS_ENUM(NSInteger, CBPeripheralState) {
//断开连接
CBPeripheralStateDisconnected = 0,
//正在连接
CBPeripheralStateConnecting,
//已经连接
CBPeripheralStateConnected,
//正在断开连接
CBPeripheralStateDisconnecting NS_AVAILABLE(NA, 9_0),
} NS_AVAILABLE(NA, 7_0);
*/
@property(readonly) CBPeripheralState state;
//包含的服务
@property(retain, readonly, nullable) NSArray<CBService *> *services;
//继承于父类CBPeer的identifier的标识符属性
@property(readonly, nonatomic) NSUUID *identifier NS_AVAILABLE(NA, 7_0);
情形一:(蓝牙外设的名字不一样,那么蓝牙外设的名字就可以作为我们需要的唯一标识)当我们使用中心设备进行扫描的时候,即在
[objc] view plain copy
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;
方法中,我们就可以通过扫描到的蓝牙外设的名字(peripheral.name)来进行针对性的操作。
情形二:(蓝牙外设的名字都一样,但是不需要很严苛的知道连接的是那一台外部设备)
有一些公司的外部设备的名字都是一样的,但是进行连接或者其他操作的时候,没必要知道具体的是哪一台设备,那么就可以使用蓝牙外设的UUIDString(即peripheral.identifier.UUIDString)来作为唯一标识。但是,需要注意的一点:不同的中心设备(也可以说是不同的手机)对于同一台蓝牙设备,获取到的UUIDString是不一样的。
举例说明一下:对于同一台蓝牙设备,我的手机进行扫描,然后读取它的UUIDString,和你的手机进行扫描,获取到的UUIDString是不同的。
情形三:(蓝牙外设的名字都一样的情况下,不管任何手机获取到的唯一标识都是一样的或者需要确切知道是哪一台蓝牙设备)
针对这种情况,我们只能获取蓝牙设备的mac地址来作为唯一标识。但是,苹果公司也许是出于安全考虑,并没有对我们开放获取蓝牙设备的mac地址的接口(安卓开发是可以获取的)。那么我们只能自己通过某种手段来获取mac地址,有两种方法可以让我们获取到mac地址:
第一种:将mac地址放在蓝牙设备的广播数据之中,然后在广播的时候,将mac地址以广播的形式发送出来以供我们获取。
第二种:将mac地址写在某一个特征通道中,当我们连接蓝牙设备之后,通过某一个特征通道来获取mac地址。
一些坑爹坑爹情况
一些坑爹的情况
1.为什么扫描不到外设?->情况1:设备不支持babybluetooth支持BLE4.0蓝牙设备,如果是2.0的设备,那肯定扫描不到模拟器不支持蓝牙调试,必须使用真机调试ios操作系统至少要在6.0以上
->情况2:外设没有开启广播默认情况下打开手机或者ipad的蓝牙,在使用babybluetooth是扫描不到设备的,因为手机和ipad只是打开了蓝牙设备的电源而已,并没有发送广播,如果想扫描到设备,需要编程的方式,通过iphone或ipad,mac发送蓝牙广播。demo程序中有一个iphone和一个mac发送蓝牙广播的程序。已连接的设备会停止广播,所以也搜索不到
->情况3:为什么系统的蓝牙能找到设备,但是使用babybluetooth的demo却无法找到?这种情况一般是因为那个蓝牙设备是支持MFI的,并不是普通的ble设备。关于MFI这里补充一下 :MFI ( make for ipad ,iphone, itouch ), 专们为苹果设备制作的设备, 开发使用的是 ExternalAccessory 框架所以这篇文章不予谈论
网友评论