在 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 蓝牙通信的实现步骤
导入 Core Bluetooth 框架,并设置代理以接收蓝牙事件:
import CoreBluetooth
let centralManager = CBCentralManager(delegate: self, queue: nil)扫描:外围设备
在中心管理器的状态为 .poweredOn 时,调用 scanForPeripherals 方法开始扫描:
centralManager.scanForPeripherals(withServices: nil, options: nil)
扫描结果通过 centralManager(_:didDiscover:advertisementData:rssi:) 代理方法返回。连接:外围设备
使用connect方法连接发现的外围设备:
centralManager.connect(peripheral, options: nil)
连接结果通过 centralManager(:didConnect:) 和 centralManager(:didFailToConnect:error:) 代理方法处理。发现:服务和特征
,调用外围设备的
discoverServices方法 「查找服务」:
peripheral.discoverServices(nil)
在 peripheral(_:didDiscoverServices:) 代理方法中,遍历服务并调用discoverCharacteristics方法「查找特征」:
peripheral.discoverCharacteristics(nil, for: service)读/写数据
对于可读特征,使用 readValue 方法读取数据:
peripheral.readValue(for: characteristic)
对于可写特征,使用 writeValue 方法写入数据:
peripheral.writeValue(data, for: characteristic, type: .withResponse)
数据更新通过 peripheral(_:didUpdateValueFor:error:) 代理方法接收。订阅特征通知
对于支持通知的特征,设置通知以接收数据更新:
peripheral.setNotifyValue(true, for: characteristic)
当特征值更新时,将触发 peripheral(_:didUpdateValueFor:error:) 代理方法。断开连接
调用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):定义特征支持的操作类型,例如读取、写入、通知等。
三、音频
-
编码/解码格式
- 无损压缩:FLAC、ALAC、APE
- 有损压缩:
、AAC、OGG Vorbis、WMA
- 未压缩:WAV、AIFF
- 其他:MIDI、DSD
- 视频文件格式
- 视频封装格式
- 视频编解码方式
一.视频相关概念
1.1 视频文件格式
文件格式这个概念应该是我们比较熟悉的,比如我们常见的 Word 文档的文件格式是 .doc,JPG 图片的文件格式是 .jpg 等等。那对于视频来说,
我们常见的文件格式则有:.mov、.avi、.mpg、.vob、.mkv、.rm、.rmvb 等等。文件格式通常表现为文件在操作系统上存储时的后缀名,它通常会被操作系统用来与相应的打开程序关联,比如你双击一个 test.doc 文件,系统会调用 Word 去打开它。你双击一个 test.avi 或者 test.mkv 系统会调用视频播放器去打开它。
同样是视频,为什么会有 .mov、.avi、.mpg 等等这么多种文件格式呢?****那是因为它们通过不同的方式实现了视频这件事情,至于这个不同在哪里,那就需要了解一下接下来要说的「视频封装格式」这个概念了。
未完待续。。。