zoukankan      html  css  js  c++  java
  • iOS 蓝牙开发之(CoreBlueTooth)

    CoreBlueTooth

    简介:

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

    iPhone的设备必须是4S或者更新

    iPad设备必须是iPad mini或者更新

    iOS的系统必须是iOS 6或者更新

    蓝牙4.0以低功耗著称,所以一般被称为BLE(bluetooth low energy)

    核心概念

    CBCenterManager:中心设备(用来连接到外部设备的管家)

    CBPeripheralManager:外部设备(第三方的蓝牙4.0设备 用来扫描服务和服务特征)

    开发步骤

    1.建立中心管家

    #import <CoreBluetooth/CoreBluetooth.h>
    
    @interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
    //中心管家
    @property (nonatomic,strong) CBCentralManager *manager;
    //存储扫描到的外部设备
    @property (nonatomic,strong) CBPeripheral *peripheral;
    
    @end
    /*
     1.建立中心管家
     2.扫描外部设备
     3.连接外部设备
     4.扫描服务和特征
     5.数据交互
     6.断开连接
     */
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //建立中心管家 queue 填空 默认为主线程
        CBCentralManager *manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
        self.manager = manager;
    }

    2.扫描外设

    //在代理方法中扫描外部设备
    - (void)centralManagerDidUpdateState:(CBCentralManager *)central {
        //在开机状态下才能扫描外部设备
        if (central.state == CBManagerStatePoweredOn) {
            //扫描外部设备的哪些服务
            //scanForPeripheralsWithServices 传空的话 可以扫描外部所有可以发现的设备 否则只扫描传入的相应ID的设备
            [self.manager scanForPeripheralsWithServices:nil options:nil];
        }
    }

    3.连接外设

    //已经找到了外部设备 连接外部设备 我们也可以保存这些外部设备到一个数组 这里不做操作 也可以在这里对外部设备进行筛选
    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
        
        NSLog(@"peripheral = %@",peripheral);
        //保存外部设备
        self.peripheral = peripheral;
        self.peripheral.delegate = self;
        //连接外部设备 
        [self.manager connectPeripheral:peripheral options:nil];
    }

    外设连接成功

    //已经连接到了外部设备  开始扫描该设备服务
    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
        
        //扫描设备的服务 调用CBPeripheralDelegate
        [self.peripheral discoverServices:nil];
    }

    4.扫描外设服务和特征

    每个蓝牙4.0的设备都是通过服务和特征来展示自己的,一个设备必然包含一个或多个服务 一个服务包含一个或多个特征。

    #pragma mark - CBPeripheralDelegate
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
        //扫描到的服务
        NSLog(@"扫描到的服务:%@",peripheral.services);
        
        
        for (CBService *service in peripheral.services) {
            //由于有很多服务 我们可以去特定的服务 做特定的功能
    //        if ([service.UUID.UUIDString isEqualToString:@"Battery"]) {
    //            [self.peripheral discoverCharacteristics:nil forService:service];
    //        }
            //扫描服务特征
            [self.peripheral discoverCharacteristics:nil forService:service];
        }
    }

    发现服务对应的特征

    /**
     *  发现服务对应的特征
     */
    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
    {
        // 服务对应的特征
        NSArray *ctcs = service.characteristics;
        // 遍历所有的特征
        for (CBCharacteristic *character in ctcs) {
            // 根据特征的唯一标示过滤
            if ([character.UUID.UUIDString isEqualToString:@"XMG"]) {
                NSLog(@"可以吃饭了");
            }
        }
    }

    特征描述

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
        NSLog(@"descriptor = %@",characteristic.descriptors);
        for (CBDescriptor *descriptor in characteristic.descriptors) {
            //读取特征描述
            [self.peripheral readValueForDescriptor:descriptor];
        }
    }

    5.与外设做数据的交互 读或写

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
        if (error) {
            NSLog(@"更新特征值%@时发生错误:%@", characteristic.UUID, [error localizedDescription]);
            return;
        }
    // 收到数据
        [delegate didGetDataForString:[self hexadecimalString:characteristic.value]];
    //    NSLog(@"%@",[self hexadecimalString:characteristic.value]);
    }

    数据的转换

    我们接收到的数据,正是characteristic.value,这是一个NSData类数据,我们可以通过UTF8StringEncoding来转化为NSString,为了代码结构清晰,我专门把NSData和NSString互转写成了两个方法:

    //将传入的NSData类型转换成NSString并返回
    - (NSString*)hexadecimalString:(NSData *)data{
        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        return result;
    }
    //将传入的NSString类型转换成NSData并返回
    - (NSData*)dataWithHexstring:(NSString *)hexstring{
        NSData *aData;
        return aData = [hexstring dataUsingEncoding: NSASCIIStringEncoding];
    }

    写的比较基础,另附大神写的比较全面的蓝牙博客地址

    http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-0.html

  • 相关阅读:
    apache phoenix查询缓慢问题
    hbase replication原理分析
    ServerSocketChannel实现多Selector高并发server
    hbase hmaster故障分析及解决方案:Timedout 300000ms waiting for namespace table to be assigned
    mapreduce出现类似死锁情况
    【转】How-to: Enable User Authentication and Authorization in Apache HBase
    最近的一些杂念思考
    我究竟该成为什么样的一个人
    解决linux下 使用netcore生成图片报错的问题:The type initializer for 'Gdip' threw an exception
    linux 编译安装nginx
  • 原文地址:https://www.cnblogs.com/huanying2000/p/6561605.html
Copyright © 2011-2022 走看看