iOS蓝牙协议

本文介绍了iOS蓝牙通信的基础知识,包括GATT Profile、角色定义、服务和特征的概念,以及蓝牙通信流程。详细阐述了中心模式的使用,包括连接、扫描、数据读写、订阅、断开连接的步骤,同时提供了最佳实践,如只扫描需要的peripheral、正确设置扫描选项、适时断开连接等。此外,还讨论了数据读写的细节,如检查设备权限、写入后的回调,以及如何实现数据的自动连接和OTA固件升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • 在iOS开发过程中,在与一些硬件设备通信时,不可避免的要使用蓝牙,开发使用CoreBluetooch框架,BLE蓝牙4.0,那么蓝牙是怎么通信的呢?
  • 目前所有的 BLE 应用都基于 GATT建立连接,两个BLE设备,通过 Service 和 Characteristic 进行通信

认识

  • MFi:make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用 ExternalAccessory 框架。认证流程挺复杂的,而且对公司的资质要求较高,无限制。
  • BLE:buletouch low energy,蓝牙 4.0 设备因为低耗电,所以也叫做 BLE,开发使用 CoreBluetooth 框架。
  • GATT Profile(Generic Attribute Profile):GATT 配置文件是一个通用规范,用于在 BLE 链路上发送和接收被称为 “属性”(Attribute)的数据块。目前所有的 BLE 应用都基于 GATT。
    1,定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。
    2,GATT 连接是独占的。基于 GATT 连接的方式的,只能是一个外设连接一个中心设备。
    3,配置文件是设备如何在特定的应用程序中工作的规格说明,一个设备可以实现多个配置文件。
  • GAP(Generic Access Profile):用来控制设备连接和广播,GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
    1,GATT 连接,必需先经过 GAP 协议。
    2,GAP 给设备定义了若干角色,主要两个:外围设备(Peripheral)和中心设备(Central)。
    3,在 GAP 中外围设备通过两种方式向外广播数据:Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复)。
  • Profile:并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG(一个以制定蓝牙规范,以推动蓝牙技术为宗旨的跨国组织)或者外设设计者预先定义的 Service 的集合。
  • Service:服务,是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,可以自己设置。每个外设会有很多服务,每个服务中包含很多字段,这些字段的权限一般分为读 read,写 write,通知 notiy 几种,就是我们连接设备后具体需要操作的内容。
  • Characteristic:特征,GATT 事务中的最低界别,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。与 Service 类似,每个 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一标识。每个设备会提供服务和特征,类似于服务端的 API,但是机构不同。
  • Description:每个 Characteristic 可以对应一个或多个 Description 用户描述 Characteristic 的信息或属性。
  • Central、Peripheral:中心设备和外围设备,发起连接的是 Central,被连接的设备为 Peripheral。

案例

通信准备

以一个大厂蓝牙门锁项目为例:

  • 首先要分清那个是中心设备,哪个是外围设备,这取决于通信需求,对于iOS门锁项目来说,iOS的App是作为contral需要数据,门锁是作为peripheral外围设备 提供数据
  • 然后peripheral就是不断发送广播,希望被central中心设备找到,广播信息中包含设备名字,设备信号强度等等,如果是温度调节器,广播信息中就包含当前设备温度
  • 然后central中心设备的作用则是去扫描寻找,找到需要连接的peripheral
  • 当central与需要连接的peripheral成功连接,便可获取peripheral提供的所有service服务和characteristic特征。通过对characteristic的数据进行读写,便可以实现central与peripheral的通信
  • 作为 peripheral,那么它提供的主要方法则是对 service 的管理,同时还兼备着向 central 广播数据的功能。peripheral 同样会对 central 的读写要求做出相应。
    在这里插入图片描述

通信流程

  • 中心模式(CBCentralManager)流程:
    1、建立中心角色
    2、扫描外设(discover)
    3、连接外设(connect)
    4、扫描外设中的服务和特征(discover)
    4.1 获取外设的 services
    4.2 获取外设的 Characteristics,获取 Characteristics 的值,获取 Characteristics 的 Descriptor 和 Descriptor 的值
    5、与外设做数据交互(explore and interact)
    6、订阅 Characteristic 的通知
    7、断开连接(disconnect)
  • 外设模式(CBPeripheralManager)流程:
    1、启动一个 Peripheral 管理对象
    2、设置本地 Peripheral 服务、特性、描述、权限等等
    3、设置 Peripheral 发送广播
    4、设置处理订阅、取消订阅、读 characteristic、写 characteristic 的委托方法

中心模式的使用

中心模式的应用场景:主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用。一般来说,外设(蓝牙设备,比如智能手环之类的东西)会由硬件工程师开发好,并定义好设备提供的服务,每个服务对于的特征,每个特征的属性(只读,只写,通知等等)。

蓝牙程序需要使用真机调试。

4.1 App 连接外设的实现

  • 1、建立中心角色
    导入 CoreBluetooth 头文件,建立中心设备管理类,设置主设备委托。
  • 2、扫描外设(discover)
    1,扫描外设的方法需要放在 centralManager 成功打开的代理方法 - (void)centralManagerDidUpdateState:(CBCentralManager *)central 中,因为只有设备成功打开,才能开始扫描,否则会报错。
    2,扫描到外设后会进入代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI;中。
  • 3、连接外设(connect)
    1,对要连接的设备需要进行强引用,否则会报错。
    2,一个主设备最多能连 7 个外设,每个外设最多只能给一个主设备连接,连接成功,失败,断开会进入各自的代理方法中。
  • 4、扫描外设中的服务和特征(discover)
    设备连接成功后,就可以扫描设备的服务了,同样是通过委托形式,扫描到结果后会进入委托方法。但是这个委托已经不再是主设备的委托(CBCentralManagerDelegate)&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☆MOON

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值