您的位置:首页 > 其它

蓝牙

2015-09-14 11:04 148 查看

蓝牙简介

iOS中提供了4个框架用于实现蓝牙的连接:

GameKit.framework(用法简单)

• 只能用于iOS设备之间的连接,多用于游戏(比如五子棋对 战),从iOS7开始过期

• 只能用于同一个应用程序之间的连接

• 最好别利用蓝牙发送比较大的数据

MultipeerConnectivity.framework

• 只能用于iOS设备之间的连接,从iOS7开始引入,主要用于文件共享(仅限于沙盒的文件)

ExternalAccessory.framework

• 可用于第三方蓝牙设备交互,但是蓝牙设备必须经过苹果MFi认证(国内较少)

CoreBluetooth.framework(时下热门)

• 可用于第三方蓝牙设备交互,必须要支持蓝牙4.0

• 硬件至少是4s,系统至少是iOS6

• 蓝牙4.0以低功耗著称,一般也叫BLE(Bluetooth Low Energy)

• 目前应用比较多的案例:运动手坏、嵌入式设备、智能家居Core Bluetooth测试比较麻烦,正常情况下,得至少有2台真实的蓝牙4.0设备

CoreBluetooth的使用

UUID类

在蓝牙中,每个服务和服务属性都唯一地由”全球唯一标识符” (UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。UUID类可表现为短整形(16或32位)和长整形(128位)UUID。他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。

在Linux下你用一个命令uuidgen -t可以生成一个UUID值;在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。

建立中心设备

_cbManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
_cbManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
//options: CBCentralManagerOptionShowPowerAlertKey 用该参量出事中央管理器时,当蓝牙开关未打开时会弹出警告框
//options: CBCentralManagerOptionRestoreIdentifierKey 该参量包含一个指定中央管理器的uid
//queue: nil表示在主线程


扫描外设

[self.cbManager scanForPeripheralsWithServices:nil options:nil];


CBCentralManager的代理方法

• 当central管理器更新状态时调用。这个方法是必须实现的,为了确保当前的central设备是否支持BLE以及当前是否可以被利用,当检测到central蓝牙已经打开时,需要做一些操作,比如开始寻找Peripheral。当状态改变为CBCentralManagerStatePoweredOff时,会结束当前的寻找以及断开当前连接的peripheral。当检测到PoweredOff这个状态是所有的APP必须重新开始检索以及寻找。

/*
state property:
CBCentralManagerStateUnknown = 0,
CBCentralManagerStateResetting,
CBCentralManagerStateUnsupported,
CBCentralManagerStateUnauthorized,
CBCentralManagerStatePoweredOff,
CBCentralManagerStatePoweredOn,
*/
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
}


• 扫描到设备后会调用下面方法,在这个方法中判断扫描到的设备是否是你想要连接的设备,将peripheral对象设置给成员变量,保持对这个对象的引用,否则会因为没有引用计数而被回收,每当扫描到一个外设,就会调用下面这个方法。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
//如果扫描到的设备的名字和你想要连接的设备的名字相同,那就连接
if ([peripheral.name  isEqual: BLE_PERIPHERAL_NAME]) {
self.peripheral = peripheral;
[self.cbManager connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}
}


• 连接上外设后会调用下面的方法,在这里面设置外设的代理,然后扫描外设的服务

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
_connectedPeripheral = peripheral;
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
}


• 当central管理器涉及到要被系统来恢复时调用。

- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict;


• 当central管理者检索与系统连接的一系列peripheral设备时调用。

- (void)centralManager:(CBCentralManager *)central didRetrieveConnectedPeripherals:(NSArray *)peripherals;


• 当central管理者检索一系列已知的peripherals的设备时调用。

- (void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals;


• 这个返回retrieveConnectedperipherial调用的值,这里面的数组参数包括系统中与其他APP连接的peripheral,当指定实现这个方法时便可以重新连接APP感兴趣的peripheral。

- (void)centralManager:(CBCentralManager *)central didRetrieveConnectedPeripherals:(NSArray *)peripherals;


• 这个方法是说coreBluetooth为APP提供了一个保留和回复的功能,当APP需要在后台完成蓝牙相关的任务时,这是你第一个调用的方法,用这个方法可以是APP与系统蓝牙进行同步。

- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict;


• 当已经建立的连接被断开时调用。这个方法在connectPeripheral:options方法建立的连接断开时调用,如果断开连接不是由cancelPeripheralConnection方法发起的,那么断开连接的详细信息就在error参数中,当这个方法被调用只有peripheral代理中的方法不在被调用。注意:当peripheral断开连接时,peripheral所有的service、characteristic、descriptors都无效。

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error;


CBPeripheral的代理方法

• 扫描到服务的时候调用下面的方法

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{

if (error) {
NSLog(@"%@",error);
return ;
}

for (CBService *service in peripheral.services) {
if ([service.UUID isEqual:[CBUUID UUIDWithString:UUIDSTR_ISSC_PROPRIETARY_SERVICE]]) {
[peripheral discoverCharacteristics:nil forService:service];
}
}

}


• 发现设备的服务的时候调用下面的方法

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
if (error) {
NSLog(@"%@",error);
return;
}

for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:@"adasd"]]) {
//给特征设置监听
[self.connectedPeripheral setNotifyValue:YES forCharacteristic:characteristic];
}
}
}


• 这个方法在方法connectPeripheral:options建立的连接断开时调用,应为建立连接的动作是不能超时的,通常在失败连接时你需要再次试图连接peripheral。

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
}


• 设备的特征的值改变会调用下面的方法

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if (error) {
NSLog(@"%@",error);
}

//打印接受到的数据
NSLog(@"%@",characteristic.value);
}


CBAdverisementDataLocalNameKey:一个包含了peripheral设备名称的字符串。

CBAdvertisementDataManudfactureDataKey:一个包含了制造商信息的NSdata对象。

CBAdvertisementDataServiceDataKey:这个keys是一个CBUUID的对象代表了CBServicesUUID,这个NSData代表了服务指定的Data。

CBAdvertisementDataServiceUUIDsKey:这是一包含了服务的UUID的数组。

CBAdvertisementDataOverflowServiceUUIDsKey:这个数组包含了一个或者更多的CBUUID对象,这些对象代表了被广播在溢出区域的数据,关于这个keys的详细介绍请看我的上一篇译文《CBPeripheralManager 类介绍》。

CBAdvertisementDataTxPowerLeverlKey:这个NSnumber对象包含了peripheral传输功率的强弱。如果peripheral广播的数据中包含了传输的功率是这个key值将可以被使用,使用RSSI和传输功率可以计算之间的距离。

CBAdvertisementDataIsconnectable:这个BOOL值指明当前广播的事件是否可连接。

CBAdvertisementDataSolicitedServiceUUIDsKEy:一个包含了CBServices UUIDs的数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: