3030@interface SKEddystoneProximity () <ESSBeaconScannerDelegate>
3131
3232@property (strong , nonatomic ) ESSBeaconScanner *beaconScanner;
33+ @property (strong , nonatomic , readonly ) NSData *namespaceFilterData;
3334
3435@end
3536
3637@implementation SKEddystoneProximity
3738
3839- (id )init
3940{
40- return [self initWithNamespace :nil ];
41+ return [self initWithNamespaceFilter :nil ];
4142}
4243
43- - (id )initWithNamespace : (NSString *)namespaceFilter ;
44+ - (id )initWithNamespaceFilter : (NSString *)namespaceFilter ;
4445{
4546 if (self = [super init ])
4647 {
47- _namespaceFilter = namespaceFilter;
48+ // Save the hex filter in lowercase
49+ _namespaceFilter = [namespaceFilter lowercaseString ];
50+ _namespaceFilterData = [SKEddystoneProximity dataFromHexString: _namespaceFilter];
4851
4952 // init ESSBeaconScanner
5053 self.beaconScanner = [[ESSBeaconScanner alloc ] init ];
@@ -81,29 +84,30 @@ - (void)beaconFoundWithInfo:(ESSBeaconInfo *)beaconInfo
8184{
8285 if (beaconInfo.beaconID .beaconType == kESSBeaconTypeEddystone ) {
8386
84- // 16 bytes long data. 10byte namespace + 6byte instance ID
87+ // 16 bytes long data. 10byte namespaceId + 6byte instanceId
8588 NSData *beaconId = beaconInfo.beaconID .beaconID ;
89+
90+ // Separate the namespaceId (10 bytes)
8691 NSData *namespaceData = [beaconId subdataWithRange: NSMakeRange (0 , 10 )];
87-
88- // Separate the namespace (10 bytes)
89- NSString *namespaceString = [self hexadecimalStringFromData: namespaceData];
9092
91- if (!self.namespaceFilter || [self .namespaceFilter isEqualToString: namespaceString]) {
93+ if (!self.namespaceFilter || [self .namespaceFilterData isEqualToData: namespaceData]) {
94+
95+ // Convert NSData bytes into NSString
96+ NSString *namespaceId = [SKEddystoneProximity hexStringFromData: namespaceData];
9297
9398 // Separate the instanceId (6 bytes)
9499 NSData *instanceIdData = [beaconId subdataWithRange: NSMakeRange (10 , 6 )];
95100
96101 // Convert NSData bytes into NSUInteger (quick and dirty way for now!)
97- NSString *instanceIdString = [self hexadecimalStringFromData: instanceIdData];
98- NSUInteger instanceId = instanceIdString.integerValue ;
102+ NSUInteger instanceId = [SKEddystoneProximity hexStringFromData: instanceIdData].integerValue ;
99103
100104 // Get all remaining properties
101105 NSInteger rssi = beaconInfo.RSSI .integerValue ;
102106 NSInteger txPower = beaconInfo.txPower .integerValue ;
103107
104108 // Create and submit the data
105109 SKEddystoneProximityData *data = [[SKEddystoneProximityData alloc ] initWithTimestamp: [NSDate date ]
106- withNamespace: namespaceString
110+ withNamespaceId: namespaceId
107111 withInstanceId: instanceId
108112 withRssi: rssi
109113 withTxPower: txPower];
@@ -115,7 +119,7 @@ - (void)beaconFoundWithInfo:(ESSBeaconInfo *)beaconInfo
115119
116120// Serialize an NSData into a hexadeximal string
117121// Thanks to http://stackoverflow.com/questions/1305225/best-way-to-serialize-a-nsdata-into-an-hexadeximal-string
118- - (NSString *)hexadecimalStringFromData : (NSData *)data
122+ + (NSString *)hexStringFromData : (NSData *)data
119123{
120124 const unsigned char *dataBuffer = (const unsigned char *)[data bytes ];
121125
@@ -131,4 +135,23 @@ - (NSString *)hexadecimalStringFromData:(NSData *)data
131135 return [NSString stringWithString: hexString];
132136}
133137
138+ // Convert a NSString hex into NSData
139+ // Thanks to ESSEddystone.m
140+ + (NSData *)dataFromHexString : (NSString *)hexString
141+ {
142+ NSMutableData *data = [[NSMutableData alloc ] init ];
143+ unsigned char whole_byte;
144+ char byte_chars[3 ] = {' \0 ' ,' \0 ' ,' \0 ' };
145+
146+ int i;
147+ for (i = 0 ; i < [hexString length ]/2 ; i++) {
148+ byte_chars[0 ] = [hexString characterAtIndex: i * 2 ];
149+ byte_chars[1 ] = [hexString characterAtIndex: i * 2 + 1 ];
150+ whole_byte = strtol (byte_chars, NULL , 16 );
151+ [data appendBytes: &whole_byte length: 1 ];
152+ }
153+
154+ return data;
155+ }
156+
134157@end
0 commit comments