蓝牙

来源:互联网 发布:淘宝达人简介怎么写 编辑:程序博客网 时间:2024/06/10 14:54

蓝牙简介

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

  1. GameKit.framework(用法简单)
    • 只能用于iOS设备之间的连接,多用于游戏(比如五子棋对 战),从iOS7开始过期
    • 只能用于同一个应用程序之间的连接
    • 最好别利用蓝牙发送比较大的数据
  2. MultipeerConnectivity.framework
    • 只能用于iOS设备之间的连接,从iOS7开始引入,主要用于文件共享(仅限于沙盒的文件)

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

  4. 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的数组。
0 0
原创粉丝点击