如何使用核心蓝牙 sdk 扫描蓝牙设备?
Posted
技术标签:
【中文标题】如何使用核心蓝牙 sdk 扫描蓝牙设备?【英文标题】:how can scan bluetooth devices using core bluetooth sdk? 【发布时间】:2015-03-27 11:25:07 【问题描述】:我目前正在创建一个可以使用蓝牙设备的 iPhone 应用程序(Xcode 6.2、ios 8.2)!此应用程序的主要目标是仅搜索可用的蓝牙设备,每当您从蓝牙设备超出范围时,就会弹出一条警报消息。当您进入范围时自动连接。
我在这里看到的唯一解决方案(将我的应用保留在 AppStore 上)是尝试扫描可用的蓝牙设备!
我尝试使用 CoreBluetooth 框架,但我没有得到可用设备的列表! 我想在我的显示器上敲我的头,我对这个问题感到非常沮丧。
我的代码在这里:
#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CBCentralManagerDelegate,CBPeripheralDelegate,CBPeripheralManagerDelegate,UITableViewDataSource,UITableViewDelegate,CLLocationManagerDelegate>
CBCentralManager *mgr;
CBPeripheralManager *manager;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
manager = [[CBPeripheralManager alloc]initWithDelegate:self queue:nil];
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
NSString *messtoshow;
switch (central.state)
case CBCentralManagerStateUnknown:
messtoshow=[NSString stringWithFormat:@"State unknown, update imminent."];
break;
case CBCentralManagerStateResetting:
messtoshow=[NSString stringWithFormat:@"The connection with the system service was momentarily lost, update imminent."];
break;
case CBCentralManagerStateUnsupported:
messtoshow=[NSString stringWithFormat:@"The platform doesn't support Bluetooth Low Energy"];
break;
case CBCentralManagerStateUnauthorized:
messtoshow=[NSString stringWithFormat:@"The app is not authorized to use Bluetooth Low Energy"];
break;
case CBCentralManagerStatePoweredOff:
messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered off."];
NSLog(@"%@",messtoshow);
break;
case CBCentralManagerStatePoweredOn:
messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered on and available to use."];
[mgr scanForPeripheralsWithServices:nil options:@ CBCentralManagerScanOptionAllowDuplicatesKey :@YES];
NSLog(@"%@",messtoshow);
break;
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
NSLog(@"%@",[NSString stringWithFormat:@"%@",[advertisementData description]]);
NSLog(@"%@",[NSString stringWithFormat:@"Discover:%@,RSSI:%@\n",[advertisementData objectForKey:@"kCBAdvDataLocalName"],RSSI]);
NSLog(@"Discovered %@", peripheral.name);
[mgr connectPeripheral:peripheral options:nil];
didDiscoverPeripheral 方法调用成功但是只显示一个设备,我给你看日志:
2015-03-27 17:10:48.137 StanBluetooth[853:109794] Discover:(null),RSSI:-68
2015-03-27 17:10:48.138 StanBluetooth[853:109794] Discovered peripheral E876A182-9DC1-26B4-3C89-DD20F5EAE88B
2015-03-27 17:10:48.139 StanBluetooth[853:109794] Discovered Amit’s MacBook Air
2015-03-27 17:10:48.140 StanBluetooth[853:109794]
kCBAdvDataIsConnectable = 1;
最近 2 天我正在尝试查找另一台设备。
任何建议将不胜感激!
谢谢!
【问题讨论】:
从here引用Apple的示例代码。 你身边有BLE外设吗?您是否尝试过应用商店中的 LightBlue 应用进行验证? @Paulw11 是的,有两个 BLE 外设可用。是的,我已经尝试过 Light Blue 应用程序。 您的日志显示发现了两个设备 - E876A182-9DC1-26B4-3C89-DD20F5EAE88B 和 Amit 的 MacBook Air @Paulw11 好的,这是两个设备,那么为什么不显示这个 UDID E876A182-9DC1-26B4-3C89-DD20F5EAE88B 设备名称。 【参考方案1】:您的代码看起来正确。
关于为什么第二个设备可能不会出现的一些提示:
如果您发现第二台设备使用了另一个第三方 iOS 蓝牙扫描应用程序,例如 LightBlue,它可能已连接到该设备(如果您点击它以获取更多详细信息)。当外围设备连接时,它通常会停止广告(连接建立通常是广告的唯一原因)。如果设备不再有广告,则无法通过扫描找到它。如果是这种情况并且设备已经连接到 iOS 设备,您可以使用 CBCentralManager
的方法 -retrieveConnectedPeripheralsWithServices:
或 -retrieveConnectedPeripherals
(自 iOS 7 起已弃用)来获取已连接到 iOS 的外围设备另一个应用程序。
外围设备的广告速度可能非常慢,以至于 iOS 设备需要很长时间(和一点运气)才能找到它。如果是这种情况,请尝试在外围设备上选择更短的广播间隔(假设您控制外围设备的固件)。
请注意,如果您只需要扫描其他外围设备,则不需要CBPeripheralManager
。
【讨论】:
@Martinjn 我曾经检索ConnectedPeripheralsWithServices 但未调用此方法。我这样调用 NSArray *services = @[[CBUUID UUIDWithString:@"02210893-8f12-4278-83f9-f29e71f30fc0"]]; [mgr retrieveConnectedPeripheralsWithServices:services]; @Martinjn 我正在尝试以另一种方式调用 [self.mgr retrievePeripheralsWithIdentifiers:services];并使用此委托方法 - (void)centralManager:(CBCentralManager *)central didRetrieveConnectedPeripherals:(NSArray *)peripherals NSLog(@"didRetrieveConnectedPeripherals called"); for (CBPeripheral *a in peripherals) NSLog(a.name);以上是关于如何使用核心蓝牙 sdk 扫描蓝牙设备?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 中使用 Core Bluetooth 获取蓝牙设备的唯一 ID
使用 pyjnius java wrapper 的 Python 蓝牙设备扫描