2017-07-26 2 views
2

私はBluetoothデバイスをスキャンしています。そのために私はCBCentralManagerを使用していますので、CoreBluetooth - didDiscoverPeripheralは、特定のserviceUUIDに対しては一度も呼び出されませんでしたが、無しで動作します。

- (void)startScanning 
{ 
    [self.centralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }]; 
} 

- (void)centralManager:(CBCentralManager *)central 
didDiscoverPeripheral:(CBPeripheral *)peripheral 
    advertisementData:(NSDictionary *)advertisementData 
        RSSI:(NSNumber *)RSSI 
{ 
    NSLog(@"\n%@, rssi: %@", peripheral.identifier.UUIDString, RSSI); 
    // do stuff 
} 

ように私は他のデバイスにビーコンをシミュレートするEstimoteアプリを使用しています。

2017年7月26日14:43:56.711830 ExampleApplicationが[445:55698]末梢:
6A3E0CB4-74BB-4472-98AA-0C9DEB1D4551、RSSI:-28

コンソール出力は、そのように見えます

これまでのところすべて問題ありません。

ここでは、アプリがバックグラウンドのときにもBluetoothデバイスをスキャンします。そのために、私はInfo.plistまた

<key>UIBackgroundModes</key> 
<string>bluetooth-central</string> 

に、このようなプロパティを追加し、私はそれがserviceUUIDsとしてnilを渡すときに、バックグラウンドでのBluetoothデバイスをスキャンすることはできませんことを読んだので、私は以前に発見された周辺機器のUUIDを取ると、それを渡しますCBCentralManager

CBUUID *uuid = [CBUUID UUIDWithString:@"6A3E0CB4-74BB-4472-98AA-0C9DEB1D4551"]; 
[self.centralManager scanForPeripheralsWithServices:@[uuid] options:options]; 

そして、問題があるに - didDiscoverPeripheralアプリがフォアグラウンドにあるときでも、もう呼び出されることはありません。理由は何ですか?以前に発見されたデバイスのUUIDを問題なく使用しましたが、そうではありません。何か案は?

+0

ペリフェラルのUUIDではなく、ペリフェラルによってアドバタイズされているサービスのUUIDをスキャンする必要があります。ペリフェラルのUUIDが変更され、同じペリフェラルで異なるiOSデバイスが表示されますが、サービスペリフェラルは一貫しています。 – Paulw11

+0

問題は、私が受け取った周辺機器に対して、 'services'プロパティが空であることです。 –

+0

@mag_zbc周辺機器が何らかのサービスを持っている(サービスUUIDを与える)広告を入れていない場合、特別にスキャンすることはできませんそれを宣伝しなければ、接続してからサービスをスキャンする必要があるからです。 – Larme

答えて

0
-(void)centralManagerDidUpdateState:(CBCentralManager *)central { 

if (central.state != CBCentralManagerStatePoweredOn) { 
    return; 
} 
if (central.state == CBCentralManagerStatePoweredOn) { 
    [_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"0x180A"]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}]; 
    NSLog(@"Start scanning"); 
} 
} 

このように確認できます。

さて、あなたは、コードの上にしようとしている場合:それはあなたが問題

編集だかを把握するのに役立ちます。

次に、理想的な方法は、scanForPeripheralsWithServicesが廃止されたので、新しいコードを迅速に使用することです。

用途: FUNCのscanForPeripheralsをチェックアウトするには、このような何か(withServicesのserviceUUIDs:[CBUUID] ?, オプション:[文字列:任意]?= nilを)

それ以外の場合は、お使いのハードウェアである可能性もあり今すぐ正しく放送する。

+0

デバイス情報\t org.bluetooth.service.device_info \t 0x180A – cole

+0

これはすでにチェックしています。そして、なぜ 'serviceUUIDs 'として' nil'を渡すときに周辺機器を見つけることができるのか説明しません。 –

関連する問題