Edited at

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ファイルが作られます。