QcamOrbitAFのフォーカスのモータ制御のテスト確認のためにはリアルタイムで画像が確認出来たら便利だと思った。
いろいろ方法があるだろうが、いままで試してない方法がおもしろいだろうとWebsocketを試してみた。
mbed(カメラ) → websocketサーバー(sockets.mbed.org) → パソコン(iPod touch)
mbed、画像をbase64エンコードして送っています。最新の仕様ではwebsocketはバイナリーでも送れるが、
mbedのライブラリのWebsocketClientは内部的にはバイナリー転送が出来そうだがインターフェースを備えてないし、
sockets.mbed.orgのviewで転送内容を確認したかったのでテキストで送っています。
main.cpp
VideoStreaming
パソコン(iPod touch)、websocketからのデータをdata URI schemeで画像を表示しています。
jQuery Mobile でWebページを作っていますので、ブラウザで開くだけでビューアが実行されます。
viewer
試してみたところ、mbedからのtcp送信が遅いので、画像2Kバイト程度を送るのに10秒くらいかかってしまった。
しかも、600バイトくらいを送ったとことでフリーズする時もある。他の方法か工夫が必要らしい。
(追加)
パソコンで画像を送り出してみたところ十分速かったので、やはりmbedの送信がボトルネックらしい。
# wsbench.py 2013/2/21 # coding: utf-8 # import websocket import base64 import time import argparse channel = "public-ch" url = "ws://sockets.mbed.org/ws/" + channel + "/rw"; CHUNK=2*30 def buf_to_websocket(buf, ws=None): print "image size: %d bytes" % len(buf) st = time.time() ws_send = 0 for i in range(0, len(buf), CHUNK): chunk_len = min(len(buf) - i, CHUNK) s = buf[i:i+chunk_len] d = base64.b64encode(s) print d if ws: ws.send(d) ws_send += len(d) d = "." print d if ws: ws.send(d) ms = (time.time() - st) * 1000 print "websocket: send: %d bytes %d ms" % (ws_send, ms) if __name__ == '__main__': ws = websocket.create_connection(url) #ws = None parser = argparse.ArgumentParser() parser.add_argument('infiles', nargs='*', help=u"image file") args = parser.parse_args() for i, filename in enumerate(args.infiles): with open(filename, "rb") as f: data = f.read() print("input: %s %d bytes" % (filename, len(data))) buf_to_websocket(data, ws)
参考:
websocket-client
http://mbed.org/cookbook/Websockets-Server
Insider.NET > 業務アプリInsider > 連載:jQuery Mobile入門 - @IT
(2013/2/22)
---
0 件のコメント:
コメントを投稿