如何使用核心蓝牙 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-DD20F5EAE88BAmit 的 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 蓝牙设备扫描

IOS 蓝牙 LE 扫描设备未添加到 uitableview

蓝牙设备扫描不完整

Android蓝牙开发(二)经典蓝牙消息传输实现