December 10, 2008

Arduino serproxyをFlash XMLSocketで使う

目覚まし時計デバイスChumbyにArduinoをつなげてChumby上のFlashからコントロール(詳しくは以前の記事『ChumbyでArduino等をFlashからコントロールする方法 (XMLSocketが使える?)』をどうぞ)しようとしているわけですが、Chumbyで再生できるFlashのバージョンはFlash Lite 3(Action Script 2に相当)であるがために、本家で配布しているFlashとシリアルポート間のブリッジ serproxy (Serial Proxy)では少々問題が発生します。具体的には、Flash Lite 3では非同期通信を行う際にXMLSocketクラスを使うことになると思うのですが、それとserproxyを組み合わせるとデータの送信が拒絶されたり、受信データの一部がかけてしまったりと思ったとおりに動作しない問題に見舞われます。

これはXMLSocketが送信はヌル文字(0x00)以外のみを認める、また受信もヌル文字を受信してはじめてコールバックイベントが呼ばれるという仕掛けになっていること、一方serproxyでは、単純にネットワークからArduino等が接続されたシリアルポートへ、またはその逆について、生のデータの中継を担当してくれるだけなのでヌル文字が通信中に当然発生すること、これに由来しています。
後継のAction Script 3ではXMLSocketに加えてSocketという生データをやり取りするクラスが新たに導入されたことによってこの問題を解消できるのですが、Chumbyが対応しているFlashがAction Script 2相当であること、また無償のFlash開発環境であるmtascがAction Script 2であることを考えると、Action Script 2でサポートされているXMLSocketにおいてもserproxyをなんとか使えるようにすることは有益であると考えられます。

そこでserproxyを改造しました。改造ポイントをまとめたserproxy_hexbin.patchを公開します。なお以前、Chumby上のserproxyでFTDIを使うためのパッチを公開しましたが、それと併用できます。

変更点はコンフィグファイルでusehex=trueをすると有効になります。アイデアとしては、結局シリアルポートへのデータを中継するCGIを作った際のアイデアと同じで、1バイトを16進文字(0から9までの数字、A-Fまでのアルファベット)2文字で表記し送受信することでヌル文字が出現しないようにしました。例えばserproxy経由でシリアルポートに0xA5というバイトを送りたい場合、Flashでは"A5"という2文字を指定する、逆にシリアルポートから0xA5というバイトが送られてきたら、Flashには"A5"という2文字が転送されるようにしました。詳細はREADMEを見ていただくのがよいと思います。

この問題に気づいたのは、FlashでArduinoをコントロールする際に多くの方が使われているFirmataという環境を試している際、FlashからのArduinoのコントロールがうまくいかず困っていたときでした。FirmataはArduinoをコントロールするためにMIDIに似たプロトコルを採用しているのですが、ヌル文字が大量にでてきます。結果として、serproxy+XMLSocketにとっては想定外の環境、というわけでした。

02:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/678
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。