前言:进行本博客的阅读之前,博主默认读者已经熟悉CoreBluetooth系统框架,并能够进行基本的使用。

当我们使用CoreBluetooth系统框架进行蓝牙开发的时候,有时因为某种功能需求需要拿到特定的蓝牙设备进行特定的操作,这就需要我们拿到能够代表特定的蓝牙设备的唯一标识,通过唯一标识来确认是哪一台蓝牙设备。

在开始讲解之前,我先讲解些基础。在CoreBluetooth系统框架中,我们能够看到当我们通过中心模式扫描到蓝牙设备的时候,我们可以获取到以下的一些属性:蓝牙设备的名字、信号强度、状态、服务、标志符。

//蓝牙设备的名字
@property(retain, readonly, nullable) NSString *name;

//蓝牙设备的信号强度
@property(retain, readonly, nullable) NSNumber *RSSI NS_DEPRECATED(NA, NA, 5_0, 8_0);

//蓝牙设备是否连接的状态
/**
        断开连接
	CBPeripheralStateDisconnected = 0,
        正在连接
	CBPeripheralStateConnecting,
        已经连接
	CBPeripheralStateConnected,
        正在断开连接
	CBPeripheralStateDisconnecting
*/
@property(readonly) CBPeripheralState state;

//蓝牙设备包含的服务
@property(retain, readonly, nullable) NSArray<CBService *> *services;

//继承于父类CBPeer的identifier的标识符属性
@property(readonly, nonatomic) NSUUID *identifier NS_AVAILABLE(NA, 7_0);




情形一:(蓝牙外设的名字不一样,那么蓝牙外设的名字就可以作为我们需要的唯一标识)

当我们使用中心设备进行扫描的时候,即在


- (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地址。


以上内容对于刚开始iOS领域蓝牙开发的同学有一定的参考价值,这些都是自己按照自己知道的和自己的经验总结的,也有很多不完善和待补全的地方,大家可以指出并提供更好的方案。