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でハードウェア賞を頂きました
