3.2. プリンタ接続 - IrLPT, IrTTP, IrCOMM?

IrLPT は IrCOMM に置き換えられたようです。後者についてはまだテストしていませんので、以下は以前の 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`
この時点で、IrLPT サーバはプリントジョブを受け付け可能になります。 ここからすべきことは、以下の単純なシェルスクリプトの内容です。
#/bin/sh
#
while (true)
do
cat /dev/irlptd | lpr
done
Dag Brattli さんによると「自分で IrDA アプリケーションを書いてテストする際に、ユーザ空間内で物事が閉じるほうがいいという人には、以下が役に立てばと思います。 一部のプリンタは IrLPT の制約を嫌って IrTTP を実際に使っており、この場合プリンタと会話するための、小さなユーザ空間プリンタクライアントを書くことができます」
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);
}