Картонное QR-сканирование без Unity SDK

Я пытался понять, как сканировать и использовать QR-коды, поставляемые с устройствами Cardboard, без необходимости использования Unity API. Я уже написал SCN-VR для виртуальной реальности на основе SceneKit для устройств iOS с Obj-c, и я хотел бы, чтобы сканирование QR-кодов также работало, чтобы упростить настройку профилей.

Я видел отсканированный QR-код на goo.gl/pdNRON, который ведет на страницу о том, как загрузить приложение Google Cardboard, но какой HTTP-сервис приложение Google Cardboard собирается загрузить фактический профиль?


person Michael Fuller    schedule 11.11.2015    source источник


Ответы (2)


QR-коды можно анализировать с помощью буферов протокола Google (https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=en0). Сокращенный URL-адрес, отсканированный из кода, перенаправляется на URL-адрес, который содержит фактическую информацию в поле запроса p=. Например, ваш URL (goo.gl/pdNRON) перенаправляет на HTTPS ://www.google.com/get/cardboard/download/?p=CgxNYXR0ZWwsIEluYy4SGFZJRVctTUFTVEVS4oSiIFZSIFZJRVdFUh0xCCw9JWiRbT0qEAAASEIAAEhCAABIQgAASEJYATUpXA89OggpXA8-SOE6P1AAYAM (отображается в браузере как сайт загрузки Cardboard). Вам нужна длинная строка, начинающаяся с CgxNYXR. Поле имеет кодировку base64.

Файл определения буфера протокола доступен по адресу https://github.com/google/wwgc/blob/master/www/CardboardDevice.proto. После создания компилятора Protocol Buffers (протокол, ссылка на руководство выше) просто запустите его на CardboardDevice.proto и включите выходные файлы .cc и .h в свой проект. Вы можете получить доступ к информации через тип DeviceParams, после отправки ему декодированных данных.

Для создания библиотеки протокольных буферов и включения ее в проект iOS: https://gist.github.com/BennettSmith/9487468ae3375d0db0cc. Или, если у вас возникли проблемы с созданием/связыванием библиотек, попробуйте в качестве альтернативы: буферы протокола Google на iOS

Вот некоторый код, чтобы вы начали:

// Retrieve HEAD only (don't want the whole page)
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", myURL]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                   timeoutInterval:10.0f];
[request setHTTPMethod:@"HEAD"];

// Start the request
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (connectionError) {
        NSLog(@"%@", [connectionError localizedDescription]);
    } else {
        // Find the p attribute
        NSArray *comps = [[[response URL] query] componentsSeparatedByString:@"&"];
        for (NSString *comp in comps) {
            NSArray *subComps = [comp componentsSeparatedByString:@"="];
            if ([subComps count] == 2 && [subComps[0] isEqualToString:@"p"]) {
                NSString *base64 = subComps[1];

                // Replace _ with /, - with +, and pad with = to multiple of 4
                base64 = [base64 stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
                base64 = [base64 stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
                base64 = [base64 stringByPaddingToLength:(([base64 length]+3)/4)*4 withString:@"=" startingAtIndex:0];

                // Decode from base 64
                NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64
                                                                          options:NSDataBase64DecodingIgnoreUnknownCharacters];

                // Get the device parameters
                DeviceParams deviceParams;
                deviceParams.ParseFromArray([decodedData bytes], (int)[decodedData length]);

                // Do stuff with deviceParams
                // eg deviceParams.inter_lens_distance()
                break;
            }
        }
    }
}];
person Quig    schedule 01.02.2016

FWIW, если вы используете Swift и не хотите зависимости от protobuf, вы можете использовать это сделать расшифровку.

person user2488730    schedule 29.09.2016