본문 바로가기
프로그래밍/Xcode-iOS

CBPeripheral advertismentData 값 파싱 코드 예제

by Mr-후 2018. 7. 11.
반응형

요즘 BLE와 Beacon관련 개발 작업을 한창 하고 있는 중인데 경험도 없고 이래저래 레퍼런스 찾기도 힘들고(영어라 @@) 맨땅에 헤딩하는 심정으로 이런 저런 자료를 찾아보고 어렵게 어렵게 하나씩 뚫어가고 있다. 그래서 많이 배워야하나보다. 쩝 


BLE신호를 받아서 스마트폰에서 그 값을 파싱해서 사용해야하는 문제가 있었고 가지고 있던 레퍼런스에서 찾은 힌트. 그 힌트 하나로 해야할 일은 일사천리로 해결이 되었다. 

특정 키워드를 가지고 검색하는 사람들을 위해, 또 나같이 고생하는 사람들을 위해 애드버타징된 값을 받아서 파싱하는 예제를 올려 둔다. 

예시 advertisementData

advertisementData = {

    kCBAdvDataIsConnectable = 0;

    kCBAdvDataLocalName = HRPCPOS0000001;

    kCBAdvDataServiceData =     {

        E1AD = <ee149a7b>;

    };

}


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

    NSDictionary *serviceData = advertisementData[@"kCBAdvDataServiceData"];


    RNLBeacon *beacon = Nil;

    NSData *adData = advertisementData[@"kCBAdvDataManufacturerData"];


    for (RNLBeaconParser *beaconParser in self.beaconParsers) {

        if (adData) {

            if (self.debugEnabled) {

                NSLog(@"didDiscoverPeripheral with manufacturer data");

            }

            beacon = [beaconParser fromScanData: adData withRssi: RSSI forDevice: peripheral serviceUuid: Nil];

        }

        else if (serviceData != Nil) {

            if (self.debugEnabled) {

                NSLog(@"didDiscoverPeripheral with service data");

            }

            for (NSObject *key in serviceData.allKeys) {

                NSString *uuidString = [(CBUUID *) key UUIDString];

                NSScanner* scanner = [NSScanner scannerWithString: uuidString];

                unsigned long long uuidLongLong;


                [scanner scanHexLongLong: &uuidLongLong];

                NSNumber *uuidNumber = [NSNumber numberWithLongLong:uuidLongLong];

                if (self.debugEnabled) {

                    NSLog(@"Service data has length %lu", (unsigned long)((NSData *)[serviceData objectForKey:key]).length);

                }


                NSData *adServiceData = [serviceData objectForKey:key];

                if (adServiceData) {

                    beacon = [beaconParser fromScanData: adServiceData withRssi: RSSI forDevice: peripheral serviceUuid: uuidNumber];

                }

            }

        }

        if (beacon != Nil) {

            break;

        }

    }


    if (beacon != Nil) {

        NSString *key = [NSString stringWithFormat:@"%@ %@ %@", beacon.id1, beacon.id2, beacon.id3];

        [self.beaconTracker updateWithRangedBeacons: @[beacon]];

        NSLog(@"Detected beacon: %@", key);

    }

}


핵심은 ServiceData필드로 받아온 Dictionary의 allKeys 와 allValues를 통해 원하는 값을 NSScanner를 통해 가공한 뒤 원하는 형태의 값으로 변형을 해서 사용하면 된다. ^^ 




반응형