不使用 Unity SDK 的纸板二维码扫描
Cardboard QR Scanning without Unity SDK
我一直在想办法在不需要使用 Unity 的情况下扫描和使用 Cardboard 设备提供的二维码 API。我已经为带有 Obj-c 的 iOS 设备编写了基于 SceneKit 的 VR 的 SCN-VR,我希望扫描 QR 码也能使配置文件的设置更简单。
我看到一个 QR 码扫描到 goo。gl/pdNRON,它指向一个关于如何下载 Google Cardboard 应用程序的页面,但是 [=17= 是什么 HTTP 服务] Cardboard 应用要下载实际配置文件?
QR码可以用Google的protocol buffers解析(https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=en0). The shortened URL scanned from the code is redirected to an URL that contains the actual info in the p= query field. For example, your URL (goo.gl/pdNRON) redirects to 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 编译器(protoc,来自上面的教程 link),只需 运行 它在 CardboardDevice.proto 上,并将输出 .cc 和 .h 文件包含在你的项目中。在将解码数据发送给它之后,您可以通过 DeviceParams 类型访问信息。
用于构建 Protocol Buffers 库并将其包含在您的 iOS 项目中:https://gist.github.com/BennettSmith/9487468ae3375d0db0cc。
或者,如果您 generating/linking 库有问题,请尝试以下替代方法:Google protocol buffers on 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;
}
}
}
}];
FWIW,如果您正在使用 Swift 并且不想要 protobuf 依赖项,您可以使用 this 进行解码。
我一直在想办法在不需要使用 Unity 的情况下扫描和使用 Cardboard 设备提供的二维码 API。我已经为带有 Obj-c 的 iOS 设备编写了基于 SceneKit 的 VR 的 SCN-VR,我希望扫描 QR 码也能使配置文件的设置更简单。
我看到一个 QR 码扫描到 goo。gl/pdNRON,它指向一个关于如何下载 Google Cardboard 应用程序的页面,但是 [=17= 是什么 HTTP 服务] Cardboard 应用要下载实际配置文件?
QR码可以用Google的protocol buffers解析(https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=en0). The shortened URL scanned from the code is redirected to an URL that contains the actual info in the p= query field. For example, your URL (goo.gl/pdNRON) redirects to 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 编译器(protoc,来自上面的教程 link),只需 运行 它在 CardboardDevice.proto 上,并将输出 .cc 和 .h 文件包含在你的项目中。在将解码数据发送给它之后,您可以通过 DeviceParams 类型访问信息。
用于构建 Protocol Buffers 库并将其包含在您的 iOS 项目中:https://gist.github.com/BennettSmith/9487468ae3375d0db0cc。 或者,如果您 generating/linking 库有问题,请尝试以下替代方法:Google protocol buffers on 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;
}
}
}
}];
FWIW,如果您正在使用 Swift 并且不想要 protobuf 依赖项,您可以使用 this 进行解码。