Linux
AirPrint
avahi-daemon
zeroconf

AirPrintするためだけにUbuntuでAvahi-daemonを動かしてみました。

More than 1 year has passed since last update.

WiFiルーターと異なるLANセグメントにあるプリンターにiPadからAirPrintしたい。

iOSから「印刷」を選ぶとプリンタが検索できますが、WiFiルーターと同じLANセグメントにプリンターを設置していないと一覧に表示されません。

ポリシー上、あるいはトポロジー上、WiFiセグメントとLANセグメントを同一にしたくない場合もあるかと思います。

そこで、WiFiルーターのLAN側ポート(WiFi接続と等価な側)にpcDuinoを繋いで、Avahi-daemonを使ってプリンターのIPアドレスを告知するようにしてみました。

(普通にRaspberryPiとか、型落ちして使わなくなった昔のRaspberryPiとかでいいとおもいます)

Avahi-daemonのインストール

$ sudo apt-get install avahi-daemon

まあ、これだけなんですが。

設定とか

設定ファイルは /etc/avahi/ にあります。
プリンタサービスは、/etc/avahi/services/ 以下に、適当なプリンタ名.service というxmlファイルを置きます。

<?xml version="1.0" ?>
<!DOCTYPE service-group SYSTEM 'avahi-service.dtd'>
<service-group>
  <name replace-wildcards="yes">AirPrint DocuCentre-V C5585</name>
  <service>
    <type>_ipp._tcp</type>
    <subtype>_universal._sub._ipp._tcp</subtype>
    <host-name>xeroxcolor.local</host-name>
    <port>631</port>
    <txt-record>txtvers=1</txt-record>
    <txt-record>qtotal=1</txt-record>
    <txt-record>rp=ipp/print</txt-record>
    ・・・中略・・・
    <txt-record>Transparent=T</txt-record>
    <txt-record>Binary=T</txt-record>
    <txt-record>TBCP=F</txt-record>
    <txt-record>URF=none</txt-record>
  </service>
</service-group>

*.localに対する hosts の記述

*.local というドメイン名は、AppleのBonjour(zeroconf)固有のローカルドメイン名になります。これもAvahi-daemonが知らせてくれますので、
/etc/avahi/hosts というファイルにIPアドレスを書いておきます。

# This file is part of avahi.
#
# avahi is free software; you can redistribute it and/or modify it
# ・・・
192.168.1.2  xeroxcolor.local

ここで、192.168.1.2 は、実際に設置されているAirPrint対応のプリンタの、到達可能なIPアドレスの一例です。
WiFiルーターが端末に割り振るアドレスは192.168.1.x ではない、と仮定します。
(同一LANセグメントであれば、そもそもAvahi-daemonを入れなくてもプリンタが勝手にBonjourを喋ります)

Avahi-daemonを再起動します。

 $ sudo service avahi-daemon restart

デバッグ

$ avahi-browse -r -a

同一LAN上にあるBonjour(zeroconf)のサービス一覧(自分のマシンも含む)が表示されます。

補足

ここまでの説明で、プリンタ名.serviceをどうやって作成するかの説明が抜けています。
作成方法としては、

(1) AirPrint対応プリンタと同じLANセグメントにこのLinuxを接続して、
~~~
$ avahi-browse -r -a
~~~
の表示結果から*.service を書く。
(上記の

    <txt-record>・・・</txt-record>

のところを全部埋めていく。)という感じになります。

(2) AirPrintしたいPrinterがもともとAirPrint非対応の場合はCUPS経由でのprintを行うようにします。

CUPSサーバーを先にインストールして、LinuxからCUPS経由で印刷できることを確認しておきます。

そのあとでAvahi-daemonをインストールすれば、わりと自動でそのCUPSプリンタ.serviceファイルが作られます。