IrLPT は IrCOMM に置き換えられたようです。後者についてはまだテストしていませんので、以下は以前の IrLPT サポートについてのものです。 詳しい情報についてはメーリングリストアーカイブを調べてください。
以下記載のように /etc/conf.modules を編集してください。
現在のプリントジョブを lprm "*" で削除します。
depmod -a を実行します。
(kerneld を使っていないなら modprobe irtty を実行してください。 多分、ここの記述はもう古いでしょう)。
su で root になってから、 mknod /dev/irlpt0 c 161 10 としてください。 注: ./MAKEDEV irlpt0 という風にはまだできません。
/dev/irlpt0 に cat FILE >/dev/irlpt0 をつかって小さなファイルを書いてみます。 これは最初のチェックなので、プリンタに送るデータのフォーマットが違っているかどうかなんてことを気にする必要はありません。 私の経験範囲ではこれはいつでもうまくいくとは限りませんが、原因はまだ突き止めていません。
もっと良い方法は、/etc/printcap を変更して /dev/lp1 に加えて (あるいは /dev/lp1 の代わりに) /dev/irlpt0 を使うようにすることです。 詳しいやり方は Printing-HOWTO をご覧下さい。
簡単にプリンタを設定するには、プリンティングソフトウェア (例えば APSFILTER や MagicFilter の EZ-Magic (RedHat でもこの目的の GUI を持つソフトウェアがあるはずです) など) をつかうのも手です。使う前にまず /etc/printcap のコピーを作っておきましょう。
APSFILTER で HP LaserJet 6P (非 PostScript プリンタ。HP 6MP は PostScript プリンタです) を使う場合の例です。 当面問題となる質問は以下の二つです。 "Do you have a (s)serial or a (p)arallel printer interface?" 「プリンタインターフェースはパラレル (p) シリアル (s) のどちら?」 この質問の答えは p です。 "What's the device name for your parallel printer interface?" 「プリンタインターフェース名はなんですか」。答えは /dev/irlpt0 です。
プリントデーモンを kill -HUP <PID of lpd> として再スタートします。 これ以外のプリントデーモンを使っている場合には所定のコマンドを実行して ください。 【訳注: Debian GNU/Linux だと、/etc/init.d/lpd restart など。】
プリンタの接続状態の表示 (HP 6P/6MP だと左下のペーパトレイ近くの IR ポート上の緑のランプです) で、通信がなされていることを確認します。
私は今のところ大体 10 ページより大きなプリント出力に成功していません。 但し、これはプリンタハードウェアの搭載メモリ (16MB) のためかもしれません。 ソフトウェアにも問題はあるようです。Thomas Davis さんによると 「私は irlpt に制限を入れて、大きなプリント出力を送る際にメモリを食わないようにしています」ということです。
樋口 隆英さんによると、「IrCOMM で、IrDA ポートと IrCOMM プロトコルを組み合わせて (IrLPT ではなく) プリンタ (Canon BJC-80v) を使う場合のデバッグを行っています。 短い電子メールテキストの印刷はできますが、gs で PostScript を印刷しようとすると簡単にデッドロックしてしまいます」ということです。
Thomas Davis http://www.jps.net/tadavis/irda さんの Web ページによると、 IrLPT を使うには、以下の手順を踏む必要があるということです。
/sbin/modprobe irlpt_server /sbin/mknod /dev/irlptd c 10 `grep irlptd /proc/misc|cut -f 1` |
#/bin/sh # while (true) do cat /dev/irlptd | lpr done |
int discover_devices(int fd) { struct irda_device_list *list; unsigned char buf[sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * MAX_DEVICES]; int len; int daddr; int i; len = sizeof(struct irda_device_list) + sizeof(struct irda_device_info) * MAX_DEVICES; list = (struct irda_device_list *) buf; if (getsockopt(sfd, SOL_IRLMP, IRLMP_ENUMDEVICES, buf, &len)) { perror("getsockopt"); exit(-1); } if (len > 0) { /* |
まず最初の例を使ってみてください。本当はユーザにこう聞くべきではあります。
*/ daddr = list->dev[0].daddr; printf("Discovered: (list len=%d)\n", list->len); for (i=0;i<list->len;i++) { printf(" name: %s\n", list->dev[i].info); printf(" daddr: %08x\n", list->dev[i].daddr); printf(" saddr: %08x\n", list->dev[i].saddr); printf("\n"); } } return daddr; } void client() { struct sockaddr_irda peer; int addrlen = sizeof(struct sockaddr_irda); int daddr, actual; char buf[1024]; fd = socket(AF_IRDA, SOCK_STREAM, 0); daddr = discover_devices(fd); peer.sir_family = AF_IRDA; strcpy(peer.sir_name, "P1284"); peer.sir_addr = daddr; connect(fd, (struct sockaddr *) &daddr, sizeof(struct sockaddr_irda)); /* Try to send something */ actual = send(fd, "Testing", 8, 0); /* Try to read reply */ actual = recv(fd, buf, 1024, 0); } |