zoukankan      html  css  js  c++  java
  • core Bluetooth(蓝牙4.0)

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

    目前主要应用的场景有:智能家居、运动手环和室内导航等。

    利用core Bluetooth框架可以实现苹果设备与第三方蓝牙设备进行数据的交互。在CoreBluetooth框架中,有两个主要的角色:周边和中央 ,整个框架都是围绕这两个主要角色设计的,他俩之间有一系列的回调交换数据。core Bluetooth的核心框架图如下:

    其中左边是中心,其中CBService 类代表服务,CBCharacteristic 类代表特征。右边是周边,其中CBMutableService 类代表服务,CBMutableCharacteristic 类代表特征。

    注意一点就是:设备中包含服务,服务中包含特征。我们可以根据服务的唯一标示(UUID)找出设备中的服务,然后根据特征的唯一标示(UIID)从相应的服务中找出对应的特征,然后执行相应的操作。(就像中国包含省份,省份中有包含城市,我们可以根据省份的名称(类似于服务的UUID)来找到对应的省份,根据城市名称(类似于特征的UUID)从对应省份中找出正确的城市)。

    core Bluetooth的主要开发步骤:

    1. 建立中心设备,并成为自己的代理;
    //1创建中心管理者
    CBCentralManager *mgr = [[CBCentralManager alloc] init];
    //成为自己的代理
    mgr.delegate = self;
    2. 使用中心设备扫描外设,并将扫描到的外设保存;
    //2利用中心设备扫描(数组指定)外部设备(若数组为空,表示扫描所有的)
     [mgr scanForPeripheralsWithServices:(NSArray *) options:nil];
    3. 根据外设的唯一标示,从保存的外设中连接外设;
    //3根据外设的标示,连接外设
    [self.mgr connectPeripheral:(CBPeripheral *) options:nil];
    4. 如果连接外设成功,则扫描外设中的服务;
    /** 连接外设成功调用 */
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
        // 扫描外设中得服务
        [peripheral discoverServices:nil];
    }
    
    /**  连接外设失败调用 */
    - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{}
    5. 实现外设的代理,如果找到正确的服务,则扫描服务中的特征;
    /** 只要扫描到服务就会调用 */
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
        // 获取外设中所有扫描到得服务
        NSArray *services = peripheral.services;
      遍历服务:
    if (正确的服务){ // 从需要的服务中查找需要的特征 [peripheral discoverCharacteristics:nil forService:service]; } }
    6. 根据特征的UUID从服务中所有特征中正确的特征;
    /** 只要扫描到特征就会调用 */
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
    {
        // 拿到服务中所有的特诊
        NSArray *characteristics =  service.characteristics;
      
         遍历特征:
         if (正确的特征) {
             与外设交互代码;
          }
    }
    7. 利用特征与外设做数据交互;
    8. 断开连接。
     
    具体代码实现:
      1 /*存储所有的外设*/
      2 @property (nonatomic, strong) NSMutableArray *peripherals;
      3 /*中心服务管理者*/
      4 @property (nonatomic, strong) CBCentralManager *mgr;
      5 
      6 /*懒加载数组*/
      7 - (NSMutableArray *)peripherals{
      8     if (_peripherals == nil) {
      9         _peripherals = [NSMutableArray array];
     10     }
     11     return _peripherals;
     12 }
     13 
     14 - (void)viewDidLoad {
     15     [super viewDidLoad];
     16 
     17     //1创建中心管理者
     18     self.mgr = [[CBCentralManager alloc] init];
     19 
     20     //成为自己的代理
     21     mgr.delegate = self;
     22 
     23     //2利用中心设备扫描(数组指定的)外部设备
     24     /*  如果指定数组为空表示扫描所有的设备 */
     25     [mgr scanForPeripheralsWithServices:nil options:nil];
     26 }
     27 
     28 #pragma mark - CBCentralManagerDelegate代理方法
     29 /*发现外设的时候调用*/
     30 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
     31     
     32     // 判断如果数组中不包含当前扫描到得外部设置才保存
     33     if (![self.peripherals containsObject:peripheral]) {
     34 
     35         //让外设成为自己的代理
     36         peripheral.delegate = self;
     37 
     38         // 保存扫描到得外部设备
     39         [self.peripherals addObject:peripheral];
     40     }
     41 }
     42 
     43 /** 模拟连接所有的外设 */
     44 - (void)connect{
     45     //从保存的外设中取出所有的外设连接(也可以连接指定的外设)
     46     for (CBPeripheral *peripheral in self.peripherals) {
     47         /**  连接外设 */
     48         [self.mgr connectPeripheral:peripheral options:nil];
     49     }
     50 }
     51 
     52 /**
     53  *  连接外设成功调用
     54  */
     55 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
     56     // 扫描外设中得服务
     57     [peripheral discoverServices:nil];
     58 }
     60 
     61 /**
     62  *  连接外设失败调用
     63  */
     64 - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{
     65 }
     66 
     67 #pragma mark - CBPeripheralDelegate代理方法
     68 /**
     69  *  只要扫描到外设的服务就会调用
     70  *
     71  *  @param peripheral 服务所在的外设
     72  */
     73 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
     74     // 获取外设中所有扫描到得服务
     75     NSArray *services = peripheral.services;
     76     for (CBService *service in services) {
     77         // 拿到需要的服务
     78         if ([service.UUID.UUIDString isEqualToString:@"123456789abc"]) {
     79             // 从需要的服务中查找需要的特征
     80             // 从peripheral中得service中扫描特征
     81             [peripheral discoverCharacteristics:nil forService:service];
     82         }
     83     }
     84 }
     85 /**
     86  *  只要扫描到特征就会调用
     87  *
     88  *  @param peripheral 特征所属的外设
     89  *  @param service    特征所属的服务
     90  */
     91 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
     92 {
     93     // 拿到服务中所有的特诊
     94     NSArray *characteristics =  service.characteristics;
     95     // 遍历特征, 拿到需要的特征处理
     96     for (CBCharacteristic *characteristic in characteristics) {
     97         if ([characteristic.UUID.UUIDString isEqualToString:@"edg"]) {
     98             与外设的做数据交互的部分代码
     99         }
    100     }
    101 } 
    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    Delphi操作Excel大全
    一名Delphi程序员的开发习惯
    七维互联(www.7wei.com)
    Android开发数据库三层应用-DataSnap
    如何破解excel宏的密码
    让Delphi的DataSnap发挥最大效率
    使用 TRegistry 类[1]: 显示各主键下的项
    ini 文件操作记要(1): 使用 TIniFile
    Delphi经验总结(1)
    Delphi经验总结(2)
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/5301793.html
Copyright © 2011-2022 走看看