iPhoneとsocket.ioサーバを常時接続。その時バッテリは?

前エントリ iPhoneとsocket.ioサーバを常時接続させる3 からの続きです。
今回はバックグラウンドでもRunLoopを動かし続ける版のAppでsocket.ioサーバとiPhoneと常時接続で動かし続け、バッテリがどの程度消費するのか確認してみます。
前回バッテリは気にしないと言いましたが、とはいえどのぐらいの目安で減っていくのか興味があったので精密には計測せずさらっと計ります。

でさらっと計ってサクっと終わらせるつもりだったのですが、やってみるとheartbeat間隔を120秒以上にあげようとすると接続断が発生します。

var io = require('socket.io').listen(8080);                                                                                                                                                                                                                                                                                                 
io.configure(function() {                                                                                                                                                
    io.set('heartbeat interval', 180);                                                                                                                                   
});   

上記のようにheartbeat間隔を120秒以上にすると接続後120秒でsocket.ioサーバ側が接続クローズしてしまう現象に見舞われました。
socket.ioではwebsocketトランスポートのコード内でHTTPのUpgradeメソッドを受け取った後、net.socket#setTimeout(0)をしてタイムアウトしないようにしているのですがどうもこれが効いていないようです。

nodeのissuesを見てみるとこれが該当っぽいです。
socket.setTimeout is ignored after HTTP upgrade

ということでnodeを最新の0.6.10に上げて解決しました。

で結果は?

以下の前提で試験した結果、

  • 実機はiPhone4(iOS 5.0.1) バッテリ100%状態
  • 実機側アプリはバックグラウンドでもRunLoopを動かし続ける版
  • サーバ側はZ Cloud上のnodejs 0.6.10とsocket.io 0.8.7
  • 3G回線を使用
  • 実機、サーバ間の送受信データはheartbeatパケットのみ。
  • 1時間後バッテリが100%からどのぐらい消費されたか確認する

こうなりました。

heartbeat間隔(秒) バッテリ使用量
20 7%
60 4%
180 2%

結構食いますね。サーバからiPhoneへ低頻度の即時通知処理とかだと実用上いけなくもなさそうですが、iPhone側から高頻度で情報を送ってるとモリモリとバッテリが消費していきそうです。

次回はそのモリモリケースのサンプルとして位置情報、加速度センサー、ジャイロセンサー等のiPhone上で知覚できる各種情報をリアルタイムにnode側へ流すアプリを作ってみたいと思います。