요즘 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를 통해 가공한 뒤 원하는 형태의 값으로 변형을 해서 사용하면 된다. ^^
'프로그래밍 > Xcode-iOS' 카테고리의 다른 글
ios WebView 설정, next focus가능하도록 설정. (0) | 2018.10.19 |
---|---|
UIColor+Hexcode (0) | 2018.09.13 |
소켓 기반 iOS 프로그래밍 (0) | 2018.05.15 |
diff: /Podfile.lock: No such file or directory (0) | 2018.05.02 |
금액 한글 변환 소스(objective-c, iOS, 아이폰) (0) | 2018.04.20 |