我正在尝试在iOS 5.0中引入Core Bluetooth framework。根据StackOverflow本身的许多线程(one of many):
我有iPhone 5,iPhone 4S,谷歌Android Nexus 7,我相信至少前两个有BLE的硬件支持。
好吧,我在iPhone 4S / iPhone 5上尝试了以下代码,但是它无法扫描并发现附近的iPhone5 / iPhone 4S。我可以确认,这两款设备的蓝牙都已打开。委托方法didDiscoverPeripheral
永远不会被调用。
可能是什么原因?我错过了什么吗?
这是我的代码(剥离到一个小型测试项目)。
@interface ViewController:UIViewController<CBCentralManagerDelegate, CBPeripheralDelegate{
}
@property (strong, nonatomic) CBCentralManager *mCentralManager;
@end
@implementation ViewController
@synthesize mCentralManager;
- (void)viewDidLoad{
[super viewDidLoad];
mCentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
[self scanForPeripherals];
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog(@"Received periferal :%@",peripheral);
}
- (int) scanForPeripherals {
if (self.mCentralManager.state != CBCentralManagerStatePoweredOn)
{
NSLog(@"self.mCentralManagerState : %d",self.mCentralManager.state);
return -1;
}
//Getting here alright.. bluetooth is powered on.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
//Documentation says passind nil as device UUID, scans and finds every peripherals
[self.mCentralManager scanForPeripheralsWithServices:nil options:options];
return 0;
}
@end
答案 0 :(得分:12)
正如spamsink所评论的那样,一个设备需要充当外围设备,一个设备需要作为中心才能进行通信。
Apple有一个伟大的sample app可以做到这一点。另外,请查看WWDC 2012会话703 - CoreBluetooth 101和705 - Advanced CoreBluetooth,以获得有关CoreBluetooth框架使用的精彩解释和示例。
另请注意,要使设备处于外设模式,需要将其更新为iOS 6.0或更高版本。
答案 1 :(得分:3)
嗯,我对蓝牙低功耗(BLE)一般的理解很差。正如所接受的答案所指出的那样,一个设备必须充当中心,而另一个设备必须充当通信的外围设备。
iOS到iOS和iOS到Mac OS BLE通信的一个很好的示例源代码是here。
需要考虑的一些要点
一些信息..
答案 2 :(得分:1)
如果你在didUpdateState委托中调用scanForPeripherals函数,那么它可以工作,因为委托函数不能返回。