swift - 有选择地连接到特定外围设备上的蓝牙服务
问题描述
我的(室内自行车)智能训练器和曲柄功率计(单独)宣传一些服务
室内教练:
Primary - Service - Cycling Power Service (1818)
- Characteristic - Cycling Power
Primary - Service - Fitness Control (FTMS)
- Characteristic - Cycling Power
- Trainer Target Power (from user)
曲柄功率计:
Primary - Service - Cycling Power Service (1818)
- Characteristic - Cycling Power
使用自行车功率服务 (1818),它会宣传传输的功率数据,但无法控制训练器的阻力。
使用 FTMS,它会宣传传输功率,并有办法向其发送目标功率(训练器阻力控制)
当 CoreBluetooth 连接到我的室内教练设备时,它(我当前的代码)将自动列出这两个服务并连接到它。(这不是我想要的)
当我连接到室内训练器时,我当然可以删除 Cycling Power (1818) 服务,但这是不希望的,因为这会删除任何连接到仅提供循环功率服务的其他外围设备的能力
var services = [serviceHeartRateCBUUID,
serviceCyclingSpeedAndCadenceUUID,
serviceCyclingPowerUUID,
serviceFTMSUUID]
centralManager.scanForPeripherals(withServices: services)
扫描后,我连接到外围设备并发现它使用的服务(传递我感兴趣的服务列表,其中又包括 FTMS 和循环电源服务)有了这个,我最终得到了 2 个连接到室内教练(而不是我想要的 1 个)
peripheral.discoverServices(services)
问: 我正在寻找的解决方案是只能连接到室内训练器上的 FTMS 服务,同时还能够连接到曲柄功率计。
我正在考虑的解决方法基本上是让用户能够在 FTMS 与 Cycling Power Meter 之间进行选择,从而如果用户同时连接了室内训练器和曲柄功率计。
搜索 stackoverflow 和 goggle 并没有给我带来任何有用的东西,它们都只是展示了如何连接到服务(通过在上面的示例中列出“服务”变量)
更新1:
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard let services = peripheral.services else { return }
for service in services {
print(" >> Discover Services Found : \(service.uuid) service")
peripheral.discoverCharacteristics(nil, for: service)
}
}
在 didDiscoverServices 函数中,通过服务循环找到这 2 个
>> Discover Services Found : 1818 service
>> Discover Services Found : FTMS service
之后它调用peripheral.discoverCharacteristics(nil, for: service)
如何使用来自didDiscoverServices
(一旦检测到 FTMS 和 1818)的信息来实际忽略 1818?
解决方案
假设功率计和室内训练器是两个独立的蓝牙设备,那么应该没有任何问题。
BLE 的工作方式是中央连接到外围设备,然后您可以在该外围设备上发现服务,并使用/不使用您想要的任何东西。
因此,您可以继续扫描您想要的所有外围设备(无论它们宣传什么),然后连接、发现服务/特征 - 并使用您想要的任何组合/排列。
如果您有兴趣节省一点电量,并可能清理代码,在连接到外围设备时,您可以有选择地发现服务(https://developer.apple.com/documentation/corebluetooth/cbperipheral/1518706-discoverservices) -并且您基本上可以通过这种方式处理您的服务过滤。
推荐阅读
- r - 为什么我在 Rstudio 中的函数没有输出?
- websocket - Elixir:在 websocket 初始化时返回自定义错误
- android - 更改底部导航栏项的颜色
- c# - 文本框上的 WPF 扩展器列表视图
- python - 无法替换 sqlite 中的一行,但我可以插入它
- spring - 在 STS 中创建 spring starter 时 POM.xml 出错
- java - 从 RecyclerView Adapter 中的 Room Persistence 库中查询数据
- ios - 使用自定义 UITableViewCells 并使用 Swift 数组复制它们
- javascript - firebase 云功能不更新数据
- c# - ML.NET IDataView 返回 csv