2013-10-02 12 views
8

CoreBluetoothコードをiOS 6からiOS 7にアップデートする際に問題が発生しました。周辺機器をスキャンして接続できますが、提供された新しいCoreBluetoothメソッドを使用して周辺機器を再接続することはできませんuuidStringが保存されたペリフェラルUUIDですiOS 7 CoreBluetooth retrievePeripheralsWithIdentifiersが取得しない

- (void)retrievePeripheral:(NSString *)uuidString 
{ 

NSUUID *nsUUID = [[NSUUID UUID] initWithUUIDString:uuidString]; 

if(nsUUID) 
{   
    NSArray *peripheralArray = [centralManager retrievePeripheralsWithIdentifiers:@[nsUUID]]; 

    // Check for known Peripherals 
    if([peripheralArray count] > 0) 
    { 
     for(CBPeripheral *peripheral in peripheralArray) 
     { 
      NSLog(@"Connecting to Peripheral - %@", peripheral); 

      [self connectPeripheral:peripheral]; 
     } 
    } 
    // There are no known Peripherals so we check for connected Peripherals if any 
    else 
    { 
     CBUUID *cbUUID = [CBUUID UUIDWithNSUUID:nsUUID]; 

     NSArray *connectedPeripheralArray = [centralManager retrieveConnectedPeripheralsWithServices:@[cbUUID]]; 

     // If there are connected Peripherals 
     if([connectedPeripheralArray count] > 0) 
     { 
      for(CBPeripheral *peripheral in connectedPeripheralArray) 
      { 
       NSLog(@"Connecting to Peripheral - %@", peripheral); 

       [self connectPeripheral:peripheral]; 
      } 
     } 
     // Else there are no available Peripherals 
     else 
     { 
      // No Dice! 
      NSLog(@"There are no available Peripherals"); 
     } 
    } 
} 

} 

:iOSの7以内にここで私は、再接続を達成しようとしていますかを見ています。

私はいつも利用可能な周辺機器がないNSLogステートメントになっています。私は何かが非常に明白でなく、誰かが私を正しい方向に向けることができないと思います。

さらに、私はCoreBluetoothに関するiOS 7アップデートの問題について他の投稿を読んで、BLEデバイスとiOSデバイスのリセットを試みたが役に立たなかった。

ありがとうございました! 可聴

答えて

5

私の間違いは、Peripheralの識別子をNSString形式に変換してから、retrievePeripheralメソッドにメッセージを送信したことがわかりました。

NSString *uuidString = [NSString stringWithFormat:@"%@", CFUUIDCreateString(NULL, (__bridge CFUUIDRef)([peripheral identifier]))]; 

これは正しい方法(それは私のシナリオで働いていた)であった:

NSString *uuidString = [NSString stringWithFormat:@"%@", [[peripheral identifier] UUIDString]]; 

アップルのマニュアルによるとNSUUIDクラスはフリーダイヤルではありません

これは間違った方法でした以下のようにCoreFoundationのCFUUIDRefと橋渡しした:

注:NSUUIDクラスはCoreFoundationのCFUUIDRefでフリーダイヤルでブリッジされていません。必要に応じて、UUID文字列を使用してCFUUIDNSUUIDの間で変換します。 2つのNSUUIDオブジェクトは、ポインタ値(CFUUIDRef)と比較できることは保証されていません。 isEqual:を使用して、2つのNSUUIDインスタンスを比較してください。私はここで行うようにこれが何を意味するのかを視覚的に表現したいと人のために

例です:)

コンソール内に印刷周辺機器の情報は:

<CBPeripheral: 0x14699430 identifier = DD2468AB-1865-B926-7FA4-AE3755D479D8, Name = "IDYNAMO EMV-A27F", state = disconnected> 

間違った方法

1865B926-7FA4-AE37-55D4-79D800000000 

T:NSString収率に周辺装置の識別子を変換しますNSString利回りに周辺機器の識別子を変換する彼の正しい方法:

DD2468AB-1865-B926-7FA4-AE3755D479D8 

私はまだのようにこのようなものを学んでいて、私はどのような方法で間違っている場合、私は、これは彼らのBLEの旅に誰かに助けを期待し、私を修正して自由に感じますよく

ありがとうございます!

可聴

+0

を役に立てば幸い RSSI :(NSNumber *)RSSI { NSMutableArray * peripherals = [self mutableArrayValueForKey:@ "heartRateMonitors"]; if(![self.heartRateMonitors containsObject:aPeripheral]) [周辺機器addObject:aPeripheral]; [self.manager retrievePeripherals:[NSArray arrayWithObject:(id)aPeripheral.UUID]]; } –

1

これは古い投稿ですが、回答を探している人もいます。

retrieveConnectedPeripheralsの2回目以降の呼び出しでは、実際にはiOS初回接続NSUUIDではなくサービスUUID(CBUUIDタイプ)が必要です。取得されるのは、そのサービスUUIDが実装されている周辺機器のリストです。たとえば、多数のアクティビティアームバンドがあり、必要なハートビートサービスをすべて備えている場合は、3つのペリフェラルすべてを取得します。また、KNOWN周辺機器への最初の呼び出しでは、最初に接続するときにiOSによってIDが作成されてから、アプリ起動の間にNSUUIDを保存する必要があります。 (CBCentralManager *)中央 didDiscoverPeripheral:(CBPeripheral *)aPeripheral advertisementData:(NSDictionaryの*)advertisementData(無効)centralManager - それはあなたがretrievePeripheralsWithIdentifiers に変換するために私のコードで私を助けることができる場合、私は疑問に思って

関連する問題