徐子煌 劉文果 阮高飛 陳灝嶸 趙海峰
東莞理工學院 廣東東莞 523000
近年來,高校在校學生保有量急劇增加,而這部分人群對打印的需求量相當大。目前高校內傳統打印店運營模式,主要為學生到店與商家進行面對面的接觸交流,由商家手動操控電腦、設置文件打印格式、驅動打印機進行任務印刷,學生現場確認并進行掃碼或現金支付、取走打印文件并離開這一系列的動作,從而完成打印這一流程并滿足需求,過程煩瑣且消耗時間長。
人工操作的方式使得打印所需的時間大大增加,實際的操作中也存在信息交流和編輯操作的誤差,從而使得打印效率低下,進而影響客戶的使用體驗。為節約開支控制租金成本,高校打印店的門面面積一般不大,可容納的打印機及配套設施數量有限,高峰時期打印需求大而店內學生擁擠排隊等候的供需不平衡,以及電腦處于待機狀態的低人口流量時段,使得設備處于資源浪費的狀態,不利于資源的有效利用和共享經濟的實行。
同時,高校學生打印需求多樣化,對排版編輯、紙張大小、紙張品質等要求眾多,而打印門店提供的多數為基本服務,無法滿足打印的各類需求。當下打印資料主要依靠U盤拷貝的形式進行文檔的傳輸,而U盤是電腦病毒傳播的主要途徑,可能會損壞本地硬盤資料造成文件破壞,進而造成經濟損失。目前提供文檔編輯的軟件琳瑯滿目,不同軟件在傳輸和使用中存在格式兼容的問題,一旦文件拷貝到電腦中出現亂碼等情況時,需要人工進行手動調節,時間花費長且服務體驗較差。
云打印成本小,能夠靈活地在辦公區域、學生宿舍、教學樓、社會上的便利店等人群密集且人流量大的場所進行投放和使用。無人值守的自主打印能夠降低運營成本,云打印作為移動互聯網應用,操作簡單,使用便利,兼容多種格式的文檔,滿足用戶多樣化的打印需求,極大地提高校園內的打印效率。
新型云打印依托方便的小程序等媒介實現線上文檔、照片打印,極大地創新了打印的方式。用戶可根據入駐商家的設置,進行線下的自主提取或文件派送,打破用戶在使用時間和空間上的限制,便捷而高效。
新型的云打印則采用云端儲存的方式,用戶將文檔上傳至云端服務器,待打印完成后,平臺將自動刪除相關文檔的所有信息,整個過程自動化操作,無須人工干預。云端儲存的形式也減少了U盤病毒相互交叉感染的風險,系統整體安全性高,用戶信息和數據安全得到根本性的保障。
云打印系統基于MVC架構進行分層設計(見圖1),在基礎的展示層、控制層和數據層上,繼續細分出了業務層和公共基礎設施層。展示層是面向微信小程序、“Windows”服務商客戶端的前端部分,負責為用戶展示豐富的界面信息。控制層負責展示層請求的轉發和鑒權驗證,此層的Interceptor會對接收到的請求中攜帶的token進行驗證,驗證通過后方會將請求轉發到Controller中進行后續處理。業務層是云打印系統中最為核心的一層,負責處理云打印邏輯,如文件管理、打印機管理、訂單相關管理、服務商管理、商家客戶點對點咨詢模塊。數據層提供用戶和系統的數據持久化和緩存功能,負責數據的讀取、寫入操作;數據庫操作通過ORM框架進行。公共基礎設施層包括通用的邏輯處理模塊、Spring的控制反轉模塊、日志模塊和云印功能單元測試模塊。

圖1 云打印系統架構圖
云打印服務系統分有兩個客戶端,一個為普通用戶端,供需要打印的用戶使用(見圖4);另一個為商家客戶端,供文印店或其他商家使用(見圖3)。打印店商家只需安裝云印客戶端,再通過簡單配置,即可零成本地將傳統打印機接到云打印平臺,實現無人值守自動打印,周圍用戶即可立即下單。同時商家客戶端還提供了許多人性化的功能,如可同時自動監控多臺打印機、收入自動提現、訂單管理等功能。商家客戶端的工作過程如圖2所示。

圖2 服務商客戶端工作時序圖

圖3 服務商客戶端界面

圖4 云打印系統用戶端查詢打印機列表界面
(1)文件轉碼可靠性。為確保文件格式的兼容性,文件統一在文件服務器進行轉碼管理等操作,防止由于商家操作系統的不兼容帶來文件的亂碼等錯誤。轉碼模塊使用國產WPS的COM組件。通過在項目工程中引入Jacob依賴,調用Jacob組件的ComThread來初始化COM資源;接著調用Dispatch的invoke方法為轉換的文檔打開視圖,并傳入name為ExportAsFixedFormat的參數來將文件轉換為PDF文件;最后再調用ComThread.Release來釋放COM資源。轉換完成后,通過調用File.Delete方法刪除原文件,以降低磁盤空間占用。
(2)打印過程可靠性。在用戶創建打印任務之后,打印任務需要指派給對應的打印機進行打印。安裝在打印店電腦上的服務商客戶端會自動從后端拉取它對應的打印任務進行打印,打印完成之后客戶端會通知后端,后端再發送小程序模板消息通知用戶打印成功。服務商客戶端通過使用WMI(Windows管理技術)來進行打印機的管理、打印任務的添加和管理,保證了整個打印過程的可靠性。
為了確保用戶在下單之后,服務商客戶端能在第一時間獲取打印任務并進行打印,客戶端和服務器之間使用了WebSocket進行數據交換。WebSocket是一種全雙工通信的協議,客戶端和服務器只需要完成一次握手,就可以進行雙向數據傳輸。服務商在客戶端登錄之后,并主動帶上登錄憑證去與服務端建立WebSocket連接。服務端的攔截器對憑證校驗通過之后,連接便成功建立。之后客戶端會主動調用subscribe方法來訂閱自己的頻道,每個頻道對于不同的服務商都是唯一的,以便服務端及時向客戶端推送消息。后端對消息的發送與接收有嚴格的檢查,會在緩存中存放接收到的消息的唯一標識,并利用LRU算法刷出過期數據,以防止某些場景下消息的重復發送而導致重復打印。
(3)打印機列表快速查詢。該系統可以為用戶優先推薦距離最近的打印機,讓用戶可以就近選擇打印機。由于該功能是系統的核心功能,也是訪問最為頻繁的接口,因此響應時間必須要快,故通過GeoHash算法和Redis中間件來實現該功能。
周邊查詢的傳統方式是根據經緯度坐標進行距離的計算,并將滿足精度的目標篩選顯示。這種查詢方式不僅需要強大的數據庫和服務器支持,對于查詢精度以及查詢效率也是一個極大的挑戰。GeoHash是一種地理編碼,可以把目標經緯度坐標轉換為類URL的字符串編碼,在保證目標位置精度的情況下,減少傳統經緯度表示方法產生的冗余,因而被廣泛應用于地物周邊查詢、地理圍欄技術中,可提供更加精準的周邊打印機推薦。
而Redis則為GeoHash算法提供了高效的實現,它將經緯度轉化成長度為52位的整數,將該數值作為score值,然后將其存放在zset里面。首先在Redis中使用geoadd來將通過GeoHash算法轉換后的打印機的經緯度添加進zset中,然后使用georadius命令,如georadius printer_list 23.12 114.2 10 km WITHDIST,即可獲得緯度23.12,經度114.2所在位置的周邊10km內的打印機列表。由于Redis是將元素存儲在內存中,因此計算十分快速,符合為用戶高效查詢附近打印機的目標。
(4)系統QoS保障。云打印系統通過目前業界流行的彈性可伸縮的云計算服務以及可無縫擴展的集群架構,來提供穩定可靠的云打印服務以及應對容量需彈性變配的業務需求。小程序與服務商客戶端通過https協議進行傳輸加密和身份認證來保證傳輸過程的安全性。系統使用Nginx作為Web服務器,通過配置以下信息,來為系統的多臺服務器提供負載平衡和緩沖服務。
upstream cloudprintingserver {
least_conn;
server 127.0.0.1:10023;
server 127.0.0.1:10024;
}
server {
listen 80;
server_name localhost;
location/{
root html;
proxy_pass http://cloudprintingserver;
}
}
為應對數據存儲規模迅速增長所帶來的瓶頸問題,使用了Mycat數據庫中間件進行讀寫分離、分庫分表以及自動故障切換等,來保證系統的高可用性。
云打印是以移動互聯網技術為基礎,將閑置打印資源進行整合接入,融合便捷的移動支付體系,提高打印設備的使用效率,促進資源的有效利用。智能共享云打印服務的低成本接入特點能夠幫助商家高效進行組織打印,同時還優化了傳統打印模式中煩瑣的打印準備、結算等環節,摒除多余的人工,實現了更低的維護成本。在實現更好的普惠性打印服務方面,云打印平臺具有良好的前景,例如能夠通過與便利店等結合,推動打印行業門檻的降低和實現更便利的打印服務。為響應國家發展戰略要求的號召,后續可推動云打印實現自主可控平臺上辦公軟件的轉化,實現可安全管控、安全共享的云打印服務。