カテゴリー:プリンター

検索



Please click now!!

iOS4.2・AirPrint で体験する avahi。

さてさて。 前回のエントリで「iOS4.2・AirPrint で体験する CUPS。」ってのを書きましたが、その続編です。いきなりこちらから読むと内容がちぃとも解らないかもしれないので前編から読んで頂ければと思います。

前回は確か、cups-pdf インストールして airprint.types というファイルを /usr/local/share/cups/mime/ に設置したけど、ダメだったー。ってところで終わりました。

iPhone4 に FreeBSD 上のプリンタを認識させるには CUPS ではなく avahi-daemon のほうであるようなので、実は avahi-daemon に設定ファイルを用意する必要があるのでありました。MacOSX や Windows では "Bonjour" と呼ばれている実装が FreeBSD 的には "avahi" になります。

ports 的には net/avahi になるのですが KDE4 をインストールしていると net/avahi-app のみがインストールされると思います。今のところはそれで十分でしょう。gnome の場合も net/avahi-app はインストールされるのかなぁ?僕は知らないのですが。もしインストールされていないようでしたらインストールして avahi-daemon と avahi-dnsconfd を起動してください。

avahi の設定ファイルは /usr/local/etc/avahi/ と言うディレクトリで管理されていますが、その中に /services/ と言うディレクトリがあります。ここに何かしらの名前で、今回は例えば AirPrint-PDF_Printer.service と言うファイルをしましょうか。ファイルを一個おけば、それが iPhone4 上のプリンタメニューに表示されるのであります。

AirPrint_avahi_1.jpg

では、AirPrint-PDF_Printer.service の中身はどう書けば良いのか?ってことですよね。以下は例です。

<?xml version="1.0" ?>
<!DOCTYPE service-group  SYSTEM 'avahi-service.dtd'>
<service-group>
<name replace-wildcards="yes">AirPrint PDF_Printer @ %h</name>
<service>
<type>_ipp._tcp</type>
<subtype>_universal._sub._ipp._tcp</subtype>
<port>631</port>
<txt-record>txtvers=1</txt-record>
<txt-record>qtotal=1</txt-record>
<txt-record>Transparent=T</txt-record>
<txt-record>URF=none</txt-record>
<txt-record>rp=printers/PDF_Printer</txt-record>
<txt-record>note=FreeBSD/amd64</txt-record>
<txt-record>product=(GPL Ghostscript)</txt-record>
<txt-record>printer-state=3</txt-record>
<txt-record>printer-type=0x80f04c</txt-record>
<txt-record>pdl=application/octet-stream,
                application/pdf,
                application/postscript,
                application/vnd.cups-banner,
                application/vnd.cups-command,
                application/vnd.cups-postscript,
                application/vnd.cups-raw,
                image/gif,
                image/jpeg,
                image/png,
                image/tiff,
                text/html,
                text/plain
</txt-record>
</service>
</service-group>

途中、"pdl= " の行だけ改行していますが、実際は一行で書く必要があります。

後、avahi のサービスの設定と CUPS に登録してあるプリンタはどこで結び付くのだ? と思いますがそれは "rp=printers/PDF_Printer" の行になります。CUPS の URL http://localhost:631/ にアクセスして [プリンター] タブに表示されているプリンタをクリックすると URL が表示される(http://localhost:631/printers/PDF_Printer)と思いますが、その http://localhost:631/ を取ったヤツになります。

後、設定を見ると type タグの中に情報が書かれていますが、ipp に対するサービスの設定である必要があります。良くわからないのが "printer-type=" ですが、まぁ、これで多分大丈夫だと思いますf(^^;;。

あ。そーそー。前回設定した /usr/local/share/cups/mime/airprint.types は削除しました。これで一応設定は完了です。avahi-daemon と avahi-dnsconfd、cupsd を再起動します。

でもって早速 iPhone4 のブラウザを開いて「プリント」を見てみましょう。無事に表示されたでしょうか?そして、印刷してみましょう。前回も書いた通り、FreeBSD の場合は /var/spool/cups-pdf/ にユーザ名のディレクトリができて、その中に PDF ファイルが出力されます。無事に出来ていたら完成です;-)。

え?ダメですか・・。ではここからはトラブルシューティングです。

まず、CUPS の管理ページにアクセスして [管理] タブの右側の一番下にある 「トラブルシューティングのためにデバッグ情報を保存」にチェックを入れて設定を保存します。すると、/var/log/cups/error_log に iPhone4 からアクセスがあった場合にログが出力されるのでその様子を見ます。

後、tcpdump -i re0 port ipp とかして iPhone4 からパケットが正常に流れてきているか確認するのも良いでしょう。

tcpdump から解ることとして、IPv4、IPv6 のどちらでパケットが到達しているか確認するのも良いかもしれないです。筆者の環境では 2001:c90:609:: でお互いに LISTEN にしていたのでガクゼンとして慌てて BB ルータの IPv6 ブリッジを切りました・・orz。iPhone4 恐るべし。NTT の IPv6 閉域網のアドレスで LAN 内をアクセスしていたんかいっ!! って感じで・・。

自宅のネットワークがデアルスタクの人はまず、ネットワークの状態を確認しておいたほうが良いでしょう。

続いて、CUPS のエラーログを見ます。無事に印刷できないログの原因としてパッと思いつくのが以下でしょうか。

cupsdAuthorize: No authentication data provided.

このログは後で解ったのですが、 PDF の出力には特に関係は無いので無視してよさそうです。もう一個のログのほうが重要でした。

Request from "192.168.1.200" using invalid Host: field "wanchan.local"

"192.168.1.200" と言うアドレスは iPhone4 のアドレスです。IPv6 でアクセスしている場合にはここに IPv6 が入ると思います。もう一個の "wanchan.local" と言うのは CUPS が動作している FreeBSD マシン名です。ホスト名の FQDN 的には wanchan.running-dog.net なのですが、mdns・avahi 的には wanchan.local になるんですな。

けど、何故か知らないですが、CUPS 自体がこの "wanchan.local" と言う「ホスト名」を認識しないみたいです。なので、/usr/local/etc/cups/cupsd.conf に以下の行を追加して上げてください。

ServerAlias wanchan.local

これで cupsd を再起動します。で、再度 iPhone4 からチャレンジ。こんどはどうだぁ? 無事に印刷されました?

あ。無事に印刷されない場合 iPhone4 はプリントクライアントが動きっぱなしになります。パケットキャプチャしているとずっとパケット送り続けてきます。タスクリストに表示されているので job をキャンセルしましょう。
#あ。iPhone3G ではマルチタスクが無くて、この画面を表示できないから AirPrint に対応してないのねー。なるほど。

AirPrint_avahi_2.jpg

仮に、無事に印刷ができたと仮定して FreeBSD 側を見てみると /var/spool/cups-pdf/ANONYMOUS/ と言うディレクトリが出来ていると思います。オーナーは nobody:nobody。認証がなくとも無事に印刷できたようですね。よかった。よかった;-)。

以上で「iPhone4 から PDF プリンタへの印刷」は完了です。


さてと。avahi についてですが、僕もあまりよく知らないのですが、知っている限りの情報をちょっと書いてみましょう。

まず、mdns・cups・avahi を起動するとネットワーク上の色々なサービスが、許可されていれば相互に利用できます。ports 的には net/avahi-gtk と言うのがあり、こいつをインストールすると avahi-discover-standalone コマンドがインストールされ GUI で、現在利用できるサービスの一覧が表示されます。サービス・NIC と後、IPv4/IPv6 の情報が表示されます。表示されている情報をクリックするとこれまたなかなか面白いですがf(^^;;。一回確認してみると面白いかもしれません;-)。

ただ、サーバにプリンタを付けているので X なんざねーよ。って場合があるかもしれません。そんな時は 以下のコマンドを叩いてみると良いでしょう。

$ avahi-browse -rat

CUI で現在提供されているサービスの一覧が表示されます。今回のオプションは -rat を指定しています。

例えば、僕の環境では MacOSX に接続されている HL-2040 プリンタが見えるわけです。そいつの情報は "= re0 IPv6 Brother HL-2040 series @ macosx-host _ipp._tcp local" として表示されます。情報がややこしいのでここには書きませんが、上記コマンドを叩くとだいたい想像が付くと思います。表示される内容は avahi-discover-standalone の GUI で表示されるものと基本的には一緒です。

実は、ここに表示された内容を /usr/local/etc/avahi/services/ の下に置いた services ファイルの XML に記述することになります。なので、僕の場合は MacOSX に接続されている HL-2040 プリンタの XML ファイルを書いて、それをサも自分の PC のサービスの如く iPhone4 に見せて、

iPhone4 -> FreeBSD(wanchan) -> MacOSX -> プリンタ -> 印刷

と言うことも可能になるわけですね。ややこしいけど;-)。

ただ、残念なことに FreeBSD に直に接続しているプリンタが無いので avahi-browse の出力結果がどのようになるのか解らないのが悲しいところです。

今回は iPhone4 対応の PDF プリンタが準備できたのでヨシとしておきましょうか。

ちなみに、僕の場合は、多分 MacOSX 上に PDF プリンタを準備したほうが圧倒的に早いしらくちんだったと自分でも思います。が、それだとあまりネタにならないしねぇ;-)。

非常に疲れた・・。ふぅ。

iOS4.2・AirPrint で体験する CUPS。

iOS4.2 の機能の目玉の一つ、AirPrint が HP の対応プリンタ以外のハードウェアでも利用できて、印刷できるらしい。と言うのが最近あちこちで騒がれています。例えばこれ。

ascii.jp の「OS XのプリンターをAirPrint経由で使う」
マイコミの「既存のプリンタでiOS AirPrint印刷に対応する方法」

僕的には ascii.jp の記事のほうがラクだったのでそっちで試してみました。本文にあるとおりですが、/usr/share/cups/mime/airprint.types と言うファイルを作成して、その中に以下の行を書いたら MacOSX をリブート。

image/urf urf (0,UNIRAST<00>)

後は、システム環境設定の「共有」でプリンタ共有にチェックを付けて「全員 プリント可能」を選択するだけでで iPhone4 から AirPrint が利用できます。

AirPrint_2.jpg

ちなみに元記事では「認証ダイアログ」が出てきてしまう。と書かれていましたが「プリンタとファクス」の設定の所で [ネットワークでこのプリンタを共有] のチェックを2,3回付けたり外したりしてシステム環境設定を閉じれば、iPhone4 側では特に認証を聞かれることもなく印刷が可能になります;-)。

AirPrint_3.jpg

このブログで何回か書いていますが、僕はブラザーの HL-2040 を利用しています。iPhone4 のキャプチャでちゃんと認識できます。HP のプリンタでなくともこうして iOS4.2 の AirPrint が利用できるのですね。ぱちぱちぱち。
#ちなみに iPhone3G では AirPrint はまぁるで利用できません。メニュー自体がありません。あしからず・・。orz。


さて。これで終わったら、ただの記事のパクリですね。もうちょっと足を突っ込んでみましょうか。

そもそも、MacOSX では CUPS と言うプリントシステムを提供しています。Apple 謹製で、僕が普段利用している FreeBSD も CUPS が動作します。

以前のエントリで「CUPS で FreeBSD から簡単印刷。(MacOSX があればだよ)」というのを書いていますが、詳しくはそっちに譲ります。

MacOSX のシステム環境設定の「共有」で「プリンタ共有」の制御を行うのは、実は CUPS の設定を変更しているんですな。試しに http://localhost:631 にアクセスして「管理」タブの右側の「このシステムに接続されているプリンターを共有」のチェックのところを見ていると解ります。「共有」の「プリンタ共有」のチェックを外して http://localhost:631 の「管理」タブのページをリロードすると、チェックが外れたりします。

AirPrint_1.jpg

ブラウザとシステム環境設定の画面をキャプチャしたモノですがちゃんと見えるかな?

その時、/etc/cups/cupsd.conf にも実はこっそりと設定が入って、更にバックグラウンドで cupsd がリサスタートされるわけですね。ふむー。立派な GUI なこと。FreeBSD にもこーいう統合的な GUI が欲しいなぁ。KDE4 には無いんだけど、gnome にはあるのかなぁ?

ちなみに共有するかしないかチェックによって /etc/cups/cupsd.conf が書き換わるんですが、以下はその差分ですねー。

--- cupsd.conf.O        2010-12-14 02:17:05.000000000 +0900
+++ cupsd.conf  2010-12-14 02:17:24.000000000 +0900
@@ -1,19 +1,21 @@
 LogLevel warn
 SystemGroup admin
 SystemGroupAuthKey system.print.admin
-# Only listen for connections from the local machine.
-Listen localhost:631
+# Allow remote access
+Port 631
 Listen /private/var/run/cupsd
-# Show shared printers on the local network.
+# Enable printer sharing and shared printers.
 Browsing On
 BrowseOrder allow,deny
 BrowseAllow all
 BrowseRemoteProtocols 
-BrowseLocalProtocols
+BrowseAddress @LOCAL
+BrowseLocalProtocols CUPS dnssd
 DefaultAuthType Basic
 
-  # Restrict access to the server...
+  # Allow shared printing...
   Order allow,deny
+  Allow @LOCAL
 </Location>
 <Location /admin>
 </Location>

と、言うことで MacOSX っちゅーのは UNIX 知っている人でもむやみやたらに手で設定ファイル変更したらアカンよ。って感じなのでしょうかね。

それにしてもその昔、「プリンタ共有」ってのは samba で行い、smb.conf の中にプリンタ共有の設定を記述することにより行っていたのですが、MacOSX がベースになると CUPS 側でプリンタのドライバから共有まで一手に面倒見てくれるので、随分と変わったモノだ。などとなるのでありました。

Windows を利用している人でも、UNIX 系 OS や MacOSX がネットワークにある人は是非とも Bonjour をインストールしておきたいものです。って、 Windows7 版ではもうないんだっけか;-)。


さてさて。話がここで終わってしまうとこれまたどーも尻切れとんぼちっくなので FreeBSD での動作についてもちっくと書いておきましょうかね。

結論から言うと FreeBSD 上で動作する CUPS では AirPrint ができませんでした。

僕の知識が多分足りないのだと思います。思いますが・・。

簡単に行った手順を書いておきます。

1. まず、FreeBSD の CUPS に対応しているプリンタが無いので cups-pdf と言うプリンタを ports からインストールします。 CUPS 経由で印刷したものを PDF 化する "プリンタ" です。 firefox3 や KDE4 では「印刷」で「PDF に出力」ってのがあるので本当は必要無いのですけどね。 print/cups-pdf という ports です。

2. 続いて http://localhost:631 にアクセスして cups-pdf を「プリンタの追加」に登録します。「ロカールプリンタ」を選択し、ベンダは「Generic」を選択すればプリンタの準備は完了です。後は実際にアプリケーションから印刷してみます。印刷した時にできる PDF は /var/spool/cups/cups-pdf/ユーザ名/ に出力されます。

3. さて。プリンタの準備も整ったので、早速 AirPrint 対応してみましょう。一番上に書いた airprint.types というファイルを /usr/local/share/cups/mime/ に設置します。後、一応、/usr/local/etc/cups/ にも symlink しましょうかね。

4. cupsd・avahi-daemon・mdnsd を再起動 (restart) します。プリンタ共有しようとする場合、この三つのデーモンはセットですね。どれか一個が起動していない(hoge_enable="YES" になっていない)と MacOSX のプリンタも共有できないです。その割りには MacOSX 側では avahi-daemon が動いている気配無いのにプリンタ共有できるんですよね。不思議だ・・。

で、自分が思っている設定が終わったので、早速 iPhone4 からアクセスするのですが、「プリタンーが見つかりません。」と悲しい状態になるのでありました・・。orz。

多分、 cupsd・avahi-daemon・mdnsd のうち、どれかの設定が悪いのだと思います。ログを見ていると認証というか、アクセス系のエラーが出ていたのでそっち方面の設定をしたら良いかもしれません。そもそも、僕の iPhone4 は自宅の無線 LAN に接続すると IPv6 でアクセスしているので、更に何か設定が必要なのかもしれません。

ちなみに、MacOSX も FreeBSD も cupsd・avahi-daemon・mdnsd は全て IPv4/IPv6 のデアルスタクで動作しています。


とまぁ、大体こんな感じで試したのですが、 FreeBSD で AirPrint をやるにはもう少し情報収集してから再度トライする必要がありそうです。せっかく MacOSX と同じ環境持っているんですしね。けどもまぁ、裏を返すと MacOSX で AirPrint できるんだからもういいんじゃね? ともなるんでが・・f(^^;;。

続編書きました。-> 「iOS4.2・AirPrint で体験する avahi。

CUPS で FreeBSD から簡単印刷。(MacOSX があればだよ)

僕の自宅にはネットワーク上に FreeBSD 二台、Windows7 二台、MacOSX 一台がクライアント PC として存在してます。でもって自宅にはプリンタがあって ブラザー HL-2040 があるのですが、このプリンター、USB とパラレルポートで接続できるのであります。

HL-2040 のパラレルポートは Windows7 に、USB は MacOSX に接続されているので FreeBSD が動作している PC にはプリンタが接続されていないのであります。

そもそも、FreeBSD ではプリンタが動作するようにする設定はややこしいし、無理して FreeBSD から印刷しなくとも、cupsd が動作していて、ベンダがドライバを用意している MacOSX から印刷すれば綺麗に印刷できるのでそれで良いやー。とか思っていたわけですが・・。

しかし、よくよく調べてみるとブラザーは MacOSX と Linux 用に cups ドライバを用意しているので、それを FreeBSD に持ってきたら FreeBSD でも綺麗に印刷できるではないかい?

とか思い、FreeBSD で cupsd を onestart したわけです。で、その後に http://localhost:631 にアクセスするわけです。そしたら・・。

あぁれぇ? MacOSX に接続しているプリンタが FreeBSD から見えるではありませんかっ!! 以下は cupsd に接続した時の「プリンタの管理」の画面です。

cups_printer.png

cupsd で既に認識されているので、後はアプリから使えるのか確認するだけです。まずは GTK アプリの代表格 Firefox からですが、「印刷」を選択するとちゃーんと MacOSX に接続されたプリンターが見えていて、印刷もちゃんとできました。

次は僕がメインで利用しているデスクトップ環境の KDE4 の konqueror で印刷してみましたが、これまたプリンタがちゃんと見えていてちゃんと印刷ができたのでありました。日本語も文字化けせずに綺麗に印刷されております(@_o)。

す、すげーな。って感じなのてありました。

さてと。ここからはただの観測でしかなくて、全くウラは取ってないのですが、MacOSX と、後、KDE4 を利用した僕のデスクトップ環境では mDNS やら avahi やら hald などがガシガシ動いている環境です。なので、MacOSX 上の samba でファイル共有とプリンタ共有がオンになっていると Apple 謹製の cupsd はサクっとお互いを認識しあえるのかなぁ(サクっと認識されたのは多分 mDNS の影響だと、僕は思うのでありますが)。などと思った次第です。

MacOSX に接続され、ネットワーク共有されているプリンタはサクっと利用できると言うことなのでしょうなぁ。

それにしても上のほうに書いた通り HL-2040 のパラレルポートは Windows7 に接続しています。で、Windows7 に接続しているプリンタもネットワーク共有しているのですが、こいつは cupsd からは見ることが出なかったのでありました。

cupsd 同士、後、mDNS などの親和性がすごーく良い。と言うことなんでしょうかねぇ。

最後にですが FreeBSD 上で make した cups-base の make config のオプションを付けておきます。

# This file is auto-generated by 'make config'.
# No user-servicable parts inside!
# Options for cups-base-1.4.3
_OPTIONS_READ=cups-base-1.4.3
WITH_GNUTLS=true
WITHOUT_PHP=true
WITHOUT_PYTHON=true
WITHOUT_LIBPAPER=true
WITH_DNSSD=true
WITHOUT_PAM=true
WITHOUT_LDAP=true
WITHOUT_DBUS=true
WITHOUT_LIBUSB=true
WITH_GHOSTSCRIPT=true
WITHOUT_XPDF=true
WITHOUT_XDG_OPEN=true

本当に良く分からないのですが WITH_DNSSD=true なのかなぁ。 FreeBSD で簡単にプリンタを使いたければ MacOSX に接続されているプリンタで。って感じでしょうか;-)。

リコー imagio PM C4500SP。

FreeBSD で印刷。これは永遠のテーマですね。gs ドライバがヘボいと、たとえ cupsd 経由で印刷したとしても日本語が文字化けするしで使い物にならないことが多い。

そんな状態で、リコー imagio PM C4500SP を FreeBSD から利用する機会があった。PM C450SP では lpr が動作していて、FreeBSD においては ipp プロトコルで通信し、利用するためには IP アドレスとキュー名を FreeBSD 側で指定する必要がある。

ちなみに、このプリンター、OS は NetBSD と言うウワサあり。IPv6 で ipp プロトコルの通信ができるプリンターらしい;-)。

僕は、KDE3 を利用しているのだけど、KDE3 にはメニューに [設定]->[プリンタ] と言うのがあって、プリンタの設定があっと言う間に行える。

プリンタの設定ウィサードを起動する前に cupsd_enable="YES" として cupd を起動し、ウィザードの下のほうにある [現在の印刷システム] を CUPS にすればええだけ。後はプリンターを登録するだけ。かんたーーん;-)。

で、ちゃんとした PS プリンターであれば簡単に動くんだけどねぇ、gs 経由で印刷する時は日本語が表示できなくてイヤになる時が多々ある。この辺りになるとプリンタの性能がモノを言うかな・・。

後、CUPS 経由で印刷する場合、ベンダが提供している MacOSX のドライバが役に立つときがある。Linux 版が無い場合は MacOSX 用のドライバを利用してみましょう;-)。

ただし、FreeBSD でどうやって dmg アーカイブを溶かすんだ?って話はあるんだけどね(^^;;。

 
Copyright (c) 1997-2011 takachan@running-dog.net All Rights Reserved.