我当前的项目是一个使用蓝牙速度传感器的简单自行车里程表应用程序。 我使用“Wahoo”、“Xoss”、“CycPlus”传感器(外设)进行测试。 应用程序适用于 ios - iPhone。
应用程序运行良好 - 使用 CoreBluetooth - 简化流程
初始化中央管理器
扫描具有服务的外围设备
使用确实发现外围设备>连接到外围设备
使用连接外围设备>发现服务
使用did discovery服务>发现特征
使用确实发现特征>将外围设备的通知设置为"is"
使用 did update 特征值 > 提取我的数据并计算里程
一切正常 - 只要自行车继续行驶。但是,当外围设备(bt 传感器)在几分钟的休息时间内停止广播时,外围设备就会断开连接 - 正如它应该的那样。
问题是,如果附近有另一辆配备蓝牙的自行车启动,应用程序将尝试连接到其他外围设备。
我怎样才能 -
- 确保仅重新连接到原始外围设备。
或
- 确保我永远不会与原始外围设备断开连接。
谢谢
JDay
最佳答案
保罗w11
我很抱歉发表评论作为答案 - 太多了。
感谢您的建议。我已经使用了你的关键元素,并根据我未提及的细节进行了一些调味。我相信根据您的指导我有一个可行的解决方案。
我只是在第一次连接时获取并保存 CBUUID,而不是 retrievePeripheralWithIdentifiers
。
然后在连接时,我会过滤传入的外设以匹配原始 CBUUID。
我相信我确实需要使用扫描,而不仅仅是连接,因为我不知道骑手何时 将再次开始移动。我不想让骑手按下按钮。我需要继续扫描才能检测到他的 Action 。
这是我添加的代码的要点:
...in implementation
bool preferredPeripheralExists = false;
...in peripheral didDiscoverCharacteristicsForService
NSString *founduuid = [NSString stringWithFormat:@"%@", [peripheral.identifier UUIDString]] ;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:founduuid forKey:@"rememberFoundUUID"];
[prefs synchronize];
preferredPeripheralExists = true ;
... in didDiscoverPeripheral
NSString *newuuid = [NSString stringWithFormat:@"%@", [peripheral.identifier UUIDString]] ;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *olduuid = [prefs objectForKey:@"rememberFoundUUID"] ;
if ((!preferredPeripheralExists) || (preferredPeripheralExists && [newuuid isEqualToString:olduuid])){
if (self.discoveredPeripheral != peripheral) {
self.discoveredPeripheral = peripheral;
[self.centralManager connectPeripheral:peripheral options:nil];
} // if self
} // if !preferred
关于您对设置屏幕和外围设备的用户选择的评论 -
我的流程方案基于苹果开发者网站上的示例 xcode 项目。这没有提及设置界面。此外,Ray Wenderlich 蓝牙心脏监测器项目不包括用户选择设备的功能。
不包含设备选择屏幕是否被认为是不好的做法?
谢谢
J.Day
关于ios - 如何确保蓝牙应用程序仅连接到原始外围设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821210/