16

ご存じのように、iOS 6 は実行中のデバイス (iPhone 4s 以降、および新しい iPad) を BLE ペリフェラルとしてサポートしています。WWDC 2012 セッション 705 に「高度なコア bluetooth」と呼ばれるデモがあります。Appleにソースコードをお願いしました。ソース コードの修正版 (BTLE_Transfer_Draft) が送られてきました。その後私は:

  • iPhone 5 (iOS 6) でアプリを「ペリフェラル モード」で実行し、「広告」を開始します。
  • 「セントラルモード」で新しいiPad(iOS 5.1.1)でアプリを実行します

問題は、周辺機器がまったく検出されないことです。そのため、App Store からダウンロードしたものを含め、他のテスト アプリケーションを使用しています。周辺機器の検出にすべて失敗しました。問題は BTLE_Transfer_Draft にあるはずだと思います。ソースコード全体を提示してよいかどうかわからないからです。したがって、ここでは「周辺モード」の部分のみを示します。

- (void)viewDidLoad {
    [super viewDidLoad];

    // Start up the CBPeripheralManager
    _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
}

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {
    // Opt out from any other state
    if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
        return;
    }

    // We're in CBPeripheralManagerStatePoweredOn state...
    NSLog(@"self.peripheralManager powered on.");

    // ... so build our service.

    // Start with the CBMutableCharacteristic
    self.transferCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_CHARACTERISTIC_UUID]
                                                                  properties:CBCharacteristicPropertyNotify
                                                                       value:nil
                                                                 permissions:CBAttributePermissionsReadable];

    // Then the service
    CBMutableService *transferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]
                                                                    primary:YES];

    // Add the characteristic to the service
    transferService.characteristics = @[self.transferCharacteristic];

    // And add it to the peripheral manager
    [self.peripheralManager addService:transferService];
}

/** Start advertising
 */
- (IBAction)switchChanged:(id)sender
{
    if (self.advertisingSwitch.on) {
        // All we advertise is our service's UUID
        [self.peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] }];
    }
    else {
        [self.peripheralManager stopAdvertising];
    }
}

BLE が電源オンの状態になり、startAdvertising が呼び出されます。しかし、BLE セントラルはそれを発見できません。

投稿が更新されました:

mttrbの提案に従って、 Advertisingを開始するときに「CBAdvertisementDataLocalNameKey」を追加しました。しかし、私のサービスは、アプリストアからのいくつかのアプリを含むほとんどのアプリでまだ発見できません. 私のサービスを発見できる唯一のアプリは、「BLEスキャナー」というアプリストアのアプリです。

私の質問は次のとおりです。これは、私のアプリケーションが周辺機器として機能していることを意味しますか? しかし、なぜ自分のコードでサービスを検出できないのでしょうか? どうすればデバッグできますか?

セントラル モードでの私のコードは次のようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Start up the CBCentralManager
    _centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    if (central.state != CBCentralManagerStatePoweredOn) {
        return;
    }
    [self.centralManager scanForPeripheralsWithServices:nil options:nil];
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
......
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    if (error) {
        NSLog(@"Error discovering services: %@", [error localizedDescription]);
        return;
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    // Deal with errors (if any)
    if (error) {
        NSLog(@"Error discovering characteristics: %@", [error localizedDescription]);
        return;
    }
}

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"Peripheral Disconnected");
    self.discoveredPeripheral = nil;
}

didDiscoverPeripheral と didDiscoverServices が呼び出されることはありません。何が間違っている可能性がありますか?何か案が?ありがとう

4

5 に答える 5

12

コードのテストに使用できるLightBlueという高品質の無料アプリもあります。周辺機器モードでアドバタイズしているすべてのデバイスを取得できる必要があり、デバイスが適切に動作していることを確認したい場合は、それ自体をアドバタイジング周辺機器に変えることさえできます.

于 2012-11-06T23:37:24.327 に答える
4

startAdvertising:メソッド呼び出しをデリゲート メソッドの最後に移動してみてperipheralManagerDidUpdateState:、それが役立つかどうかを確認します。

また、メソッド呼び出しCBAdvertisementDataLocalNameKeyにキーと値のペアを追加します。startAdvertising:広告に名前がない場合、信頼性が低いことがわかりました。

最後に、App Store で入手できるBLExplr アプリに投資して、周辺機器のスキャンを支援します。セントラルが正しく機能しているという仮定を取り除きます。

于 2012-10-24T04:01:44.147 に答える
3

このGitハブプロジェクトは、CBPeripheralManagerAPIにも光を当てています。PeripheralModeTestと呼ばれます。この行は、広告データの設定に特に役立ちます

 NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey : @"Device Name", CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:CBUUIDGenericAccessProfileString]]};

AppleiOS開発者ライブラリにはまだ公式のドキュメントはありませんが。より具体的には、広告の繰り返し期間の設定に関するものです。

于 2013-01-08T10:43:14.657 に答える