[分享] 蓝牙调试流程

灞波儿奔   2018-6-25 23:04 楼主
1,创建蓝牙工程
2,导入头文件
  #import
3,实现代理:
4,创建中心设备和外部设备数组,并初始化。


   中心设备和外设联机的文字描述为:


        1):iOS这边蓝牙中心管理器开始扫描广播包(扫描的时长可以自己写一个定时器控制,并且可以设定扫描的具体条件)
        2):外设开始广播(当然外设的广播时长也是可以设定的,这是硬件那边的事,不太懂)
        3):iOS发现有广播包,就请求连接外设(这是底层自动实现,我们不需要写代码),之后外设会接收到连接请求,如果外设接收这个连接请求,就会给iOS那边发送一个连接请求的确认包,当iOS这边收到这个包后,两边设备就完成了连接.
        4):连接成功之后IOS这边就可以读取外设的相关信息了,比如服务号CBService,特征值号CBCharacteristic,还有外设的一些硬件信息,电池电量,信号强度RSSI什么的.
        5):在正常连接的过程中总会出现点意外,如果两个设备突然断掉了连接,一般我们还是希望它们能够再次连接的,这里就得要看硬件和iOS程序里对于连接断开的处理代码了.
        6):外设和IOS端也可以主动发起断开连接的请求.
     //中心设备
     @property (nonatomic,strong)CBCentralManager *cBCenterMgr;
     //外部设备数组
     @property (nonatomic,strong)NSMutableArray *perpheralArray;


5,实现代理方法
    #pragma mark----CBCentralManagerDelegate
      //判断中心设备蓝牙开启状态,如果开启,则启动扫描。
                 这个方法主要是来检查IOS设备的蓝牙硬件的状态的,比如说设备不支持蓝牙4.0,或者说设备的蓝牙没有开启,没有被授权什么的,一般是确定了iOS设备的蓝牙处于打开的情况下,才应该执行扫描的动作,
      - (void)centralManagerDidUpdateState:(CBCentralManager *)central;
      //发现设备,如果发现设备,则加入中心设备数组。
      - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
      //链接蓝牙设备。
      - (void)connectPeripheral:(CBPeripheral *)peripheral options:(NSDictionary *)options;
             //取消连接设备。
      - (void)cancelPeripheralConnection:(CBPeripheral *)peripheral;
      //链接外设成功回调,在这个方法里,可以执行停止中心设备的扫描的操作。
               如果能回调到下面这个方法,说明已经成功连接外设了
      - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
      //断开外设后回调,在这个方法里,可以执行重连等操作。
      - (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error


    #pragma mark----CBPeripheralDelegate
       //扫描外设中的服务
      - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
      {
          [peripheral discoverCharacteristics:nil forService:service];
      }
       //扫描服务中的特征,在这个方法中,可以取到特定的特征。


                能进入到这个方法,说明已经读取到某个特征值UUID了,到达这一步,我们基本上也完成对外设的层层剥离了,接下来就是一些对某个特征值的读写操作了,当然我们首先要找到我们需要写数据的特征值UUID了,这里我们可以简单地通过循环来找出外设含有的某个特征值UUID。
      - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService          *)service error:(NSError *)error
      //中心读取外设实时数据
      - (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
      {
         if (characteristic.isNotifying) {
             [peripheral readValueForCharacteristic:characteristic];
          }
       }
       //检测中心向外设写数据是否成功
      -(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
      
        //获取外设发来的数据,不论是read和notify,获取数据都是从这个方法中读取。
      - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
      
6,设置通知,往特征里写数据。(写入数据和设置通知的特征是不同的两个特征),可以根据通过 characteristic.properties来查看各个特征的属性值,先设置通知,再写入值。
      - (void)setNotifyValue:(BOOL)enabled forCharacteristic:(CBCharacteristic *)characteristic;
      - (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;
7,取出从外设传来的数据。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复