我目前正在创建可以使用蓝牙设备的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方法成功调用但是只显示一个设备,我给你看Log:
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天内找到另一台设备。
任何建议都将不胜感激!
谢谢!
答案 0 :(得分:0)
您的代码看起来是正确的。
有关第二个设备可能无法显示原因的一些提示:
如果您发现第二台设备使用其他第三方iOS蓝牙扫描应用程序,例如LightBlue,则可能已连接到该设备(如果您点击它以获取更多详细信息)。当外围设备连接时,通常会停止广告(连接建立通常是广告的唯一原因)。如果设备不再广告,则无法通过扫描找到它。如果是这种情况并且设备已连接到iOS设备,则可以使用CBCentralManager
的方法-retrieveConnectedPeripheralsWithServices:
或-retrieveConnectedPeripherals
(自iOS 7以来已弃用)以获取已经通过其他应用程序连接到iOS的外围设备。
外围设备可能会以如此慢的速度进行广告宣传,iOS设备只需要很长时间(而且有点运气)。如果是这种情况,请尝试在外围设备上选择较短的广告时间间隔(假设您控制外围设备的固件)。
请注意,如果您只需要扫描其他外围设备,则不需要CBPeripheralManager
。