2015年1月10日

HPLIP、SANE、CUPS、p910nd

前言:
去年過年前後,打算用網樂通做個列印、掃描伺服器,最後失敗了,
一轉眼一年過了,
最近又打算起死回生,再來一次。
這次不鐵齒,看看OpenWRT上作法後,瞭解HPLIP、CUPS、p910nd後再開工,
於是就打算把這幾樣寫成心得。

介紹:
  • HPLIP是HP針對HP掃描器、印表機提供的Linux OpenSource驅動程式組合包。
  • SANE是Linux上的掃描器的軟體,裡面包含了網路掃描、掃描的前端軟體介面、掃描器驅動程式。
  • CUPS、p910nd都是Linux上的列印伺服器,p910nd是non-spooling的列印伺服器,CUPS則是spooling伺服器。
簡單介紹結束,
接著先針對CUPS和p910nd描述其架構,
再介紹SANE架構,
最後描述HPLIP和它們間的關係。

p910nd與CUPS區別和兩者架構:

p910nd:
參考:
[Oleg/Lly/CDMA@wifi] p910nd 列印伺服器(無spool)

從參考的作者文中可以知道,
p910nd的安裝,主要2個步驟:
  1. 確定Linux Kernel內USB Printer有支援
  2. p910nd daemon有啟動,並指定Port、USB Printer的Device File
步驟完成,p910nd就會動了,而且p910nd需求極小,
幾乎沒有相依太多library就能動作。

再看看下面這個參考:
DD-WRT Printer Sharing

裡面描述了p910nd安裝外,也描述了Client端的安裝,
包括CUPS、Linux、Windows、MacOSX的安裝介紹。

簡單白話的說,
p910nd本身只是USB<->Socket的轉譯器,
它不負責印表機溝通,從Socket來的資料直接轉入USB當中,
因此所有印表機的溝通,列印資料的轉譯,都要由Client端負責,
印表機工作的排程,則要由印表機自己負責。

因此p910nd優點是library相依性低,也不需要複雜的額外工作,
至於Client端,
Windows直接有原廠的驅動程式,
Linux直接有CUPS搭配HPLIP就能達成,
MacOSX看起來也是有驅動程式,這部份我不熟。

CUPS:
直接看系統方塊圖(wiki):

CUPS是一整套完整的列印伺服器程式,
裡面包含了使用者管理、列印語言轉譯、列印Queue、網路列印...等多個功能。

我們單從CUPS的系統方塊圖來看,
它前面提供了各種檔案格式的轉譯器,轉譯成PostScript,
中間能將PostScript轉譯成各種列印語言,像是PCL...等,
後面CUPS backend又能串接包括本機的USB、SerialPort...等,網路的IPP、網路芳鄰、AppleTalk...等網路介面。

因此可以知道它是非常龐大的列印系統,
從前端應用程式的檔案開始,就一路透過它層層處理,最後一樣透過它送到印表機上。

優點當然是系統功能完整,但缺點就是相依的library多,
程式的設定項目多比較複雜,
在小型系統上就比較不方便移植,
因此比較早期的OpenWRT、DD-WRT都只支援p910nd,
較新的版本則已經有提供cups,
自行移植則會遇到比較多的編譯問題,我自己最後編譯出來,執行後,網頁點幾下還是會segfault。

SANE:
SANE是Linux上最主要的掃描器解決方案,可能也是唯一的解決方案,
有支援Linux的掃描器,大概都是提供SANE的驅動程式。

SANE分前端(frontend)和後端(backend),
SANE frontend主要提供給應用程式,送掃描動作給SANE;
SANE backend主要就是SANE介面界接掃描器的驅動程式。

SANE有提供一個特別的SANE frontend,叫做net,
它能讓SANE能透過網路接收SANE的掃描動作,達成網路控制掃描器掃描。

HPLIP:
前面提這麼多,原因是HPLIP相依的東西很多,
上述幾個是最關鍵的幾個。

參考:

直接看參考中的系統方塊圖:

拆開來看HPLIP各項元件,我們先只看掃描器部份,看hp-scan那個垂直的部份。

在HPLIP中,HP的掃描器是透過SANE支援的。
hp-scan:
hp-scan是HPLIP提供的掃描器工具程式,但hp-scan實際上是個SANE frontend,
就是透過SANE backend掃描。

libsane-hpaio:
HPLIP提供了libsane-hpaio這個SANE backend用的延伸library,
libsane-hpaio讓SANE backend透過它來操作HP掃描器,
我不很確定裡面有沒有包含驅動程式,或是否有包含部份的驅動程式,
但這個library非常重要,SANE需要靠它才能操作HP掃描器,
在SANE中,它被稱為hpaio的SANE backend。

hpmud:
HPLIP實際操作HP印表機、掃描器的I/O library,
所有的工作都透過這個library傳遞給USB或網路(網路印表機、網路掃描器時),
它的下層,就是USB library或Socket,直接連結印表機、掃描器。

D-Bus:
掃描器這路看完後,我們來看D-BUS。
在HPLIP中,各個應用程式和元件間溝通都是透過D-BUS,
這些應用程式包括掃描器左邊那幾個小顆的,
包括hp-systray、hp-toolbox、hp-sendfax這幾個工具程式,
還有libsane-hpaio這個SANE backend。

這些元件和程式的溝通都透過D-Bus,
而D-Bus本身在HPLIP則是透過hp/hpfax backend管理。

關於D-Bus,這邊不多介紹,簡單的說,它是Linux上IPC的一種,
各應用程式可以透過D-Bus互相溝通,
典型的例子是,播放程式透過D-Bus提供出播放音樂的資訊,
Skype這類的通訊軟體透過D-Bus可以得到並顯示你正在播放的音樂資訊。

部份總結:
到目前為止,
先整理下HPLIP做了什麼?搞了哪些元件?要在小系統上編譯,需要編譯哪些東西?
1.
HPLIP最核心的I/O主要是hpmud,負責最終和硬體通訊

2.
HPLIP使用SANE做為掃描器核心,要能掃描,除了SANE要ok之外,
hpaio backend要確定ok,並有放置在SANE backend的目錄內

3.
hp-scan只是個SANE frontend,不用管它,用其他SANE程式效果一樣

4.
D-Bus在HPLIP是各程式的溝通平台,單純使用掃描功能,不用管它

5.
如果搭配p910nd,到目前為止的資訊已經足夠了,其他元件都只跟列印和CUPS相關

HPLIP與CUPS:
前面CUPS提到,CUPS架構很大,CUPS中間有許多轉譯器提供各種轉譯,
HPLIP針對CUPS實做了hpcups、hpcupsfax...等幾個轉譯器,
接收了從CUPS收到的列印資料(應該是PostScript)後,
透過這些轉譯器轉譯,送給hp/hpfax backend,再透過hpmud送到印表機。

這裡我比較不清楚的地方是,
轉譯器轉譯後,是直接在轉譯器內送到hp/hpfax backend,
還是轉譯器轉譯後,回到CUPS,再由CUPS送到hp/hpfax backend進行列印,
這是圖上沒有表示的部份。

1 則留言:

阿杰 提到...

CUPS 的解說 看這篇 https://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/CUPS-printing.html 比較好了解