Icon

RVS_BlueThoth

这是一个底层的、原生 Swift Bluetooth SDK,用于实现 "Central" (客户端) Core Bluetooth (BLE) 功能。

它抽象了使用 Core Bluetooth 时一些比较“繁琐”的方面,允许应用程序轻松实现蓝牙客户端功能。

这是此项目的 GitHub 仓库。

这是项目的技术文档。

该项目解决了什么问题?

实现 Apple Core Bluetooth SDK 可能是一个相当繁琐的过程。例如,发现 服务 (Services)特征 (Characteristics)描述符 (Descriptors) 可能会非常复杂和耗时。RVS_BlueThoth 在“后台”处理这些问题,让您可以专注于为应用程序或 SDK 的用户提供更丰富的体验。

底层 SDK

RVS_BlueThoth 并非真正设计为应用程序层系统的直接依赖项(尽管在 测试工具 中已经展示了这种用法)。相反,它被设计为特定于应用程序的 "外观 (Façade)" 层的基础,例如 OBD 适配器或 mesh 设备 驱动程序。

超高质量

RVS_BlueThoth 背后的基本理念是它是一个基础架构元素,因此,它需要尽可能地具有最高质量。我们已经尽一切努力确保它能够完美运行。

许可证

RVS_BlueThoth 是 100% 开源的、MIT 许可的代码。

您可以随意使用它,但请注意,我们没有义务支持该项目,并且不对它是否适合您的用途提供任何保证。

要求

外部依赖项

此项目需要使用 Swift Package Manager (SPM)

如果您不熟悉 SPM,这一系列文章 可能会有所帮助。

RVS_BlueThoth 有一个外部构建依赖项:RVS_Generic_Swift_Toolbox 项目(也由 The Great Rift Valley Software Company 编写和支持)。如果您希望构建 测试工具,那么您还需要 RVS_PersistentPrefs 项目

包含的 XCode 工作区 已经包含这些依赖项。

仅限原生 Swift

RVS_BlueThoth 是一个完全原生的 Swift SDK。 它不与 Objective-C 接口。

RVS_BlueThoth 将在所有 Apple 操作系统上运行(iOS/iPadOSMacOStvOSWatchOS)。它可以被合并到针对这些环境中的任何一个的项目中。

静态库

SPM 构建作为静态库提供,而不是作为 动态框架 提供。 RVS_BlueThoth 是一个相当“轻量级”的代码库,并且可能是任何给定项目中较小的组件之一。 如果您更喜欢动态库,可以在项目的 Package.swift 文件 中轻松更改。 SDK 中没有资源或非代码组件。 这是一个简单的可执行代码库。

无法在模拟器上工作

应该注意的是,Core Bluetooth 需要使用设备,而不是模拟器。该库将无法在模拟器上工作,并注册蓝牙不可用错误。

测试

RVS_BlueThoth 没有实现 单元测试。相反,它提供了四个 测试工具应用程序;每个支持的平台一个(iOS/iPadOSMacOStvOSWatchOS)。

这是一篇解释使用测试工具背后的理念的文章。

测试工具应用程序是严肃的代码

每个测试工具应用程序都是一个完全合格的、"为 App Store 发布做好准备" 的应用程序。它们充当“蓝牙嗅探器”应用程序。 事实上,iOS 测试工具 实际上已经转换为 iOS App Store 上发布的应用程序这是源代码)。

在学习实现 SDK 时,它们应该提供出色的“起点”。

实现

安装

如前所述,您应该使用 Swift Package Manager (SPM) 将项目导入到您自己的项目中。如果您不确定如何操作,那么 这篇文章可能会很有帮助

SSH GitHub URI 是 git@github.com:RiftValleySoftware/RVS_BlueThoth.git,HTTPS GitHub URI 是 https://github.com/RiftValleySoftware/RVS_BlueThoth.git)。

安装包后,您需要通过将以下内容添加到文件的开头,将模块导入到任何使用它的文件中。

import RVS_BlueThoth

需要委托 (Delegate)

RVS_BlueThoth 实现了 委托模式 (Delegate pattern)(但更像 观察者 (Observer))。

为了降低 SDK 的复杂性,我们创建了 一个“瓶颈”委托协议,用于处理来自 SDK 的所有响应。

如果您正在 RVS_BlueThoth 上实现一个以应用程序为中心的层,那么您可能需要考虑将其划分为观察者或绑定。 这取决于您。 为了使用 SDK,您需要有一个可以处理各种回调并相应地调度它们的单个委托。

委托是“单向的”,就像一个观察者。 它接收来自 SDK 的回调,并且不以任何方式响应。

所有委托回调都在主线程中。

委托需要是一个类(而不是结构体),并且从 SDK 内部弱引用(这意味着您需要确保它保持存在)。

四个测试工具中委托的示例位于以下源文件中

创建实例

我们首先实例化 RVS_BlueThoth 类

CGA_AppDelegate.centralManager = RVS_BlueThoth(delegate: self)

此示例来自 tvOS 测试工具

请注意,我们立即提供了委托。 它可能会很快收到回调,表明蓝牙系统已设置完毕,并准备好开始扫描外围设备。

扫描外围设备

蓝牙系统准备就绪后,我们可以开始扫描外围设备(也来自 tvOS 测试工具

centralManager?.scanCriteria = scanCriteria
centralManager?.minimumRSSILevelIndBm = prefs.minimumRSSILevel
centralManager?.discoverOnlyConnectablePeripherals = prefs.discoverOnlyConnectableDevices
centralManager?.allowEmptyNames = prefs.allowEmptyNames
centralManager?.startScanning(duplicateFilteringIsOn: !prefs.continuouslyUpdatePeripherals)

可以设置一些属性来控制如何处理发现的外围设备。

从这里开始,最好使用 API 文档 或 [深入的技术文档](技术文档)。

报告问题

如果您有任何错误、功能请求、反馈等,请随时 打开一个 GitHub issue,或 直接联系我们