Qt 在TI AM335x EVM 上利用 CUPS 做網路列印

The following content is copied from MS Word, so the format and the layout is not quite good...
---

1.    安裝CUPS套件至TI EVM

1.1.  下載CUPS原始碼
請至https://www.cups.org/下載最新原始碼。本文使用的CUPS版本為v1.7.2

1.2.  編譯CUPS
下面為使用TI toolchain編譯CUPS的流程,原始檔放置在/home/test之下

cd /home/test/ti-sdk-SDK_06_00/linux-devkit
source environment-setup
cd /home/test
tar jxf cups-1.7.2-source.tar.bz2
cd cups-1.7.2
./configure --enable-libusb --host=arm-linux-gcc --build=i686
make

make時可能會出現以下錯誤:

Generating localization strings...
./genstrings: 1: ./genstrings: Syntax error: word unexpected (expecting ")")
make[1]: *** [genstrings] Error 2
make: *** [all] Error 1

解決方式是修改man/Makefile檔:

vim man/Makefile

找到

mantohtml:      mantohtml.o
        $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o

將它改成

mantohtml:      mantohtml.o
        gcc -I/usr/include -I../ -L/usr/lib mantohtml.c -o mantohtml

接著再執行

make clean
make
make install DSTROOT=/usr/local/cups-emb/

最後編譯好的CUPS套件會放在/usr/local/cups-emb中。

1.3.  Deploy CUPS
依以下方式將安裝好的CUPS套件放到TI EVM上:

cd /usr/local/cups-emb
tar zcf cups-arm.tgz *
scp cups-arm.tgz root@192.168.123.152:/home/root

其中192.168.123.152TI EVMIP,我們將它放到/home/root中。接下來我們sshTI EVM中解開讓package

mv /home/root/cups-arm.tgz /
tar zxvf cups-arm.tgz

有一些libraryTI EVM中沒有,必需由TI SDK中複製過來並建立好適當的symbolic links

(on Ubuntu)
cd /home/test/ti-sdk-SDK_06_00/linux-devkit/sysroots/armv7ahf-vfp-neon-3.2-oe-linux-gnueabi/usr/lib
scp libavahi-common.so.3 root@192.168.123.152:/usr/lib
scp libavahi-client.so.3.2.9 root@192.168.123.152:/usr/lib
cd ../../lib
scp libacl.so.1.1.0 root@192.168.123.152:/lib

(on TI EVM)
cd /usr/lib
ln -s libavahi-common.so.3.5.3 libavahi-common.so
ln -s libavahi-common.so.3.5.3 libavahi-common.so.3
ln -s libavahi-client.so.3.2.9 libavahi-client.so
ln -s libavahi-client.so.3.2.9 libavahi-client.so.3
cd /lib
ln -s libacl.so.1.1.0 libacl.so
ln -s libacl.so.1.1.0 libacl.so.1

接下來啟動cupsd

/etc/init.d/cups start

會出現一些小錯誤,但不影響cupsd的啟動。透過ps可以看到cupsd已啟動:

1920 root      6472 S    /usr/sbin/cupsd -C /etc/cups/cupsd.conf

預設cupsd是使用/etc/cups/cupsd.conf中的設定檔。


2.    CUPS中使用印表機

2.1.  下載印表機描述檔
必需有印表機描述檔,才能於CUPS中新增印表機。下載位置在:


測試印表機型號為HP LaserJet 5000IP172.16.196.50),它下載的位置在:


將它下載下來後,需要放置到TI EVM中的/usr/share/cups/model路徑底下。

scp HP_Designjet_5000_PS3.ppd root@192.168.123.152:/usr/share/cups/model

2.2.  查詢印表機服務
透過網路列印的服務一般有socketport 9100/LPDport 515/IPPport 631)的幾種方式。在使用印表機之前,我們可以查詢該印表機有開放哪些port,進而得知我們可以用哪些方式來連線。Ubuntu中的nmap工具可以達成這個目的。

root@test-VirtualBox:/etc/cups/ppd# nmap 172.16.196.50

Starting Nmap 5.21 ( http://nmap.org ) at 2014-05-07 13:58 CST
Nmap scan report for 172.16.196.50
Host is up (0.00064s latency).
Not shown: 990 closed ports
PORT      STATE SERVICE
21/tcp    open  ftp
23/tcp    open  telnet
80/tcp    open  http
280/tcp   open  http-mgmt
443/tcp   open  https
515/tcp   open  printer
631/tcp   open  ipp
7627/tcp  open  unknown
9100/tcp  open  jetdirect
14000/tcp open  unknown
MAC Address: 00:21:5A:86:8E:D4 (Hewlett Packard)

可以看到該台印表機支援socket/LPD/IPP等三種方式。

2.3.  新增印表機
利用lpadmin工具可以在CUPS中新增印表機:

lpadmin -p HP5000 -v ipp://172.16.196.50 -m HP_Designjet_5000_PS3.ppd -E

其中的參數意義如下:

1.          -p:印表機佇列名稱,可自訂。此名稱會於列印dialog中顯示,或者在Qt中設定印表機名稱用
2.          -v:裝置的位置。這邊我們使用IPP協定來連接印表機
3.          -mPPD的定義檔名稱,必需在/usr/share/cups/model
4.          -E:讓印表機可以接受列印工作

如果沒有任何問題的話,可以再利用lpstat工具查看印表機狀態:

lpstat -a

執行結果:

HP5000 accepting requests since Fri Jun 28 05:32:45 2013

上面可以看出,我們剛定義的HP5000印表機佇列已經可以接受列印要求了。另外我們也可以看看/etc/cups/printers.conf此檔案,裡頭記錄了CUPS的印表機資訊:

root@am335x-evm:~# more /etc/cups/printers.conf
# Printer configuration file for CUPS v1.7.2
# Written by cupsd on 2013-06-28 05:34
# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING
<Printer HP5000>
UUID urn:uuid:06e8d68d-d52b-3927-7f60-0d63440f5981
Info HP5000
MakeModel HP DesignJet 5000PS (recommended)
DeviceURI ipp://172.16.196.50
State Idle
StateTime 1372397565
Type 8450124
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy stop-printer
</Printer>

可以看到我們新增的HP5000印表機資訊,它使用IPP連線。


3.    Qt中使用印表機

我們先建立一測試用的Qt embedded app來驗證是否在Qt print dialog中可以看見我們剛剛新增的印表機。


上圖中Print按鈕按下後會執行的程式如下:

QList<QPrinterInfo> printerList = QPrinterInfo::availablePrinters();
QPrinter printer;
QPrintDialog *dialog = new QPrintDialog(&printer);
dialog->setWindowTitle("Print Document");

if (dialog->exec() != QDialog::Accepted)
    return;

因為此為測試用途,所以沒有對印表機送資料。下圖中可以看到Qt print dialog中的確出現剛剛我們新增的HP5000印表機了。


接下來我們實際拿機器做列印的動作。比較關鍵的程式碼如下:

QPrinter printer;
printer.setPrinterName("HP5000"); // 設定印表機名稱

QPainter painter;
painter.begin(&printer);
painter.drawImage(0, 0, *(psh->bitmap));
painter.end();

我們先建立一個QPrinter,然後利用QPainter將人機畫面的內容(QImage)畫至此QPrinter。當painter.end()被呼叫時,列印資料就會被送至印表機了。


上面程式如果不設定印表機名稱,則會使用預設印表機來列印。

留言

熱門文章