iOS 蓝牙开发“中心模式下的编程从属关系”

手机端作为中心角色

iOS 蓝牙开发“中心模式下的编程从属关系”_第1张图片
中心角色.png

iOS 蓝牙开发“中心模式下的编程从属关系”_第2张图片
手机端作为中心角色
  1. 建立中心角色
  2. 扫描外设(discover)
  3. 连接外设(connect)
  4. 扫描外设中的服务和特征(discover)
  • 4.1 获取外设的services
  • 4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
  1. 与外设做数据交互(explore and interact)
  2. 订阅Characteristic的通知
  3. 断开连接(disconnect)

CBCentralManagerDelegate 中心代理。

  • iOS 蓝牙开发“中心模式下的编程从属关系”_第3张图片
    DASH文档中的截图.png

CBPeripheralDelegate 外设代理

  • iOS 蓝牙开发“中心模式下的编程从属关系”_第4张图片
    1
  • iOS 蓝牙开发“中心模式下的编程从属关系”_第5张图片
    2

FAQ

  • 广播出去的UUID为什么有出现单个设备两个UUID的?
  • service UUID 0x180A下的 characteristic UUID为什么不是数字而是字符串?描述的UUID也有可能是字符串不是数字?
//SERVICE UUID = 180A
-----扫描到特征, service UUIDData = <180a>, data = 180A;;;;; 的 Characteristic = Manufacturer Name String-----
//其他UUID
-----扫描到特征, service UUIDData = <49535343 fe7d4ae5 8fa99faf d205e455>, data = 49535343-FE7D-4AE5-8FA9-9FAFD205E455;;;;; 的 Characteristic = 49535343-6DAA-4D02-ABF6-19569ACA69FE-----

外设广播的内容,大部分可以不需要关注。单个设备广播出多个UUID是正常的。而真正我们需要关注的service UUID是在中心和外设连接上后读到的。如下两张图


iOS 蓝牙开发“中心模式下的编程从属关系”_第6张图片
广播

iOS 蓝牙开发“中心模式下的编程从属关系”_第7张图片
注意点
  • 为什么有UUID了,还需要一个MAC去识别?

UUID有可能是重复的,而MAC是唯一的。

  • MAC和网络的MAC是同一个概念吗?要如何获取?
  1. 是同一个东西,MAC是一个6个字节(48bit)的数.中间用冒号隔开。如xx:xx:xx:xx:xx:xx.前三个字节是IEEE授权的,后三个字节是厂家指定的。但是我们的mpos产品,其实mac是自己指定的。
  2. BLE配对过程,设备是有将MAC广播出去的,Android的设备可以获取到,但iOS似乎不行。
  3. 有一些厂家会将mac写在UUID的某个值中,如指定的 service UUID 0x180A内容的characteristic UUID 0x232A 用来存放mac. 但并不是所有的厂家都会将mac写在这里面。iOS的api是无法获取到Mac地址的。
  • CBUUID和NSUUID的区别
    • CBPeer有一个属性NSUUID *identifier,他的子类 --> CBPeripheral,CBCentral
    • CBAttribute一个属性CBUUID,他的的子类 --> CBService,CBCharacteristic,CBDescriptor
      若需要获取到UUID,要使用 CBUUID.UUID.UUIDString

个人理解,我们传统意义上的UUID都是CBAttribute的那些子类:服务,特征,描述这些里面呈现的UUID。我们连接蓝牙设备的时候,也是通过他的service暴露出来的service.UUID来识别设备的UUID.至于外设和中心体现出来的identifier,文档中有下面一段话

Peers are identified by NSUUID UUIDs instead of by the CBUUID objects that identify a peripheral’s services, characteristics, and characteristic descriptors.

  • 数据的读分为两种,一种是直接读(reading directly),另外一种是订阅(subscribe)。有什么区别?

使用read还是subscribe,一个看具体应用,一个看特征本身的属性 character.properties

enum {  
     CBCharacteristicPropertyBroadcast = 0x01,  
     CBCharacteristicPropertyRead = 0x02,  
     CBCharacteristicPropertyWriteWithoutResponse = 0x04,  
     CBCharacteristicPropertyWrite = 0x08,  
     CBCharacteristicPropertyNotify = 0x10,  
     CBCharacteristicPropertyIndicate = 0x20,  
     CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,  
     CBCharacteristicPropertyExtendedProperties = 0x80,  
     };

读取方式是根据 [self.character.properties & CBCharacteristicPropertyWriteWithoutResponse]来判断他的类型。

  • 写数据分为往特征characteristic写和往描述descriptor写,区别是什么?
    • writeValue:forCharacteristic:type:
      type类型包括两个:
      • CBCharacteristicWriteWithResponse 需要返回指示
      • CBCharacteristicWriteWithoutResponse 不需要返回指示
    • writeValue:forDescriptor:
      需要配合回调,提示写描述是否成功。 setNotifyValue:forCharacteristic:可以控制是否接收写入成功与否。

你可能感兴趣的:(iOS 蓝牙开发“中心模式下的编程从属关系”)