iOS - CoreBluetooth didDiscoverPeripheral 只调用了一次
iOS - CoreBluetooth didDiscoverPeripheral called only once
我实际上正在使用低功耗蓝牙制作应用程序。
到目前为止,我的应用程序获得了 3 个视图,每个视图都显示了一些 BLE 信息。
当我的蓝牙协议代码在第一个视图时,没有问题。但我决定制作一个 class 并将我的蓝牙代码放入其中,这样我就可以为我的其他 2 个视图制作一个全局 class。我用过:
self.bluetoothManager = [BluetoothManager getInstance];
BluetoothManager,作为我的全局 class。
问题来了:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
此方法不再循环,只在开始时调用一次。我担心其他服务,如 discoverCharacteristics 或 Notifications 也不会循环。
编辑:这就是我创建 class
的方式
+(BluetoothManager *)getInstance {
@synchronized(self)
{
if(instance==nil)
{
instance= [[BluetoothManager alloc] init];
}
}
return instance;
}
- (id) init {
self.CentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
self.activePeripheral = [CBPeripheral alloc];
self.discoveredPeripherals = [NSMutableArray new];
self.resultValue = [[NSString alloc] init];
return self;
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}
if (central.state == CBCentralManagerStatePoweredOn) {
// Scan for devices
[self.CentralManager scanForPeripheralsWithServices:nil options:nil];
NSLog(@"Scanning started");
}
}
编辑 2:到目前为止,我没有 post 所有 class 方法来得到一个正确的问题,但是来自 CBCentralManager
委托的每个方法都被实现到我的 class.
到目前为止,我认为我的问题是关于线程的,因为唯一的区别是我的 class 不再在主队列中了?我确实尝试了一些事情,但我对线程不太满意,如果有人有解决此问题的解决方案或想法,请提前致谢。
如果 didDiscoverPeripheral:...
回调调用成功,这意味着你做的一切都是正确的。当您调用 scanForPeripheralsWithServices:options:
时,iOS 开始扫描周围环境以搜索 BLE 设备。它会一直这样做,直到您显式调用 stopScan
或禁用 BT 或终止您的 CBCentralManager
实例。有些外围设备会立即找到,有些则需要更多时间。每次发现设备时,都会调用 didDiscoverPeripheral:
回调。发生这种情况时,您有责任决定是否对它感兴趣、连接它并发现它的服务。
我实际上正在使用低功耗蓝牙制作应用程序。
到目前为止,我的应用程序获得了 3 个视图,每个视图都显示了一些 BLE 信息。
当我的蓝牙协议代码在第一个视图时,没有问题。但我决定制作一个 class 并将我的蓝牙代码放入其中,这样我就可以为我的其他 2 个视图制作一个全局 class。我用过:
self.bluetoothManager = [BluetoothManager getInstance];
BluetoothManager,作为我的全局 class。
问题来了:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
此方法不再循环,只在开始时调用一次。我担心其他服务,如 discoverCharacteristics 或 Notifications 也不会循环。
编辑:这就是我创建 class
的方式+(BluetoothManager *)getInstance {
@synchronized(self)
{
if(instance==nil)
{
instance= [[BluetoothManager alloc] init];
}
}
return instance;
}
- (id) init {
self.CentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()];
self.activePeripheral = [CBPeripheral alloc];
self.discoveredPeripherals = [NSMutableArray new];
self.resultValue = [[NSString alloc] init];
return self;
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if (central.state != CBCentralManagerStatePoweredOn) {
return;
}
if (central.state == CBCentralManagerStatePoweredOn) {
// Scan for devices
[self.CentralManager scanForPeripheralsWithServices:nil options:nil];
NSLog(@"Scanning started");
}
}
编辑 2:到目前为止,我没有 post 所有 class 方法来得到一个正确的问题,但是来自 CBCentralManager
委托的每个方法都被实现到我的 class.
到目前为止,我认为我的问题是关于线程的,因为唯一的区别是我的 class 不再在主队列中了?我确实尝试了一些事情,但我对线程不太满意,如果有人有解决此问题的解决方案或想法,请提前致谢。
如果 didDiscoverPeripheral:...
回调调用成功,这意味着你做的一切都是正确的。当您调用 scanForPeripheralsWithServices:options:
时,iOS 开始扫描周围环境以搜索 BLE 设备。它会一直这样做,直到您显式调用 stopScan
或禁用 BT 或终止您的 CBCentralManager
实例。有些外围设备会立即找到,有些则需要更多时间。每次发现设备时,都会调用 didDiscoverPeripheral:
回调。发生这种情况时,您有责任决定是否对它感兴趣、连接它并发现它的服务。