【AFNetworking】Ai-Ball + iOS で自宅監視システム

Ai-Ballを使ってみた

デバイスハッカソンをきっかけとしたTREK 2000 Ai-Ballを使った企画でコンテストに出るためにiOSアプリを作りました。

Ai-Ballの特徴は以下の通りです。

  • 30万画素 (AF機能)
  • Motion JPEG
  • マイク
  • Wi-Fiユニット
  • 筐体込みで22g
  • CRボタン電池 or USB供給駆動

これで使わなくなった iPhone + AiBall で自宅監視ができる!ツッコミは無視!
ただし, AiBallの発熱がヤバいので気をつけてください。

ai_ball

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