iOS全解7:蓝牙/音频/视频

在 iOS 中,蓝牙技术主要用于设备之间的无线通信。苹果提供了 Core Bluetooth 框架来支持蓝牙通信,开发者可以利用该框架实现蓝牙设备的扫描连接数据传输等功能。以下是对 iOS 中蓝牙的原理和实现的详细说明。

一、蓝牙技术的基本原理

蓝牙是一种短距离无线通信技术,工作在 2.4 GHz 频段。它支持一对一一对多的通信方式,常用于手机、耳机、智能手表、传感器等设备之间的数据传输。

在 iOS 中,蓝牙通信基于 BLE(Bluetooth Low Energy) 技术,也称为 Bluetooth 4.0 或更高版本。BLE 的特点是低功耗,适合需要长时间运行的设备。

1. 蓝牙通信的流程

蓝牙通信的基本概念

  • 中心设备(Central):主动扫描并连接外围设备的设备。
  • 外围设备(Peripheral):广播其存在并响应中心设备连接请求的设备。
  • 服务(Service):外围设备提供的功能集合,每个服务包含一个或多个特征。「服务通过一个唯一的 UUID 标识」
  • 特征(Characteristic):服务的具体数据单元,用于数据的读写操作。
  • 描述符(Descriptor):特征的附加信息,如单位或格式。
2 数据传输方式

读取(Read):Central 从 Peripheral 读取数据。
写入(Write):Central 向 Peripheral 写入数据。
通知/指示(Notify/Indicate):Peripheral 主动向 Central 发送数据(Notify 不需要确认,Indicate 需要确认)。


iOS 蓝牙通信的实现步骤

  1. 导入 Core Bluetooth 框架,并设置代理以接收蓝牙事件:
    import CoreBluetooth
    let centralManager = CBCentralManager(delegate: self, queue: nil)

  2. 扫描:外围设备
    在中心管理器的状态为 .poweredOn 时,调用 scanForPeripherals 方法开始扫描:
    centralManager.scanForPeripherals(withServices: nil, options: nil)
    扫描结果通过 centralManager(_:didDiscover:advertisementData:rssi:) 代理方法返回。

  3. 连接:外围设备
    使用 connect方法连接发现的外围设备:
    centralManager.connect(peripheral, options: nil)
    连接结果通过 centralManager(:didConnect:) 和 centralManager(:didFailToConnect:error:) 代理方法处理。

  4. 发现:服务和特征
    \color{SeaGreen}{\small 连接成功后},调用外围设备的 discoverServices方法 「查找服务」
    peripheral.discoverServices(nil)
    在 peripheral(_:didDiscoverServices:) 代理方法中,遍历服务并调用 discoverCharacteristics方法「查找特征」
    peripheral.discoverCharacteristics(nil, for: service)

  5. 读/写数据
    对于可读特征,使用 readValue 方法读取数据:
    peripheral.readValue(for: characteristic)
    对于可写特征,使用 writeValue 方法写入数据:
    peripheral.writeValue(data, for: characteristic, type: .withResponse)
    数据更新通过 peripheral(_:didUpdateValueFor:error:) 代理方法接收。

  6. 订阅特征通知
    对于支持通知的特征,设置通知以接收数据更新:
    peripheral.setNotifyValue(true, for: characteristic)
    当特征值更新时,将触发 peripheral(_:didUpdateValueFor:error:) 代理方法。

  7. 断开连接
    调用 cancelPeripheralConnection方法断开连接:
    centralManager.cancelPeripheralConnection(peripheral)
    断开连接事件通过 centralManager(_:didDisconnectPeripheral:error:) 代理方法处理。

通过上述步骤,开发者可以在 iOS 应用中实现蓝牙通信功能,支持设备扫描、连接、数据读写和通知订阅等操作


举例说明

1.服务(Service)「相当于类」

服务通过一个唯一的 UUID 标识,可以是标准的 UUID(由蓝牙技术联盟定义)或自定义的 UUID。
一个外设可以包含多个服务,每个服务代表一个独立的功能模块。

例子:

假设有一个智能手环,它可能提供以下服务:

  • 心率服务(Heart Rate Service):用于测量和传输心率数据。
  • 电池服务(Battery Service):用于报告设备的电池状态。
  • 设备信息服务(Device Information Service):用于提供设备的制造商、型号等信息。

每个服务都有一个唯一的 UUID。例如:

  • 心率服务的标准 UUID 是 0x180A。
  • 电池服务的标准 UUID 是 0x180B。
  • 设备服务的标准 UUID 是 0x180C。

2. 特征(Characteristic)「相当于属性」

特征是服务中的具体数据点,用于存储或传输实际的数据。
每个特征也有一个唯一的 UUID,可以是标准的或自定义的。
特征包含以下属性:
值(Value):实际的数据,例如心率值、电池电量等。
权限(Permissions):定义特征是否可读、可写或可通知。
属性(Properties):定义特征支持的操作类型,例如读取、写入、通知等。



三、音频

  • 编码/解码格式
  1. 无损压缩:FLAC、ALAC、APE
  2. 有损压缩:\color{#C71585}{\small MP3}、AAC、OGG Vorbis、WMA
  3. 未压缩:WAV、AIFF
  4. 其他:MIDI、DSD
  • 视频文件格式
  • 视频封装格式
  • 视频编解码方式

一.视频相关概念
1.1 视频文件格式
文件格式这个概念应该是我们比较熟悉的,比如我们常见的 Word 文档的文件格式是 .docJPG 图片的文件格式是 .jpg 等等。那对于视频来说,
我们常见的文件格式则有:.mov.avi.mpg.vob.mkv.rm.rmvb 等等。文件格式通常表现为文件在操作系统上存储时的后缀名,它通常会被操作系统用来与相应的打开程序关联,比如你双击一个 test.doc 文件,系统会调用 Word 去打开它。你双击一个 test.avi 或者 test.mkv 系统会调用视频播放器去打开它。

同样是视频,为什么会有 .mov、.avi、.mpg 等等这么多种文件格式呢?****那是因为它们通过不同的方式实现了视频这件事情,至于这个不同在哪里,那就需要了解一下接下来要说的「视频封装格式」这个概念了。



未完待续。。。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容