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原始碼
1.2. 編譯CUPS
1.3. Deploy CUPS
2. 於CUPS中使用印表機
2.1. 下載印表機描述檔
2.2. 查詢印表機服務
2.3. 新增印表機
3. 於Qt中使用印表機
---
1. 安裝CUPS套件至TI EVM
1.1. 下載CUPS原始碼
請至https://www.cups.org/下載最新原始碼。本文使用的CUPS版本為v1.7.2。
下面為使用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中。
依以下方式將安裝好的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.152為TI EVM的IP,我們將它放到/home/root中。接下來我們ssh到TI EVM中解開讓package:
mv /home/root/cups-arm.tgz /
tar zxvf cups-arm.tgz
|
有一些library在TI 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 5000(IP為172.16.196.50),它下載的位置在:
將它下載下來後,需要放置到TI EVM中的/usr/share/cups/model路徑底下。
scp HP_Designjet_5000_PS3.ppd
root@192.168.123.152:/usr/share/cups/model
|
透過網路列印的服務一般有socket(port 9100)/LPD(port 515)/IPP(port 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等三種方式。
利用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.
-m:PPD的定義檔名稱,必需在/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()被呼叫時,列印資料就會被送至印表機了。
上面程式如果不設定印表機名稱,則會使用預設印表機來列印。
留言
張貼留言