Skip to content

Commit 91b5186

Browse files
committed
Improve Eddystone support
1 parent 043678e commit 91b5186

File tree

5 files changed

+44
-20
lines changed

5 files changed

+44
-20
lines changed

SensingKit/SKEddystoneProximity.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@
2828

2929
@property (nonatomic, strong, readonly) NSString *namespaceFilter;
3030

31-
- (id)initWithNamespace:(NSString *)namespaceFilter;
31+
- (id)initWithNamespaceFilter:(NSString *)namespaceFilter;
3232

3333
@end

SensingKit/SKEddystoneProximity.m

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,24 @@
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

SensingKit/SKEddystoneProximityData.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@
2626

2727
@interface SKEddystoneProximityData : SKSensorData
2828

29-
@property (nonatomic, strong, readonly) NSString *namespace;
29+
@property (nonatomic, strong, readonly) NSString *namespaceId;
3030
@property (nonatomic, readonly) NSUInteger instanceId;
3131
@property (nonatomic, readonly) NSInteger rssi;
3232
@property (nonatomic, readonly) NSInteger txPower;
3333

3434
- (instancetype)initWithTimestamp:(NSDate *)timestamp
35-
withNamespace:(NSString *)namespace
35+
withNamespaceId:(NSString *)namespaceId
3636
withInstanceId:(NSUInteger)instanceId
3737
withRssi:(NSInteger)rssi
3838
withTxPower:(NSInteger)txPower;

SensingKit/SKEddystoneProximityData.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
@implementation SKEddystoneProximityData
2828

2929
- (instancetype)initWithTimestamp:(NSDate *)timestamp
30-
withNamespace:(NSString *)namespace
30+
withNamespaceId:(NSString *)namespaceId
3131
withInstanceId:(NSUInteger)instanceId
3232
withRssi:(NSInteger)rssi
3333
withTxPower:(NSInteger)txPower
3434
{
3535
if (self = [super initWithSensorModuleType:EddystoneProximity withTimestamp:timestamp])
3636
{
37-
_namespace = namespace;
37+
_namespaceId = [namespaceId lowercaseString];
3838
_instanceId = instanceId;
3939
_rssi = rssi;
4040
_txPower = txPower;
@@ -46,7 +46,7 @@ - (NSString *)csvString
4646
{
4747
return [NSString stringWithFormat:@"%f,%@,%lu,%ld,%ld",
4848
[self timestampEpoch],
49-
_namespace,
49+
_namespaceId,
5050
(unsigned long)_instanceId,
5151
(long)_rssi,
5252
(long)_txPower];
@@ -63,7 +63,7 @@ - (NSDictionary *)dictionaryData
6363
@"timestampString": self.timestampString
6464
},
6565
@"Eddystone": @{
66-
@"namespace": _namespace,
66+
@"namespace": _namespaceId,
6767
@"instanceId": @(_instanceId),
6868
@"rssi": @(_rssi),
6969
@"txPower": @(_txPower)

SensingKit/SKSensorModuleManager.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ - (SKAbstractSensorModule *)createSensorModule:(SKSensorModuleType)moduleType
242242
break;
243243

244244
case EddystoneProximity:
245-
sensorModule = [[SKEddystoneProximity alloc] initWithNamespace:@"2f234454f4911ba9ffa6"];
245+
// First 10 bytes of SHA1 'org.sensingkit.EddystoneIdentifier'
246+
sensorModule = [[SKEddystoneProximity alloc] initWithNamespaceFilter:@"90643f1a5253bff747fa"];
246247
break;
247248

248249
// Don't forget to break!

0 commit comments

Comments
 (0)