IrDA Test Program Copyright 2002 by Masahiro Sako. All Right Reserved Ver 0.04 on Feb 20 2002 1.これは何?   これは、FreeBSDで赤外線ポートを用いた通信を実験するために作った  プログラムです。IrDA規格を参考にプログラミングしており、FreeBSDで  ポポペ(popope:ポケットポストペット)と通信し、ゲートウェイやサーバ  になることができます。   Ver 0.04 からWin98の親にもなれるようになりました。 2.どうやって作った?   ひょんなことからポポペを手にしました。Webで、いろいろ調べてみると、  LinuxではkernelがIrDAをしゃべるらしいが、FreeBSDでは駄目なようでした。   そこで、IrDAのスペック( http://www.irda.org/standards/specifications.asp )  を読みながら、実験&勉強を兼ねてプログラムを作ってみることにしました。   一応、IrLAP,IrLMP,TinyTP,IrCOMM などを部分的に実装しています。   IrDA Lite ver 1.0 の 2.3 Minimum Secondary Only という部分に書かれて  いるSeccondary Only Deviceになるプログラムです。   英語は得意ではないので、試行錯誤的に、問題が出たらそれに関連しそうな  部分を見つけて、そこだけ読みプログラミングしてみる。を繰り返して作った  ので、スペックを勘違いしている部分もあるかもしれませんし、プログラム  自体も、ちょっぴりスパゲティ状態になっています。 3.どんな動作をする?   起動すると/dev/cuaa1をopenして、IrDAで他のデバイスが見つかるのを  ひたすら待ちます。   IrDA Lite ver 1.0 の 2.3 Minimum Secondary Only という部分に書かれて  いるSeccondary Only Deviceになるプログラムです。   ポポペも通常状態では何もしゃべっていないので、この時点では何も起こりません。 ポポペを通信状態にすると、ポポペは「私はここに居ます。誰か居ませんか?」 と言うような意味のXID_commandを数回出します。これが聞こえると、FreeBSD側が XID_responseで答えます。そして、ポポペがSNRM_commandを投げてきてUA_responseで 答えることにより、IrLAPの接続が成立します。 その後IrLMP,TinyTP,IrCOMMと上位プロトコルが立ち上がっていき、ポポペから CLIENTという文字列が来て、CLIENTSERVERと答えてあげるとPPPの接続要求がきます。   この段階で、このプログラムはPPPの処理をするために、/usr/sbin/ppp  (いわゆる user ppp)を立ち上げます。/etc/ppp/ppp.confを適切に  設定しておいてください。(後述)   PPPの接続ができると、ようやく、ポポペ側で「サーバとつながった」みたいな  表示に変わります。   Win95,98などのケーブル接続も同じIrDAを使っているようです。  (ポポペとPPPでつながることを確認しました)  Winの場合は赤外線を使う設定にしておくとケーブル接続のプログラムを実行して いなくても、数秒おきにXID_commandを投げているので、このプログラムを近くの FreeBSDマシンで実行すると、すぐに「近くにFreeBSDが見つかりました」みたいな メッセージが表示されます。   Win側でケーブル接続を「ゲスト」として立ち上げると、popopeと同じように  PPPで接続されます。ファイルの共有が出来ない云々というメッセージが表示され  ますが、とりあえず無視です。たぶんPPPより上の話でしょう。   IPによる通信(DNS & ping)は問題なく出来ました。   ちなみに、FreeBSDという文字列(マシン名のようなもの)はプログラムの中に 埋め込まれています。設定変更できるようになっていません。いずれ、設定変更 できるようにします。 4.FreeBSDの設定   3にも書きましたが、PPPの処理はuser pppにお任せしています。 起動には、 /usr/sbin/ppp -direct irda  というコマンドを使っていますので、/etc/ppp/ppp.conf にirdaという セクションを作って適切に設定してください。   もし、このプログラムを動かすFreeBSDをゲートウェイとして使用し、  その向こう側にあるマシンとも通信する必要がある場合には、パケットを  フォワーディングするために、/etc/rc.confで、gateway_enable="YES"  と設定して再起動するか、 sysctl -w net.inet.ip.forwarding=1  を実行しなければならないでしょう。  (DNS,sendmail,popなどが全てこのマシンにあり、その他のマシンと   通信する必要がないならば、この設定は不要です)   この場合には、ポポペへのroutingをその他のマシンへも設定するか、  NATを使うか、proxy arpを使うか、いずれかの設定をしなければなら  ないでしょう。(私は最後のproxy arpを使っています) -----設定例(/etc/ppp/ppp.conf)--------- irda: disable dns accept dns enable proxy set ifaddr 192.168.0.4 192.168.0.5 set openmode passive ---------------------------------------   プログラムのバイナリはどこに置いても良いです。設定ファイルもないし、 ログへの出力機能もありません。   実行状態は画面(stderr)へ報告されますが、私がデバッグに使うための メッセージがほとんどなので、ソースを見ないと何が何なのか分からない でしょうね。   メッセージのうち、 foo: *** hogehoge ***  と、*** がついて出てくるメッセージが想定外の状況が起こった場合のメッセージ  なので、再現性のある *** のメッセージが出るような場合には、連絡を  いただけるとデバッグに役立つかもしれません。。   ただし、mediaBusy 云々というものは、Primary機能を実装するための  テスト中のために出るものなので、無視してください。   それから、PPPが無通信のために切断されたとき(FreeBSD側で切ったとき)  PPPのプロセスは死なないけれど、読み込みが0バイトになるので、とりあえず、  recv_pppで-1を返すようにしています。この関係で、 recv_ppp: *** read length = 0 *** : r=0, rlen=0 ppp_job: RUN: recv_ppp: *** error ***  というのが出ますが、無視してください。   /dev/cuaa1が赤外線ポートになるようにBIOSで設定してください。  FreeBSDのカーネルは単なるシリアルポートとして認識するようです。   /dev/cuaa1がopenできる、かつ /usr/sbin/pppが実行できるユーザで、  irdaを実行してください。stderrにメッセージが出力されることもあり、  デーモンになる機能は実装していません。   現状では、私は、ルート権限で、 # irda >& logfile  として実行して遊んでいます。   実行中にctrl+Tを押すと(SIGINFO:status request from keyboard)  プログラム内部の状態変数などの情報(debuginfo)を表示します。   kill -USR1 としても同様の表示をします。 5.今後の課題   現状で一番大きな課題は、たまに、何度データを投げてもポポペが受け  取ってくれない状況に陥ることです。 send_i_response: ***** retryCounter = %d *****  というメッセージが出て、どんどんカウンターが増えていくという状況です。  なぜそうなるかが分からないのですが、なんとかしたいと思っています。  (2002.2.18現在、出なくなりました。出るようなら教えてください)   PPPが無通信のために切断されたとき(FreeBSD側で切ったとき) PPPの  プロセスは死なないけれど、読み込みが0バイトになるので、とりあえず、  recv_pppで-1を返すようにしています。これはFreeBSDの仕様を調べて  直そうと思っています。   /dev/cuaa1しか使えないし、ログの要否やログの記録場所なども指定でき  ないので、configファイルか実行時のオプションなどで、設定できるように  したいと思っています。   デーモンになるか、gettyから起動されるようにするか、、、とにかく  自動で起動されるように出来るようにしたいです。   Secondary OnlyなのでPrimaryになってくれる人としか通信できません。  つまり、このプログラムをインストールした2台のFreeBSDを用意しても  通信されられません。早くPrimaryにもなれるようにしたいと思います。   Windowsのケーブル接続とは、まだちゃんと通信できません。まだ試行錯誤  していないのが最大の理由なので、これからがんばります。   IrDA Liteを見て作ったので、IrLAPレイヤーでWindowSizeが1しか実装  されていませんが、2以上もサポートしたいなぁと思っています。   最後に、実装上の細かい話ですが、現状では、各レイヤーをデータが渡る  たびにデータ全体をコピーしています。データバッファを標準化して、  各レイヤーのヘッダを付加したり削除したり出来るように変更したいなぁと  思っています。(案は出来ています) 6.著作権など   試しに作ってみただけなので、利用料を取ろうとか、配布料を取ろう  とかは思っていません。が、著作権は主張しておこうと思います。   成長途中なので、むやみにやたらに配布されても困ります。 が、いろいろ使ってもらって問題点を把握するのも良いなぁと思います。   こういう文章をどう書けばよいか良く分からないので適当に書いています  ここの書き方も誰かに教えてもらって変更していくつもりです。ときどき  Webを見てみて、プログラムの状況、利用規定の状況を確認してください。   FreeBSDユーザは、このプログラムを自分のコンピュータにコピーして  実行することができます。他の人にもこのプログラムを使ってもらうために  コピーを再配布することができます。   自分の環境に合わせるためにソースを変更してコンパイルし実行する  ことができます。バグを発見した場合に、ソースを変更してコンパイルして  実行し、変更が正しいかを確認することができます。   変更したものの再配布はせずに変更点について私に教えてください。  このプログラムを今後も成長させて、より良いものにしていこうと私は思って  います。利用してみての感想や意見などを私に連絡してくださるよう  お願いします。   連絡先: Masahiro Sako   Web: http://www.sakop.net/popope/                               以上