Objective-C로 BLE를 동시에 2대 접속한다

이번에는 Objective-C에서 iOS 단말기를 BLE에서 하나의 중앙을 사용하여 두 개의 주변 장치를 동시에 연결하는 방법에 대해 쓰고 싶습니다.

어째서 그런 일을 할까라고 생각했는가라고 하면 FirstVR을 양손으로 사용해 보려고 생각했지요. SDK 자체는 있지만 양손의 대응은 아직 같고 다른 장면에서도 사용할 수 있을까라고 생각해 2개의 디바이스로부터 동시에 BLE로 통신하는 방법을 조사하기 시작한 것이 계기였습니다. 그건 그렇고, FirstVR은 개발자가 상담 할 Slack이있는 것 같습니다 [FirstVR 개발자 Slack]"h tps://오. gl/w 푸 63X "

1개의 디바이스와 연결해 데이터를 읽는 것은 있습니다만 원래 BLE의 접속 방법조차 모르는 상태로부터 시작했기 때문에 엄청 고전했습니다.

솔직히 보통 연결하는 방법을 잘 이해하면 두 연결 방법을 쉽게 할 수 있지만, Objective-C에서 BLE 연결 방법조차 모르는 상태에서 시작했다는 것도 있고 2 연결 빠져서 정리했습니다.

원래 Objective-C에서 BLE 연결의 흐름을 모르는 사람은 다음 기사를 읽으십시오. (자신도 이하의 기사를 참고로 했습니다.덧붙여서 이 쪽이 쓴 「iOS x BLE 프로그래밍」이라고 하는 책도 가지고 있습니다.)
htps : // 코 m/슈 223/있어 ms/78614325 세 25bf7f4379

1,CBPeripheral형의 변수를 2개와 디바이스가 연결되어 있는 수를 보관 유지하는 변수를 준비한다.
@property (nonatomic, strong) CBPeripheral *peripheral1;
@property (nonatomic, strong) CBPeripheral *peripheral2;
@property (nonatomic) int deviceNum;

2, 주변 장치가 발견된 후 함수 중 하나 연결되어도 기다리는 코드를 작성
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(nonnull CBPeripheral *)peripheral advertisementData:(nonnull NSDictionary<NSString *,id> *)advertisementData RSSI:(nonnull NSNumber *)RSSI{

    NSString *peripheralName = [advertisementData objectForKey:@"kCBAdvDataLocalName"];
       if(peripheralName){
        if([peripheralName containsString:FVR_DEVICE_NAME]){
            if(self.deviceNum < 1){
                self.peripheral1 = peripheral;
                self.peripheral2.delegate = self;

                self.deviceNum += 1;
            }else if(self.deviceNum == 1 && ![peripheral.identifier.UUIDString isEqualToString:self.peripheral1.identifier.UUIDString]){
                self.keepScanning = NO;
                self.peripheral2 = peripheral;
                self.peripheral2.delegate = self;

                [self.centralManager connectPeripheral:self.peripheral1 options:nil];
                [self.centralManager connectPeripheral:self.peripheral2 options:nil];

                [self.centralManager stopScan];
            }
        }
    }
}

3, 서비스 탐색
-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    NSLog(@"Connected!!!");

    self.peripheral1.delegate = self;
    self.peripheral2.delegate = self;
    [self.peripheral1 discoverServices:nil];
    [self.peripheral2 discoverServices:nil];

}

4, 캐릭터리스틱을 탐색한다
- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error{

    if(error){
        NSLog(@"error %@",error);
        return;
    }

    NSArray *characteristics = service.characteristics;

    NSLog(@"Found %lu characteristics! : %@", (unsigned long)characteristics.count, characteristics);

    [peripheral setNotifyValue:YES forCharacteristic:characteristics[1]];
    [NSThread sleepForTimeInterval:0.001];
    [peripheral readValueForCharacteristic:characteristics[1]];

}

5, 읽기
- (void)  peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
    if(error){
        NSLog(@"error %@",error);
        return;
    }

    NSString *test = [[NSString alloc] initWithBytes:[characteristic.value bytes] length:[characteristic.value length] encoding:NSUTF8StringEncoding];

//次の1行で1つのデバイスで2つのインスタンスを掴んでしまっていないかperipheral.identifier.UUIDStringを表示してチェックする。

    NSLog(@"characteristic  %@ Peripheral UUID:%@“,test,peripheral.identifier.UUIDString);

    [peripheral readValueForCharacteristic:characteristic];
}

이런 느낌으로 체크합니다.

좋은 웹페이지 즐겨찾기