絡(luò)打印協(xié)議解析:從驅(qū)動less打印到ipptool調(diào)試與配置實戰(zhàn))
簡介這是一份面向網(wǎng)絡(luò)開發(fā)者的 IPP 網(wǎng)絡(luò)打印協(xié)議源碼包完整呈現(xiàn)基于 HTTP/1.1 的打印作業(yè)提交、打印機狀態(tài)查詢、作業(yè)控制及屬性擴展等標準實現(xiàn)強調(diào)跨平臺設(shè)備間的互操作性適合需要開發(fā)打印客戶端、研究協(xié)議解析或進行系統(tǒng)集成的人員參考。包內(nèi)共 32 個文件以 C 語言源文件.c/.h為主體配合 Makefile 與 format 配置文件構(gòu)成可構(gòu)建的協(xié)議框架另含 svn-base 版本元數(shù)據(jù)與 README 說明整體僅 35KB結(jié)構(gòu)緊湊便于快速閱讀。當前已有 3860 人學(xué)習(xí)下載源碼重點覆蓋請求/響應(yīng)解析、狀態(tài)機流轉(zhuǎn)、IPP 數(shù)據(jù)編碼、錯誤處理以及基于 HTTPS 的安全通信等模塊讀者可從底層報文開始理解協(xié)議工作流程。對于希望自定義打印方案或排查跨平臺打印問題的開發(fā)者這份代碼提供了可直接研讀的實例與擴展基礎(chǔ)。1. IPP網(wǎng)絡(luò)打印協(xié)議為什么現(xiàn)在驅(qū)動less打印都在喊它打印機驅(qū)動裝不上設(shè)備明明連著局域網(wǎng)系統(tǒng)里卻只給你一堆 LPR 或 Raw Queue 端口——這是做網(wǎng)絡(luò)打印集成最常見的開局。IPP網(wǎng)絡(luò)打印協(xié)議Internet Printing Protocol就是為了結(jié)束這種黑匣子狀態(tài)它把打印動作變成基于 HTTP 的標準請求作業(yè)提交、狀態(tài)查詢、能力協(xié)商都能用明文請求和響應(yīng)去驗證。它能解決的是驅(qū)動缺失、跨平臺支持、移動端免驅(qū)打印這類問題適合設(shè)備集成、運維工程師以及準備在自研系統(tǒng)里接入打印能力的人。接下來我不背協(xié)議編號而是把 IPP 當服務(wù)去拆先認屬性再用手頭工具摸清設(shè)備最后配進打印服務(wù)組件并處理那些翻車點。2. 先看懂IPP它與LPR/SMB的差別和你要記住的三個屬性在動手敲命令前我得先把一個常見誤解糾正過來IPP 不是像 LPR 那樣“提交完就進隊列、狀態(tài)全靠猜”它是一套自帶屬性查詢的 RPC 式協(xié)議。新手最容易把 IPP 和打印驅(qū)動混在一起實際上 IPP 關(guān)心的不是光柵怎么拼而是“能不能打、打成什么樣、當前什么狀態(tài)”。下面從協(xié)議骨架說起順便把選型邏輯講清楚。2.1 IPP是“帶屬性的HTTP”端口631、二進制請求、operationIPP 的傳輸層是 HTTP/1.1默認端口 631數(shù)據(jù)體是二進制編碼的請求和響應(yīng)。它把一次打印動作包裝成一個 operation request打印機或者打印服務(wù)器處理后返回 operation response??蛻舳瞬恢惶峤蛔鳂I(yè)還可以先問能力。這與 LPR/SMB 的差別很大LPR 只有簡單的控制文件和數(shù)據(jù)文件沒有標準的狀態(tài)碼集合SMB 打印即便能共享隊列對網(wǎng)絡(luò)發(fā)現(xiàn)、TLS 和跨平臺屬性表達都很吃力。一次 IPP 調(diào)用的目標叫 Printer URI形如ipp://192.168.1.50/ipp/print??蛻舳?POST 一個二進制請求到這個 URI請求里必須有 Operation ID 和 Request ID。常見的 operation 如下表后面所有調(diào)試都繞不開這幾個。Operation數(shù)值作用Print-Job0x0002提交打印作業(yè)文件內(nèi)容放在請求體內(nèi)Validate-Job0x0004只驗證作業(yè)可不可打印不真正提交Get-Printer-Attributes0x000B獲取打印機的能力與當前狀態(tài)Get-Jobs0x000A查詢排隊中的作業(yè)列表Cancel-Job0x0008取消指定作業(yè)如果你習(xí)慣的是 JSON 接口第一次看 IPP 會覺得它像黑匣子因為不是文本。你無法用 curl 直接看懂響應(yīng)必須用專門的ipptool或者抓包看 631 端口。這也是為什么第 3 章全部以ipptool為主它能幫你把 IPP 的二進制信封拆開讓你看到屬性名和值。選型層面現(xiàn)代驅(qū)動less打印之所以都選 IPP就是因為它把“查詢能力”和“提交作業(yè)”放進同一個協(xié)議而不是像 LPR 那樣只能單向投遞。2.2 屬性樹Printer / Job / Document 三層別把三者搞混屬性是 IPP 的“參數(shù)數(shù)據(jù)庫”。客戶端和服務(wù)端交互時所有條件、能力、狀態(tài)都用名為“屬性”的鍵值對表達。值類型有很多keyword、boolean、integer、enum、resolution、rangeOfInteger 等每個屬性屬于一個“屬性組”在二進制報文里以 tag 區(qū)分比如 operation-attributes-tag、printer-attributes-tag、job-attributes-tag。打印機端最重要的三層對象是 Printer、Job、Document。Printer 對象描述這臺設(shè)備能干什么printer-name、printer-stateidle/processing/stopped、printer-is-accepting-jobs、printer-up-time、document-format-supported都是這一層。Job 對象是你提交一次打印后產(chǎn)生的工作單job-id、job-state、job-state-reasons能告訴你作業(yè)是被處理、暫停還是卡紙。Document 對象描述文檔本身的屬性像document-format、document-natural-language很多場景下它不僅依附在 Job 上在提交請求里還要單獨用屬性組聲明。理解這個分層有助于排錯例如你提交作業(yè)后打印機沒有任何反應(yīng)應(yīng)先查 Printer 層的printer-is-accepting-jobs與 Job 層的job-state-reasons而不是先去重裝驅(qū)動。后面第 5 章就會遇到這類問題。另外請求能力時用requested-attributes指定你想要的屬性名列表這個參數(shù)經(jīng)常被寫錯所以單獨強調(diào)一下它寫在操作屬性組里值是 keyword 類型可以用all也可以傳多個屬性名。2.3 ipp:// 與 ipps://URI結(jié)構(gòu)、端口與“你看到的631未必是IPP”URI 是 IPP 的地址入口。標準格式是ipp://[用戶]主機[:端口]/路徑帶 TLS 時寫ipps://默認端口同樣習(xí)慣用 631不是常見的 443。路徑常見的是/ipp/print、/ipp、/printers/xxx廠商可以自行注冊路徑所以碰到具體設(shè)備時不要想當然。這里最容易踩坑一臺打印機的 631 端口上可能同時站著 HTTP 管理服務(wù)和 IPP 服務(wù)根路徑是 HTML/ipp/print才是 IPP 端點。你用curl http://host:631/能得到 HTML不代表設(shè)備支持 IPP只能說明它開了 HTTP。正確的探測方式是用ipptool或設(shè)備廣播出來的服務(wù)發(fā)現(xiàn)結(jié)果不是瀏覽器。這個習(xí)慣能省掉后面一半時間。加密方面ipps://在同一個 URI 上用 TLS 封裝 IPP證書常常是出廠自簽名第一次連接時打印服務(wù)組件會因為“證書未信任”把打印機標記為認證失敗這又是另一個獨立的坑。所以把“端口 631”和“協(xié)議是 IPP”分開記憶比硬記端口安全得多。這一章最后補一個選型結(jié)論LPR 和 SMB 也不是不能用但在“無驅(qū)動”“跨平臺”“作業(yè)狀態(tài)可查”這三個需求面前都要打折扣。IPP 的請求-響應(yīng)模型讓客戶端可以先問能力再提交作業(yè)這正是當前移動端免驅(qū)打印方案的核心機制。所以標題里說的 IPP 網(wǎng)絡(luò)打印協(xié)議不是一個需要背的 RFC 編號而是一套能直接拿來測、拿來配、拿來寫網(wǎng)關(guān)的和 HTTP 同源的協(xié)議。3. 用ipptool在本地把一臺IPP打印機摸清楚ipptool是能直接和打印機對話的命令行工具在多數(shù)帶打印服務(wù)的 Linux 發(fā)行版和桌面系統(tǒng)上都可以直接用它。它的好處是幫你把二進制請求封裝好你只要寫一個“測試文件”描述要發(fā)什么 operation、帶哪些屬性即可。下面三步是從“確認支持”到“提交真實作業(yè)”的最小路徑。3.1 確認設(shè)備支持IPP的最小命令一條ipptool加heredocipptool -tv ipp://192.168.1.50:631/ipp/print EOF { OPERATION Get-Printer-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri } EOF這里的-tv表示 verbose 輸出工具會把響應(yīng)的操作狀態(tài)碼和屬性值都打印出來$uri是 ipptool 自動把命令行傳入的 Printer URI 當作printer-uri屬性值所以你不用再重復(fù)寫 IP。請求里的 operation-attributes-tag 是必須的頭部屬性組attributes-charset、attributes-natural-language是 IPP 的兩個通用屬性每次都要帶。如果設(shè)備返回successful-ok說明它確實支持 IPP如果返回client-error-not-found多半是路徑不對換/ipp或去設(shè)備 Web 管理端查真實路徑。這一條命令驗證的事情比翻說明書有價值它直接證明設(shè)備在 631 端口上響應(yīng) IPP 請求。后續(xù)所有配置都以這條命令返回successful-ok為前提。如果失敗先不要怪驅(qū)動第一步就要懷疑 URI 路徑、端口、防火墻三層。3.2 讓打印機自己“報”能力requested-attributes 與 document-format-supported一旦確認能通接下來就要問打印機到底支持什么。很多同事在配置網(wǎng)絡(luò)打印時喜歡先在驅(qū)動列表里找型號其實 IPP 的正確姿勢是讓打印機自己告訴你它能吃哪些 document-format。下面請求只拉三個關(guān)鍵屬性。ipptool -tv ipp://192.168.1.50:631/ipp/print EOF { OPERATION Get-Printer-Attributes GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri ATTR keyword requested-attributes printer-state ATTR keyword requested-attributes printer-is-accepting-jobs ATTR keyword requested-attributes document-format-supported } EOFrequested-attributes可以重復(fù)聲明每個屬性名是 keyword 類型。常見的響應(yīng)里printer-state是數(shù)字枚舉3 表示 idle4 表示 processing5 表示 stoppedprinter-is-accepting-jobs是 booleandocument-format-supported會列出類似application/pdf、image/pwg-raster、image/jpeg這樣的 MIME 類型。這就是之后提交作業(yè)要用的依據(jù)打印機聲明支持什么我們就提什么而不是想當然發(fā) PDF 或 PS。有一個常見誤用以為支持application/pdf就代表支持高分辨率 / 光柵格式這完全兩回事。有些設(shè)備 PDF 解析能力有限但image/pwg-raster是它的原生格式有些兼容設(shè)備反而對 PWG 支持不完整。所以在接入新設(shè)備時我一般會把document-format-supported完整列表存下來當作后續(xù)提交參數(shù)的“白名單”。這一步做扎實后面作業(yè)被拒的概率會低很多。3.3 提交一個真實作業(yè)Print-Job、document-format 與 FILE/DATA 的區(qū)別驗證能力之后就到了真正提交作業(yè)的環(huán)節(jié)。用Print-Job并帶上一個本地文件是最直接的端到端測試。ipptool -tv ipp://192.168.1.50:631/ipp/print EOF { OPERATION Print-Job GROUP operation-attributes-tag ATTR charset attributes-charset utf-8 ATTR naturalLanguage attributes-natural-language en ATTR uri printer-uri $uri GROUP job-attributes-tag ATTR mimeMediaType document-format application/pdf ATTR name job-name test-ipp-job FILE /tmp/test.pdf } EOFFILE /tmp/test.pdf會把文件內(nèi)容作為請求體發(fā)給打印機和 HTTP POST 的 body 概念一樣。document-format必須放在 job-attributes-tag 屬性組里告訴打印機這份數(shù)據(jù)是什么格式。如果打印機不認這個格式響應(yīng)里會出現(xiàn)client-error-document-format-not-supported如果提交成功響應(yīng)里會帶job-id和job-uri這兩個值需要記下來后面查詢和取消作業(yè)都用得上。FILE和DATA的區(qū)別是FILE引用磁盤上的二進制文件適合 PDF、PWG 光柵DATA直接把后面的字符串當作文檔內(nèi)容適合快速測試純文本。測試純文本輸出時把document-format改成text/plain然后寫DATA hello world就可以。提交之后如果想確認作業(yè)是否真的進入隊列再補一個 Get-Jobs看返回的job-id是否在列表里。這樣一個完整的 IPP 客戶端驗證流程就閉環(huán)了。4. 在打印服務(wù)組件里接一個IPP打印機URI、驅(qū)動與端口的參數(shù)怎么設(shè)上一章證明了設(shè)備能通接下來要把它納入系統(tǒng)打印服務(wù)。這里以最常見的打印服務(wù)組件命令行工具為例。配置的關(guān)鍵點不是“選驅(qū)動”而是“URI 對不對”和“用什么模式讓它自動取能力”。4.1 用 lpadmin 配置 IPP 打印機的最小命令lpadmin -p office-printer -E -v ipp://192.168.1.50:631/ipp/print -m everywhere lpstat -p office-printer lpoptions -p office-printer -o mediaiso_a4_210x297mm第一條命令里-p office-printer是給本機起的隊列名-E表示同時啟用該隊列-v指定設(shè)備 URI-m everywhere表示使用驅(qū)動less模式不指定廠商 PPD而是讓打印服務(wù)組件啟動時去打印機上動態(tài)抓取能力。之后用lpstat -p office-printer查看隊列狀態(tài)如果顯示idle并且沒有disabled說明隊列已經(jīng)可用lpoptions設(shè)置默認紙張為 A4這一步在跨區(qū)域使用設(shè)備時特別重要。-m everywhere是目前最推薦的做法前提是設(shè)備支持 IPP Everywhere。換句話說第 3 章看到的document-format-supported就是它后續(xù)協(xié)商的基礎(chǔ)服務(wù)組件會直接生成一個臨時 PPD這個 PPD 里寫著設(shè)備支持的紙型、解析度、色彩能力而不是從廠商安裝盤里找。如果設(shè)備不支持動態(tài)能力發(fā)現(xiàn)-m everywhere可能會失敗此時退回到-m raw可以先把隊列建起來但 raw 模式下系統(tǒng)不控制頁面尺寸和格式只把數(shù)據(jù)直接透傳給打印機。所以raw只適合應(yīng)急不能當長期方案。4.2 driverless: URI 與 IPP Everywhere從自動發(fā)現(xiàn)到接入在打印服務(wù)組件的語境里driverless是能力和 PPD 之間的橋梁。你不需要自己找驅(qū)動只要確認設(shè)備支持 IPP系統(tǒng)就能通過Get-Printer-Attributes拿到media-supported、resolution-supported、print-color-mode-supported再把這些屬性翻譯成打印選項。這也是為什么很多人配好的ipp://隊列在安裝界面里看不到廠家驅(qū)動但打出來的效果反而比老驅(qū)動正常。接入時還要注意 URI 的路徑差異。同樣是支持 IPP 的設(shè)備有的路徑是/ipp/print有的是/ipp/printers/myprinter有的只在ipps://上開放。我一般會在配置前先執(zhí)行一次lpinfo -v | grep -i ipp讓打印服務(wù)組件掃描局域網(wǎng)網(wǎng)絡(luò)服務(wù)看它發(fā)現(xiàn)的實際 URI。這個命令會列出類似ipp://192.168.1.50:631/ipp/print的地址比手填更可靠。手動填寫時最怕把廠商 Web 管理頁的地址當成打印機 URI那樣隊列會一直處于“無法連接”狀態(tài)。如果你接的是帶加密的ipps://第一件事不是想著關(guān) TLS而是把打印機的根證書導(dǎo)入系統(tǒng)信任庫。自簽名證書的常見問題會在第 5 章展開這里先記住IPP over TLS 的默認端口仍然可能是 631不要一見 443 就以為肯定是 IPPS也不要把 80 端口的 Web 管理頁當成 IPP。4.3 移動端和AirPrint的落地原來是同一套移動端免驅(qū)打印能“自動發(fā)現(xiàn)打印機、不用裝驅(qū)動”是因為手機系統(tǒng)在局域網(wǎng)里通過 DNS-SD 找到了_ipp._tcp服務(wù)拿到 Printer URI 后用和ipptool一樣的 IPP 請求去拿打印機能力再把文檔轉(zhuǎn)成打印機接受的光柵格式提交。也就是說你在服務(wù)組件里配好的ipp://隊列天然可以被移動端發(fā)現(xiàn)前提是這臺機器開啟了服務(wù)發(fā)現(xiàn)廣播。對做設(shè)備集成的工程師來說這里有一個值得記下來的點如果自研設(shè)備想讓手機直接打印不需要去適配各家私有協(xié)議只需要對外暴露一個符合 IPP 的端點比如/ipp/print同時廣播_ipp._tcp服務(wù)即可。設(shè)備端要自己實現(xiàn)至少Get-Printer-Attributes和Print-Job兩個操作返回document-format-supported時列出的格式就是移動端會嘗試使用的格式。如果它發(fā)現(xiàn)支持image/pwg-raster就會把頁面渲染成該格式再打。所以前面那些ipptool命令不是玩具它們與手機實際的握手流程基本相同。唯一區(qū)別是手機更多用服務(wù)發(fā)現(xiàn)自動填充 URI而手工配置時 URI 要靠人填。理解這一點后你在排手機打印失靈的問題時思路會從“是不是系統(tǒng)問題”變成“這個端點的 IPP 請求到底返回了什么”排查維度完全不同。5. IPP調(diào)試與避坑我踩過的5個常見問題這一章完全是一線踩坑的記錄。IPP 本身不算復(fù)雜但因為它和 HTTP、端口、Web 管理頁、加密這些東西混在一起配置時總會有幾個“怎么想都不對”的時刻。以下五條按從網(wǎng)絡(luò)到應(yīng)用的順序?qū)懨織l都是真實翻過車的。5.1 端口631連不上但打印機明明通著現(xiàn)象用nc -vz 192.168.1.50 631測試超時但打印機面板能進廠商 Web 管理端也能打開。原因這臺設(shè)備的 IPP 服務(wù)不在 631 端口或者 631 端口被安全策略關(guān)掉了只保留 Web 管理端口。解決不要硬猜優(yōu)先用設(shè)備廣播的服務(wù)發(fā)現(xiàn)結(jié)果。可以在設(shè)備 Web 管理端里找“網(wǎng)絡(luò)打印 / IPP / 協(xié)議設(shè)置”這類入口把 IPP 打印服務(wù)打開記下它提示的 URL。我遇到過一個型號它的 IPP 端點端口是 8080路徑是/ipp/print而 631 留給了一個早就淘汰的 LPR 服務(wù)。后來靠設(shè)備說明書里的打印服務(wù)器配置頁才找到真實 URI。所以第 2 章強調(diào)“端口 631 不等于 IPP”這里是血淚印證。碰到nc不通第一反應(yīng)不該是“不支持 IPP”而是“我們猜的端口和路徑不對”。5.2 作業(yè)已接受但打印機長時間不打印現(xiàn)象ipptool返回successful-ok響應(yīng)里也有job-id但打印機面板上一直沒有作業(yè)。原因設(shè)備把作業(yè)放進了 Hold 隊列等待面板確認或者 PDF 格式被接收但 RIP 解析失敗作業(yè)停在 pending / held 狀態(tài)。解決提交完成后立刻用Get-Jobs或Get-Job-Attributes查job-state-reasons這個屬性會告訴你為什么停著。常見值里job-hold-until-specified表示設(shè)備被設(shè)置成“先暫存再打印”compression-error表示數(shù)據(jù)解壓失敗document-format-error表示格式內(nèi)容損壞。看到 held 后去設(shè)備面板上釋放作業(yè)或者通過Set-Job-Attributes把job-hold-until改成no-hold。不要因為第一發(fā)沒出來就反復(fù)提交否則隊列會被撐滿最后連狀態(tài)查詢都變慢。5.3 用curl查631端口看到HTML誤以為設(shè)備支持IPP現(xiàn)象curl http://192.168.1.50:631/返回一個 HTML 管理頁于是判斷“這家打印機走 IPP”配置后隊列卻一直報無法連接。原因631 端口上同時有 HTTP 管理服務(wù)瀏覽器訪問根路徑拿到的是 HTML 頁面IPP 的二進制請求必須 POST 到具體路徑比如/ipp/print而且請求體不是普通表單。解決用ipptool而不是 curl 去驗證。curl 能拿到 HTML 只能說明該端口有 HTTP 服務(wù)不能說明它是 IPP。這個誤區(qū)之所以常見是因為很多打印服務(wù)器把自己的狀態(tài)頁也放在 631 上根路徑和 IPP 端點共存。正確習(xí)慣是寫一個小測試文件用ipptool -tv ipp://host/ipp/print getattrs.test跑一次看返回狀態(tài)。如果路徑不對就把/ipp/print換成/ipp再看。翻車幾次后你會發(fā)現(xiàn)路徑調(diào)試比端口調(diào)試花的時間多得多。5.4 認證/TLS導(dǎo)致無論是ipptool還是打印服務(wù)組件都無法協(xié)商現(xiàn)象ipptool請求返回client-error-not-authenticated或者日志里出現(xiàn) SSL/TLS 握手失敗同一個 URI 換了網(wǎng)絡(luò)環(huán)境又好了。原因打印機只允許認證用戶訪問 IPP或者只開放ipps://并要求 TLS且證書不受本機信任。解決優(yōu)先改用ipps://把打印機根證書導(dǎo)入系統(tǒng)信任庫如果只是臨時測試且設(shè)備允許關(guān)閉加密可以明確配置成局域網(wǎng)ipp://但不要在生產(chǎn)環(huán)境關(guān)掉。這里要特別提醒自簽名證書的主機名不匹配也會導(dǎo)致握手失敗明明打印機 IP 是對的證書里寫的卻是出廠序列號。這在打印服務(wù)組件里會被記成“認證失敗”誤導(dǎo)很多人去查賬號密碼。如果你用的是帶證書的設(shè)備先檢查證書里的 Common Name 是否與訪問 IP 一致再檢查系統(tǒng)信任庫。證書問題不解決后面所有屬性請求都不會成功。5.5 設(shè)置屬性后打印機“選擇忽略”Finishings與media現(xiàn)象提交作業(yè)時帶上finishings4表示裝訂和mediaiso_a4_210x297mm打印機打出來卻沒有裝訂紙張也不是標準 A4。原因沒有先看打印機的finishings-supported、media-supported或者設(shè)備要求用finishings-col、media-col這類集合屬性而不是簡單屬性。解決先用Get-Printer-Attributes把支持列表拉出來再按支持列表提交。不同廠商對裝訂、折頁這類能力的定義差異很大同一臺機器的固件升級前后也可能改屬性結(jié)構(gòu)。有的設(shè)備只認media-col里的media結(jié)構(gòu)體你只傳media字符串時它會靜默忽略。遇到這類情況不要盲目加大參數(shù)先用ipptool發(fā)一個只帶requested-attributes finishings-supported的請求把枚舉值記下來。屬性協(xié)商本來就是 IPP 的強項我們卻經(jīng)常把它當普通 HTTP 表單處理這大概是這個協(xié)議最大的“人文陷阱”。6. 進階把IPP當服務(wù)來調(diào)試學(xué)會這三個技能少翻車6.1 用 tcpdump 只抓 631 端口比看驅(qū)動日志快驅(qū)動日志往往只告訴你“作業(yè)錯誤”不告訴你打印機到底回了什么。遇到奇怪問題時我習(xí)慣先抓包tcpdump -i eth0 -s 0 -w /tmp/ipp.pcap port 631把文件留給抓包工具去解析重點看 IPP 響應(yīng)里的狀態(tài)碼和job-state-reasons。抓包的好處是能看到客戶端實際發(fā)出的屬性很多“打印機不聽話”其實是客戶端傳錯屬性名。6.2 把 ipptool 請求存成測試文件回歸驗證不再靠手敲我一般會把Get-Printer-Attributes和Print-Job寫進兩個獨立文件存成/tmp/getattrs.test和/tmp/printjob.test。調(diào)試設(shè)備時每次只需ipptool -tv ipp://$DEVICE_IP/ipp/print /tmp/getattrs.test這樣變量只出現(xiàn)在命令行里測試文件作為資產(chǎn)留檔同一臺設(shè)備升級固件后可以用它快速驗證能力有沒有變。沒有測試文件每次手敲 heredoc很容易漏掉attributes-charset或printer-uri。6.3 驗證端到端能力、提交、隊列三連查我的驗證順序固定是先看printer-state再看document-format-supported提交后查Get-Jobs。任何一步不通過直接看對應(yīng)屬性不猜原因。這套流程在接入新設(shè)備時最多十分鐘跑完。這幾次踩坑后我養(yǎng)成了一個習(xí)慣凡是路由器和打印設(shè)備過來第一件事先跑一遍Get-Printer-Attributes留檔很多配置問題在第一步就能看出來。希望幫到你。本文還有配套的精品資源點擊獲取