Неправильная близость UUID - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над приложением, в котором мне нужно представить список устройств Bluetooth вокруг меня, где бесконтактный UUID содержит определенную подстроку. Я клонировал репо https://github.com/mlwelles/BeaconScanner и запустил приложение на своем компьютере, и оно правильно находит два маяка, которые у меня есть. Для анализа рекламных данных они используют приведенный ниже код.

+(HGBeacon *)beaconWithManufacturerAdvertisementData:(NSData *)data {
    if ([data length] != 25) {
        return nil;
    }

    u_int16_t companyIdentifier,major,minor = 0;

    int8_t measuredPower,dataType, dataLength = 0;
    char uuidBytes[17] = {0};

    NSRange companyIDRange = NSMakeRange(0,2);
    [data getBytes:&companyIdentifier range:companyIDRange];
    if (companyIdentifier != 0x4C) {
        return nil;
    }
    NSRange dataTypeRange = NSMakeRange(2,1);
    [data getBytes:&dataType range:dataTypeRange];
    if (dataType != 0x02) {
        return nil;
    }
    NSRange dataLengthRange = NSMakeRange(3,1);
    [data getBytes:&dataLength range:dataLengthRange];
    if (dataLength != 0x15) {
        return nil;
    }

    NSRange uuidRange = NSMakeRange(4, 16);
    NSRange majorRange = NSMakeRange(20, 2);
    NSRange minorRange = NSMakeRange(22, 2);
    NSRange powerRange = NSMakeRange(24, 1);
    [data getBytes:&uuidBytes range:uuidRange];
    NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDBytes:(const unsigned char*)&uuidBytes];
    [data getBytes:&major range:majorRange];
    major = (major >> 8) | (major << 8);
    [data getBytes:&minor range:minorRange];
    minor = (minor >> 8) | (minor << 8);
    [data getBytes:&measuredPower range:powerRange];
    HGBeacon *beaconAdvertisementData = [[HGBeacon alloc] initWithProximityUUID:proximityUUID
                                                                          major:[NSNumber numberWithUnsignedInteger:major]
                                                                          minor:[NSNumber numberWithUnsignedInteger:minor]
                                                                  measuredPower:[NSNumber numberWithShort:measuredPower]];
    return beaconAdvertisementData;
}

Я взял этот фрагмент кода, соответствующим образом адаптированный и включенный в мой код iOS, но UUID из найденных устройств полностью отличается от представленных в приложении MacOS.

Кто-нибудь знает, есть ли какая-либо разница в рекламных данных между iOS и MacOS?

Спасибо

1 Ответ

0 голосов
/ 05 июля 2018

NSData, который вы читаете на iOS, скорее всего, не относится к рекламным данным производителя, связанным с вашим маяком. Apple фактически блокирует доставку этих данных на iOS, если байтовый шаблон соответствует фрейму iBeacon. Смотрите мой блог об этом здесь .

Вы уверены, что именно тот код, который вы используете на iOS? Потому что если это так, я ожидал бы, что он никогда не найдет последовательность 4c 02 15 байтов, необходимую для того, чтобы добраться до сути метода и проанализировать ProximityUUID.

Если каким-то образом у вас есть код, который обходит эти проверки на iOS, возможно, вы анализируете какой-то другой произвольный пакет, который вообще не является фреймом iBeacon.

...