Ai-Ballを使ってみた
デバイスハッカソンをきっかけとしたTREK 2000 Ai-Ballを使った企画でコンテストに出るためにiOSアプリを作りました。
Ai-Ballの特徴は以下の通りです。
- 30万画素 (AF機能)
- Motion JPEG
- マイク
- Wi-Fiユニット
- 筐体込みで22g
- CRボタン電池 or USB供給駆動
これで使わなくなった iPhone + AiBall で自宅監視ができる!ツッコミは無視!
ただし, AiBallの発熱がヤバいので気をつけてください。
JPEG画像の取得
ブラウザから Ai-Ball に繋いでクライアント側のコードを確認すると,スナップショットを取得している部分が確認できます。
function createImageLayer() {
var img = new Image();
img.style.position = "absolute";
img.style.zIndex = -1;
img.onload = imageOnload;
img.onclick = imageOnclick;
img.width = 512;
img.height = 384;
img.src = "/?action=snapshot&n=" + (++imageNr);
var webcam = document.getElementById("webcam");
webcam.insertBefore(img, webcam.firstChild);
}
https://[ip]/?action=snapshotを叩くとJPEGが取得できます。
iOSで画像を取得してサーバへ送信
Ai-BallをWimax(AP)に繋ぐ設定をしてからiOS経由で自分のサーバに送信していきます。
self.getURL = @"https://192.168.0.150";
iOSのHTTPクライアントはAFNetworkingを使用します。
AFNetworking含めたHTTPクライアントのまとめはこちら。
Ai-Ballから画像を取得してUIImageに入れます。
-(void)getImageFromCamera{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFImageResponseSerializer serializer];
NSDictionary *params = @{@"action": @"snapshot"};
[manager GET:self.getURL parameters:params
success:^(NSURLSessionDataTask *task, UIImage *image) {
[self imageRender:image];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: %@", error);
[self imageRender:NULL];
}];
}
UIImageをNSDataにシリアライズしてサーバに送信します。リクエストはMulti-Part Requestです。
UIImageJPEGRepresentationメソッドの第二引数で圧縮率を設定します。
-(void)sendImageBinary:(int)frameRate{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"https://[IP]" parameters:nil constructingBodyWithBlock:^(id formData) {
// send ImageData
for (int i =0; i < frameRate; i++) {
if (imageData[i] == NULL)return;
NSString *imgName = [NSString stringWithFormat:@"image_%d.jpg",i];
[formData appendPartWithFileData:imageData[i] name:@"video" fileName:imgName mimeType:@"image/jpeg"];
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@ (errorCode:%d)", error, error.code);
}];
}
サーバで受け取ったら配信/録画など煮るなり焼くなりします。
注意としては上記コードは過激なメモリリークを発生します。
SDKを配布しているガジェット
* NTTドコモ・ベンチャーズ共催のドコモ・イノベーションビレッジDeveloper Application Contestでハードウェア賞を頂きました