ios - 如何确保蓝牙应用程序仅连接到原始外围设备?

标签 ios objective-c bluetooth

我当前的项目是一个使用蓝牙速度传感器的简单自行车里程表应用程序。 我使用“Wahoo”、“Xoss”、“CycPlus”传感器(外设)进行测试。 应用程序适用于 ios - iPhone。

应用程序运行良好 - 使用 CoreBluetooth - 简化流程

  • 初始化中央管理器

  • 扫描具有服务的外围设备

  • 使用确实发现外围设备>连接到外围设备

  • 使用连接外围设备>发现服务

  • 使用did discovery服务>发现特征

  • 使用确实发现特征>将外围设备的通知设置为"is"

  • 使用 did update 特征值 > 提取我的数据并计算里程

一切正常 - 只要自行车继续行驶。但是,当外围设备(bt 传感器)在几分钟的休息时间内停止广播时,外围设备就会断开连接 - 正如它应该的那样。

问题是,如果附近有另一辆配备蓝牙的自行车启动,应用程序将尝试连接到其他外围设备。

我怎样才能 -

  1. 确保仅重新连接到原始外围设备。

  1. 确保我永远不会与原始外围设备断开连接。

谢谢

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/

相关文章:

iphone - 无法创建模型错误为 nil 的 NSPersistentStoreCoordinator

ios - 如何确定HKQuantitySample数量类型?

java - 扫描蓝牙设备

java - 如何使用java访问linux蓝牙堆栈

ios - 使用预处理器宏,如何更改开发、暂存和生产环境的文件名?

ios - 在 Swift Xcode 中使用其他文件中的函数

ios - (快速)当 AudioStreamPacketDescription 为 nil 时调试 CrashIfClientProvidedBogusAudioBufferList 的方法?

ios - 以 float 大小绘制 UIImage

iphone - 滚动表格 View 后出现图像 (AFNetworking)

具有多项 Activity 的Android蓝牙服务