美文网首页杏仁丶的iOS学习专题
iOS 蓝牙开发“中心模式下的编程从属关系”

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

作者: 黑羽肃霜 | 来源:发表于2016-09-18 11:28 被阅读438次

手机端作为中心角色

中心角色.png
手机端作为中心角色
  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 中心代理。

  • DASH文档中的截图.png

CBPeripheralDelegate 外设代理

  • 1
  • 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是在中心和外设连接上后读到的。如下两张图


广播
注意点
  • 为什么有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 蓝牙开发“中心模式下的编程从属关系”

    手机端作为中心角色 建立中心角色 扫描外设(discover) 连接外设(connect) 扫描外设中的服务和特征...

  • iOS 蓝牙开发 - swift版

    @[TOC](iOS 蓝牙开发 ) 1.蓝牙简介 蓝牙模式简介蓝牙开发分为两种模式,中心模式(central),和...

  • 蓝牙开发

    iOS蓝牙开发 Bluetooth蓝牙CoreBluetooth 蓝牙中心设备的实现 蓝牙外设的实现 有Demo ...

  • iOS蓝牙开发 Bluetooth蓝牙CoreBluetooth

    iOS蓝牙开发 Bluetooth蓝牙CoreBluetooth 蓝牙中心设备的实现 蓝牙外设的实现 有Demo ...

  • 最简单的iOS蓝牙开发

    iOS端的蓝牙开发,大部分都是采用中心模式,故此文章就详细说说iOS连接外设的代码实现(看了很多蓝牙相关的文章,某...

  • iOS蓝牙开发

    iOS蓝牙开发有三个框架 蓝牙开发有两种模式:1.手机作为中心设备,获取外设的数据2.手机作为外设,对外提供数据(...

  • iOS蓝牙开发

    iOS蓝牙开发是围绕着CoreBluetooth框架实现的 1.iOS开发的关键词 中心设备:用于扫描周围的蓝牙硬...

  • macOS-BLE蓝牙4.0开发

    macOS-BLE蓝牙4.0开发 !!!中心模式 !!! macOS的BLE程序代码和iOS差不多,只需要修改一些...

  • 【Objective-c】_蓝牙开发

    ios蓝牙开发学习笔记(一)蓝牙概述 ios蓝牙开发学习笔记(二)central角色的实现 ios蓝牙开发学习笔记...

  • iOS蓝牙开发(四):BabyBluetooth蓝牙库介绍

    iOS蓝牙开发(四):BabyBluetooth蓝牙库介绍 iOS蓝牙开发(四):BabyBluetooth蓝牙库介绍

网友评论

    本文标题:iOS 蓝牙开发“中心模式下的编程从属关系”

    本文链接:https://www.haomeiwen.com/subject/browettx.html