2010年11月29日

(調査中)iPhone 4.2.1のAirPrintをブラザーのプリンタでダイレクト印刷

やっぱり、自分の持っているプリンタでAirPrintしたい。それもPCを介さずに、ダイレクトに。
幸いなことに私の持っているプリンタはBonjour (mDNS)対応のプリンタであり、なんとかAirPrintできそうだ。

ネットで探せば、あるソフトを使うとAirPrintでプリンタ共有されているPCを介して印刷できる。まあこれだけでも大きな進歩だが、やはりiPhoneから直接プリンタへ出力したい。その方法を丸1日調査したところ少し光が見えてきた。といっても(まだ)正直言って成功していない。後一歩なので今後いろいろ調べて印刷できるようにしたい。



さて、私の持っているBrother MFC-9840CDWだが、これはAirPrint対応でなく、プリントしようとしてもiPhoneからプリンタが見つからない。4.2.1へアップグレードした(対応プリンタを持っていない)誰もがこれに遭遇するだろう。これはAirPrintがmDNSサービスレコードに一定の条件で問い合わせているためである。この条件は以下の2つである。
  1. subtypeが_universalであること
  2. TXTレコードにURFのキーがあり、かつEmptyでないこと
多くのBonjour対応プリンタは上記の対応をしていないためプリンタの検出がされないと思われる。
ここで実験であるが、WindowsやMacにはmDNSへサービスを登録するコマンドが存在する。
"dns-sd" コマンドである。このコマンドを使えばmDNSへ自由にサービスが登録できるので、プリンタのために私が手作業で登録してやることができる。以下のように-Pオプションを使用してコマンドを実行する:

dns-sd -P 名前 _ipp._tcp,_universal "" ポート ホスト名.local IPアドレス TXTレコード
(斜体には実際の値が入る)

名前:何でもいいでしょう。好きな名前を入れる。
ポート:これは通常631。Internet Printing ProtocolのWell-knownポートである。
ホスト名:これはプリンタのネットワーク登録名である。
IPアドレス:プリンタのIPアドレス。
TXTレコード:これはプリンタに依存するものが含まれる。たとえばこんな感じ
txtvers=1 priority=50 pdl=application/vnd.hp-PCL, type="Brother MFC-9840CDW" Color=T qtotal=1 ... URF=W8,SRGB24,DM1,CP255,RS600

dns-sd -P "Brother Printer" _ipp._tcp,_universal "" 631 BRDBB.local 192.168.0.22 txtvers=1 pdl=application/vnd.hp-PCL type="Brother" Color=T qtotal=1 URF=W8,SRGB24

さて上記で、気をつけるのが _ipp._tcp,_universal とサブタイプをつけていること、TXTレコードにURFを含めることである。URFについてはよくわからないがラスターフォーマット指定であろうか。
これでmDNSで登録してやれば少なくともiPhoneのAirPrint機能でプリンタを見つけてくれる。

しかし、残念なことにこれでもまだiPhoneから印刷が成功しない。プリントを実行すると一見プリント処理はされたかのようにふるまうが、実際にデータがプリンタまで届いていない。どうもiPhone側では送信のリトライをし続けているように見えるが、ネットワークへ送り出してもいない。ためしにポートを9100(PDL Datastream)へ変えてみるとプリンタへデータは送付され、文字化けしたものが印刷される。
なぜIPPポートでデータが送信できないのかがまだわからない。
ちなみに、ePrintでは手作業で登録したサービスでまったく問題なく印刷ができ、本体情報(トナー残量等)も取得できている。つまり、AirPrintにはまだTrickyな仕掛けがあるに違いない。

まだまだ先は長そうだ。

2 件のコメント:

匿名 さんのコメント...

大変参考にさせてもらっています.ロックフリーについても記載頂けないでしょうか。

Takelei さんのコメント...

大変参考になりました。この情報のおかげで、
WinXPでiOS5からairprint.exe経由で共有プリンタに印刷ができました。 感謝です。
ところで、ePrintの設定方法はどうするか興味があるので、教えていただけませんか?