千家信息网

iOS蓝牙开发CoreBlueTooth库核心方法是怎样的

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,iOS蓝牙开发CoreBlueTooth库核心方法是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、引言蓝牙是设备近距离通信
千家信息网最后更新 2025年12月02日iOS蓝牙开发CoreBlueTooth库核心方法是怎样的

iOS蓝牙开发CoreBlueTooth库核心方法是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、引言

蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理。通过蓝牙进行通讯交互分为两方,一方为中心设备central,一方为外设 peripheral,外设通过广播的方式向外发送信息,中心设备检索到外设发的广播信息,可以进行配对连接,进而进行数据交互。这里我写了一个轻量级的蓝牙库 GJLightBlueTooth,里面包括基本需要的蓝牙扫描连接操作。

二、中心设备CBCentralManager

CBCentralManager是管理中心设备的管理类,其中重要方法如下:

//设置中心设备代理@property(assign, nonatomic, nullable) id delegate;//中心设备当前状态@property(readonly) CBCentralManagerState state;//中心设备是否正在扫描@property(readonly) BOOL isScanning NS_AVAILABLE(NA, 9_0);

其中state是一个枚举,有关蓝牙是否可用的状态如下:

typedef NS_ENUM(NSInteger, CBCentralManagerState) {        //状态未知    CBCentralManagerStateUnknown = 0,    //连接断开 即将重置    CBCentralManagerStateResetting,    //该平台不支持蓝牙    CBCentralManagerStateUnsupported,    //未授权蓝牙使用    CBCentralManagerStateUnauthorized,    //蓝牙关闭    CBCentralManagerStatePoweredOff,    //蓝牙正常开启    CBCentralManagerStatePoweredOn,};

下面这些方法用于初始化管理中心:

//初始化方法//设置的代理需要遵守CBCentralManagerDelegate协议//queue可以设置蓝牙扫描的线程 传入nil则为在主线程中进行- (instancetype)initWithDelegate:(nullable id)delegate                           queue:(nullable dispatch_queue_t)queue;//此方法同上 在options字典中用于进行一些管理中心的初始化属性设置//字典中支持的键值如下/*NSString * const CBCentralManagerOptionShowPowerAlertKey 对应一个NSNumber类型的bool值,用于设置是否在关闭蓝牙时弹出用户提示NSString * const CBCentralManagerOptionRestoreIdentifierKey 对应一个NSString对象,设置管理中心的标识符ID*/- (instancetype)initWithDelegate:(nullable id)delegate                           queue:(nullable dispatch_queue_t)queue                         options:(nullable NSDictionary *)options;//根据获取所有已知设备- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers;//根据服务id获取所有连接的设备- (NSArray *)retrieveConnectedPeripheralsWithServices:(NSArray *)serviceUUIDs;

在初始化管理中心完成后,会回调代理中的如下方法,我们必须实现如下方法:

//这个方法中可以获取到管理中心的状态- (void)centralManagerDidUpdateState:(CBCentralManager *)central;

如果上面方法中管理中心状态为蓝牙可用,可以通过下面方法开启扫描外设:

//serviceUUIDs用于扫描一个特点ID的外设 options用于设置一些扫描属性 键值如下/*//是否允许重复扫描 对应NSNumber的bool值,默认为NO,会自动去重NSString *const CBCentralManagerScanOptionAllowDuplicatesKey;//要扫描的设备UUID 数组 对应NSArrayNSString *const CBCentralManagerScanOptionSolicitedServiceUUIDsKey;*/- (void)scanForPeripheralsWithServices:(nullable NSArray *)serviceUUIDs options:(nullable NSDictionary *)options;//停止扫描外设- (void)stopScan;

扫描的结果会在如下代理方法中回掉:

//peripheral 扫描到的外设//advertisementData是外设发送的广播数据//RSSI 是信号强度- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;

扫描到外设后,通过下面方法可以连接一个外设:

/*options中可以设置一些连接设备的初始属性键值如下//对应NSNumber的bool值,设置当外设连接后是否弹出一个警告NSString *const CBConnectPeripheralOptionNotifyOnConnectionKey;//对应NSNumber的bool值,设置当外设断开连接后是否弹出一个警告NSString *const CBConnectPeripheralOptionNotifyOnDisconnectionKey;//对应NSNumber的bool值,设置当外设暂停连接后是否弹出一个警告NSString *const CBConnectPeripheralOptionNotifyOnNotificationKey;*/- (void)connectPeripheral:(CBPeripheral *)peripheral options:(nullable NSDictionary *)options;//取消一个外设的连接- (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;

调用过连接外设的方法后,会回掉如下代理方法:

//连接外设成功- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;//连接外设失败- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;//断开外设连接- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error;

当管理中心恢复时会调用如下代理:

//dict中会传入如下键值对/*//恢复连接的外设数组NSString *const CBCentralManagerRestoredStatePeripheralsKey;//恢复连接的服务UUID数组NSString *const CBCentralManagerRestoredStateScanServicesKey;//恢复连接的外设扫描属性字典数组NSString *const CBCentralManagerRestoredStateScanOptionsKey;*/- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict;

三、外设CBPeripheralManager

从上面我们知道,中心设备是用来扫描周围的外设,两台设备的通讯中,必须有一个充当中心设备,一个充当外设,外设是由CBPeripheralManager进行管理,主要方法如下:

//设置外设管理中心代理@property(assign, nonatomic, nullable) id delegate;//外设状态 枚举如中心设备@property(readonly) CBPeripheralManagerState state;//是否正在发送广播@property(readonly) BOOL isAdvertising;//用户的授权状态+ (CBPeripheralManagerAuthorizationStatus)authorizationStatus;//初始化并设置代理 参数的具体含义与中心设备管理中心- (instancetype)initWithDelegate:(nullable id)delegate                           queue:(nullable dispatch_queue_t);- (instancetype)initWithDelegate:(nullable id)delegate                           queue:(nullable dispatch_queue_t)queue                         options:(nullable NSDictionary *)options;//开始发送广播//advertisementData中可以发送的数据有约定 如下/*对应设置NSString类型的广播名NSString *const CBAdvertisementDataLocalNameKey;外设制造商的NSData数据NSString *const CBAdvertisementDataManufacturerDataKey;外设制造商的CBUUID数据NSString *const CBAdvertisementDataServiceDataKey;服务的UUID与其对应的服务数据字典数组NSString *const CBAdvertisementDataServiceUUIDsKey;附加服务的UUID数组NSString *const CBAdvertisementDataOverflowServiceUUIDsKey;外设的发送功率 NSNumber类型NSString *const CBAdvertisementDataTxPowerLevelKey;外设是否可以连接NSString *const CBAdvertisementDataIsConnectable;服务的UUID数组NSString *const CBAdvertisementDataSolicitedServiceUUIDsKey;*/- (void)startAdvertising:(nullable NSDictionary *)advertisementData;//停止发送广播- (void)stopAdvertising;//设置一个连接的具体central设备的延时 枚举如下/*typedef NS_ENUM(NSInteger, CBPeripheralManagerConnectionLatency) {    CBPeripheralManagerConnectionLatencyLow = 0,    CBPeripheralManagerConnectionLatencyMedium,    CBPeripheralManagerConnectionLatencyHigh} NS_ENUM_AVAILABLE(NA, 6_0);*/- (void)setDesiredConnectionLatency:(CBPeripheralManagerConnectionLatency)latency forCentral:(CBCentral *)central;//添加一个服务- (void)addService:(CBMutableService *)service;//移除一个服务- (void)removeService:(CBMutableService *)service;//移除所有服务- (void)removeAllServices;//响应中心设备的读写请求- (void)respondToRequest:(CBATTRequest *)request withResult:(CBATTError)result;//更新一个连接中心设备的订阅特征值- (BOOL)updateValue:(NSData *)value forCharacteristic:(CBMutableCharacteristic *)characteristic onSubscribedCentrals:(nullable NSArray *)centrals;

外设代理的相关方法如下:

//这个方法是必须实现的 状态可用后可以发送广播- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral;//连接回复时调用的方法 和centralManager类似- (void)peripheralManager:(CBPeripheralManager *)peripheral willRestoreState:(NSDictionary *)dict;//开始发送广播时调用的方法- (void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(nullable NSError *)error;//添加服务调用的回调- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(nullable NSError *)error;//当一个central设备订阅一个特征值时调用的方法- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic;//取消订阅一个特征值时调用的方法- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic;//收到读请求时触发的方法- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request;//收到写请求时触发的方法- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests;//外设准备更新特征值时调用的方法- (void)peripheralManagerIsReadyToUpdateSubscribers:(CBPeripheralManager *)peripheral;

四、中心设备与外设对象CBCentral与CBPeripheral

上面介绍了中心设备管理类与外设管理类,这些类用于将设备连接建立起来,器具的数据交换的服务和一些信息则是在对应的设备对象中。

1、中心设备 CBCentral属性与方法

//设备UUID@property(readonly, nonatomic) NSUUID *identifier;//中心设备最大接收的数据长度@property(readonly, nonatomic) NSUInteger maximumUpdateValueLength;

2、外设CAPeripheral属性与方法

外设对象要比中心对象复杂的多,当centralManager连接到外设后,需要通过外设对象的代理方法进行数据交互,其中主要方法属性如下:

//设置代理@property(assign, nonatomic, nullable) id delegate;//外设name@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 *services;//获取当前信号强度- (void)readRSSI;//根据服务UUID寻找服务对象- (void)discoverServices:(nullable NSArray *)serviceUUIDs;//在服务对象UUID数组中寻找特定服务- (void)discoverIncludedServices:(nullable NSArray *)includedServiceUUIDs forService:(CBService *)service;//在一个服务中寻找特征值- (void)discoverCharacteristics:(nullable NSArray *)characteristicUUIDs forService:(CBService *)service;//从一个特征中读取数据- (void)readValueForCharacteristic:(CBCharacteristic *)characteristic;//写数据的最大长度//type枚举如下/*typedef NS_ENUM(NSInteger, CBCharacteristicWriteType) {    CBCharacteristicWriteWithResponse = 0,//写数据并且接收成功与否回执    CBCharacteristicWriteWithoutResponse,//写数据不接收回执};*/- (NSUInteger)maximumWriteValueLengthForType:(CBCharacteristicWriteType)type NS_AVAILABLE(NA, 9_0);//向某个特征中写数据- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;//为制定的特征值设置监听通知- (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;//寻找特征值的描述- (void)discoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic;//读取特征的描述值- (void)readValueForDescriptor:(CBDescriptor *)descriptor;//写特征的描述值- (void)writeValue:(NSData *)data forDescriptor:(CBDescriptor *)descriptor;

外设的代理方法如下:

//外设名称更改时回调的方法- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral NS_AVAILABLE(NA, 6_0);//外设服务变化时回调的方法- (void)peripheral:(CBPeripheral *)peripheral didModifyServices:(NSArray *)invalidatedServices NS_AVAILABLE(NA, 7_0);//信号强度改变时调用的方法- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(nullable NSError *)error NS_DEPRECATED(NA, NA, 5_0, 8_0);//读取信号强度回调的方法- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(nullable NSError *)error NS_AVAILABLE(NA, 8_0);//发现服务时调用的方法- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error;//在服务中发现子服务回调的方法- (void)peripheral:(CBPeripheral *)peripheral didDiscoverIncludedServicesForService:(CBService *)service error:(nullable NSError *)error;//发现服务的特征值后回调的方法- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error;//特征值更新时回调的方法- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error;//向特征值写数据时回调的方法 - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error; //特征值的通知设置改变时触发的方法 - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error; //发现特征值的描述信息触发的方法 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(nullable NSError *)error; //特征的描述值更新时触发的方法 - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForDescriptor:(CBDescriptor *)descriptor error:(nullable NSError *)error; //写描述信息时触发的方法 - (void)peripheral:(CBPeripheral *)peripheral didWriteValueForDescriptor:(CBDescriptor *)descriptor error:(nullable NSError *)error;

五、服务对象CBService

服务对象是用来管理外设提供的一些数据服务的,其中属性如下:

//对应的外设@property(assign, readonly, nonatomic) CBPeripheral *peripheral;//是否是初等服务@property(readonly, nonatomic) BOOL isPrimary;//包含的自服务@property(retain, readonly, nullable) NSArray *includedServices;//服务中的特征值@property(retain, readonly, nullable) NSArray *characteristics;

六、服务的特征值CBCharacteristic

通过绑定服务中的特征值来进行数据的读写操作,其中属性如下:

//对应的服务对象@property(assign, readonly, nonatomic) CBService *service;//特征值的属性 枚举如下/*typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {    CBCharacteristicPropertyBroadcast,//允许广播特征    CBCharacteristicPropertyRead,//可读属性    CBCharacteristicPropertyWriteWithoutResponse,//可写并且接收回执    CBCharacteristicPropertyWrite,//可写属性    CBCharacteristicPropertyNotify,//可通知属性    CBCharacteristicPropertyIndicate,//可展现的特征值    CBCharacteristicPropertyAuthenticatedSignedWrites,//允许签名的特征值写入    CBCharacteristicPropertyExtendedProperties,    CBCharacteristicPropertyNotifyEncryptionRequired,    CBCharacteristicPropertyIndicateEncryptionRequired};*/@property(readonly, nonatomic) CBCharacteristicProperties properties;//特征值的数据@property(retain, readonly, nullable) NSData *value;//特征值的描述@property(retain, readonly, nullable) NSArray *descriptors;//是否是当前广播的特征@property(readonly) BOOL isBroadcasted;//是否是正在通知的特征@property(readonly) BOOL isNotifying;

七、读写请求对象CBATTRequest

服务对象是外设向中心设备提供的相关数据服务,获取到相应服务后,中心设备可以进行读写请求,读写对象属性如下:

//对应的中心设备@property(readonly, nonatomic) CBCentral *central;//对应的特征值@property(readonly, nonatomic) CBCharacteristic *characteristic;//读写数据值@property(readwrite, copy, nullable) NSData *value;

关于iOS蓝牙开发CoreBlueTooth库核心方法是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

外设 方法 服务 设备 特征 特征值 数据 蓝牙 管理 对象 属性 代理 广播 数组 状态 时调 信号 信息 强度 正在 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库与程序如何连接起来 浦东新区系统软件开发培训 即时通讯软件开发价格如何 安卓数据库的清单文件 虎年软件开发门口贴的对联 连续十年市场占有率第一的服务器 数据库版本控制方案 教工管理系统数据库 华为服务器价格 关于网络安全的主题手抄报 贵港市网络安全宣传 及时反馈网络安全整改报告 软件开发后期维护方案 静海区信息网络技术不二之选 面试软件开发实习生 用自有工作站做服务器建网站 京津冀互联互通卡服务器异常 华为地图软件开发 北京冬奥会网络安全保障总结 网络安全教育方案小学 无法连接服务器安全证书 学编程软件开发在哪学比较好 服务器必须装网卡吗 一个交换机可以接多个服务器 合肥光学仿真软件开发公司 国家网络安全法宣传稿 临沂服务器管理系统公司 北京酷蜂软件开发有限公司风险 网络安全研究预期成果 数据库提交到本地服务器
0