張振華,田鑫華,師凱旋,趙麗,白永紅
(晉中學院信息技術與工程學院,晉中030619)
數控機床在運行中會產生各種“疑難雜癥”,不及時排錯會影響生產,甚至造成事故。如果能查清故障位置和故障的原因,就能及時地進行維修。互聯網上的網站及論壇等存在大量的有價值的信息,通過對其相關數據進行采集挖掘,可以獲取相應設備發生故障的原因和維修解決的方式,形成知識數據庫,這樣能幫助機床工作人員快速診斷排查故障,保障生產及安全。
項目整體采用了C/S(客戶端/服務器)架構。
項目客戶端應用App 的開發采用了Apicloud[1](使用HTML+JavaScript+CSS 移動端快速開發工具)。
項目服務端應用開發采用了Django 框架[2]。Django是基于MVC 構建的框架,MVC(Model View Controler)是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開,M 是指數據模型,V 是指用戶界面,C 則是控制器。使用MVC 的目的是將M 和V 的實現代碼分離,從而使同一個程序可以使用不同的表現形式。C目的是確保M 和V 的同步,一旦M 改變,V 應該同步更新。Django 中包括模型(Model)、模板(Template)和視圖(Views),對應于MVC 中的模型、視圖、控制器,故稱為MTV 模式。
在本項目的開發中,沒有使用MTV 模式中的模板(Template),服務器只返回數據,數據的渲染在客戶端,項目架構如圖1 所示。

圖1 項目架構圖
系統功能如圖2 所示。

圖2 系統功能圖
(1)故障檢索
用戶可根據廠商、型號、錯誤碼或關鍵字從數據庫中獲取相關問題解決方案,還可以對解決方案進行點贊或者收藏,如果用戶對搜索結果不滿意,可重新獲取。
(2)熱門問題排行
向用戶展示點贊個數較多的解決方案列表。
(3)新聞資訊
展示給用戶最新的機床行業類資訊。
(4)我的收藏
展示用戶收藏的問題解決方案。
(5)瀏覽記錄
展示給用戶的瀏覽記錄。
服務器端采用Nginx+uWSGI+Django 部署方案,Nginx 是一個優秀的Web 服務軟件,還可以作為反向代理和負載均衡,以及緩存服務或使用。uWSGI 是一個Web 服務器,它實現了WSGI 協議、uWSGI、HTTP 等協議。WSGI 是一種Web 服務器網關接口。它是一個Web 服務器(如Nginx、uWSGI 等服務器)與Web 應用(如用Django 框架寫的程序)通信的一種規范。
使用Django 框架編寫機床檢索應用程序,安裝uWSGI,使用命令uwsgi--http :8000--chdir=/path/to/project --home=/path/to/env--module project.wsgi 在本地8000 端口運行Django Web 應用。然后配置Nginx監聽8000 端口,并且配置項目靜態文件,實現項目的布署。
客戶端使用Apicloud 開發工具,使用HTML+CSS+JavaScript 并結合Apicloud 官方提供的調用Android 原生能力的API,實現客戶端的設計及與服務器端的通信。
數據庫端使用關系型數據庫MySQL[3],通過Navi?cat 客戶端對其進行可視化操作。數據來源主來源自網上的機床網站、百度知道、搜狗問答等獲取新聞資訊以及錯誤信息和解決方案,利用requests(強大的http請求庫)、aiohttp(異步HTTP 請求庫)、asyncio、pyquery(HTML、XML 頁面解析庫),re(正則)等庫對網站進行抓取并處理存入MySQL 數據庫中。
2.4.1 數據獲取流程圖

圖3 數據獲取流程圖
2.4.2 數據獲取方式
(1)機床問題
●來源:百度知道、搜狗問問
●定時爬取
利用關鍵字“機床報警”,“機床警報”,“機床錯誤”,“機床顯示”等獲取百度知道、搜狗問問的問題列表,獲取其中的有用信息并存入數據庫中。
使用Python 定時執行庫apscheduler 實現每天固定時間爬取問題并存入數據庫。
●動態爬取
當用戶對結果不滿意時,從百度知道、搜狗問問動態獲取信息,并返回給用戶。
(2)視野文章
●來源:數據機床市場網
●定時爬取
使用Python 定時執行庫apscheduler 實現每天固定時間爬取問題并存入數據庫。
(3)代理IP
●用途
當爬蟲速度過快,觸發網站反爬機制時,使用代理IP 可以恢復爬取。
●來源
各大代理網站獲取。
●定時更新
使用Python 定時執行庫apscheduler 實現固定時間間隔更新IP 并存入數據庫。
●實時監測
當IP 數量小于一定數目時,從代理網站中獲取IP并存入數據庫。
項目采用C/S 架構,由客戶端發送請求給服務器,服務器將數據返回給客戶端進行渲染。服務器主要進行數據及邏輯處理,客戶端主要負責數據的頁面展示,如圖4 所示。

圖4 項目處理邏輯
(1)客戶端使用HTML+CSS 設計與功能[4]相對應的頁面,然后使用JavaScript[5]編寫事件處理函數,用來處理相應的用戶事件。當用戶觸發某個事件時,如果需要與服務器進行交互,將由JavaScript 請求函數向服務器發送HTTP 請求。
(2)Django 應用中的urls.py 用于將功能接口與具體的邏輯處理函數相關聯,views.py 用于具體的邏輯處理,models.py 用于定義數據模型。當服務器接收到客戶端發來的HTTP 請求時,將會執行urls.py 中對應的邏輯處理函數,用來通過模型讀寫數據庫或者讀寫媒體文件和讀取靜態文件。最后將處理結果通過Re?sponse 對象返回給客戶端。
(3)客戶端接收到服務器的響應后,由JavaScript函數對數據進行渲染,然后在頁面上呈現給用戶。
依賴此過程,完成客戶端與服務器的交互。
(1)客戶端使用Apicloud 開發工具,運用HTML+CSS 設計搜索頁、解決方案列表頁和解決方案詳情頁,并運用JavaScript 編寫相應的頁面跳轉及事件處理函數。當用戶輸入錯誤碼(關鍵字)并點擊確定按鈕時,觸發點擊事件,執行相應的JavaScript 函數。JavaScript函數調用AJAX(局部刷新)技術,將廠商、型號、錯誤碼(關鍵字)、email(用戶唯一標識符)、本地登錄狀態及要訪問的接口(answers)以HTTP POST 方式發送給服務器。
(2)服務器接收到客戶端的請求,從urls.py[6-7]中找到接口與其對應的處理函數(views.answers),從而調用views.py 中answers 函數,從request 對象中獲取客戶端的請求參數,然后調用model.objects. filter(TI?TLE__icontains = code).values('id','TITLE','CONTENT','TIME','AGREE','VIEWS')從數據庫中調取標題包含錯誤碼(關鍵字)的解決方案。如果解決方案回答過長則將其做截斷處理,如果用戶已登錄,則調用model.objects.filter(QUES_ID = answer_id).filter(USER_ID = email).count()判斷用戶是否已經對解決方案進行了點贊或者收藏操作,進行相應的狀態標識。最終將獲取到的數據轉化為JSON 數據格式通過HttpResponse 對象將其返回給客戶端。
(3)客戶端接收到服務器的響應后,判斷響應的長度是否為0,如果為0,則提示用戶“沒有更多信息”,如果長度不為0,則使用模板引擎doT.js 對響應內容進行渲染展示,最終將解決方案以列表形式呈現給用戶。若用戶對搜索結果不滿意,則可以再進行一次重新搜索,服務器將從網絡中重新獲取一次數據,而不是從數據庫中調用,如果用戶對新的搜索內容進行了點贊或收藏,則將其存入數據庫中。
系統主要功能的測試如圖5-圖8 所示。圖5 是當用戶輸入錯誤碼(關鍵字)搜索后的展示圖,圖6 是app首頁的熱門問題效果展示圖,圖7 是新聞資訊頁的效果展示圖,圖8 是在用戶登錄的情況下的我的收藏頁效果展示圖。

圖5 故障檢索

圖6 熱門問題展示

圖7 新聞資訊

圖8 我的收藏
此App 的開發基于客戶/服務器開發模式,服務器基于MVC 架構開發,實現了用戶信息管理、故障檢索、新聞資訊展示等功能模塊的開發,希望在此基礎上可以開發出更完善的可多平臺使用的機床故障檢測平臺。