姚文欽,茍 剛,母洪鋮
(貴州大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,貴陽 550025)
隨著互聯(lián)網(wǎng)技術(shù)日新月異的發(fā)展,我國當(dāng)前的道路貨物運(yùn)輸企業(yè)呈現(xiàn)“多、小、散”的特點(diǎn)[1],并且對(duì)于傳統(tǒng)的貨運(yùn)企業(yè)而言,其在運(yùn)作模式上已經(jīng)形成了一整套運(yùn)營體系,理念模式也較為陳舊.其根本原因在于該行業(yè)的特殊性,運(yùn)輸過程缺乏規(guī)范化的監(jiān)控和管理.如今,互聯(lián)網(wǎng)與各行各業(yè)的結(jié)合是必不可少的趨勢,早期車輛管理系統(tǒng)主要是以美國的GPS 定位技術(shù)為依托.但出于安全情況的考慮下,由我國自主研發(fā)的北斗衛(wèi)星導(dǎo)航系統(tǒng)[2,3]更適合于我國軟件的發(fā)展趨勢.同時(shí),對(duì)于車輛管理系統(tǒng)而言,國內(nèi)外研究各有特色.如:龔德平[4]以某物流公司為背景,使用Java EE 技術(shù),設(shè)計(jì)了車輛管理系統(tǒng),有效地解決了傳統(tǒng)模式下車輛申請和車輛使用的弊端.卓浩[5]以某行政部門公務(wù)用車為背景,使用NET 平臺(tái)進(jìn)行集成開發(fā),設(shè)計(jì)了更為實(shí)用的車輛管理系統(tǒng).Erkut 等人[6]以車輛運(yùn)輸路線為特點(diǎn),設(shè)定社會(huì)風(fēng)險(xiǎn),路線長度等為參數(shù),通過評(píng)價(jià)危險(xiǎn)品在運(yùn)輸過程中的線路的風(fēng)險(xiǎn),來為危險(xiǎn)品車輛路徑優(yōu)化提供破解的方案.
本文所述系統(tǒng)主要由PHP 語言的ThinkPHP 框架,MySQL 數(shù)據(jù)庫,以及由渣土協(xié)會(huì)提供的車輛數(shù)據(jù)與北斗定位數(shù)據(jù)等為基礎(chǔ),來開發(fā)實(shí)現(xiàn)相應(yīng)功能.系統(tǒng)界面簡明,操作方便,在“互聯(lián)網(wǎng)+”的背景下,充分利用在線平臺(tái)來實(shí)現(xiàn)車源和貨源信息的有效聚集,降低車輛的空車率,規(guī)范渣土車輛運(yùn)營,以及為實(shí)現(xiàn)源頭追溯與全流程透明化管理提供統(tǒng)一的服務(wù)[7].
本系統(tǒng)采用了層次化的設(shè)計(jì)架構(gòu),其總體架構(gòu)主要分為3 部分,分別為:數(shù)據(jù)層,業(yè)務(wù)邏輯層,應(yīng)用層.數(shù)據(jù)層主要是對(duì)數(shù)據(jù)庫進(jìn)行訪問,以此來獲取車輛的定位數(shù)據(jù),車輛數(shù)據(jù)以及CAN 總線數(shù)據(jù);業(yè)務(wù)邏輯層主要是對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的邏輯處理,如:車輛運(yùn)輸管理、司機(jī)管理、接口管理、TCO 管理等操作;應(yīng)用層主要用于在用戶操作時(shí)對(duì)相應(yīng)數(shù)據(jù)的一個(gè)展現(xiàn),其主要包含:網(wǎng)站首頁、日常管理、車輛管理、用戶管理、等頁面的展現(xiàn).系統(tǒng)的總體架構(gòu)如圖1所示.
圖1 系統(tǒng)總體架構(gòu)圖
基于北斗的城市垃圾清運(yùn)系統(tǒng)采用B/S (Browser/Server)架構(gòu)設(shè)計(jì)模式,以及基于PHP的ThinkPHP 框架來進(jìn)行開發(fā)[8,9],且使用了Apache 服務(wù)器.系統(tǒng)的前端主要基于HTHL 規(guī)范,其前后臺(tái)之間的數(shù)據(jù)通過Ajax的方式來進(jìn)行異步請求獲取,所有接口數(shù)據(jù)均通過JSON 格式來進(jìn)行交互[10,11].系統(tǒng)的后端應(yīng)用程序采用了MVC (Model-View-Controller)的設(shè)計(jì)模式,更易于將系統(tǒng)的輸入輸出和邏輯處理進(jìn)行分離,使軟件架構(gòu)更加合理,更易于維護(hù).此外,系統(tǒng)的數(shù)據(jù)庫采用了編碼為utf-8的關(guān)系型數(shù)據(jù)庫MySQL.
城市垃圾清運(yùn)系統(tǒng)按功能劃分為網(wǎng)站首頁、車輛管理、日常管理、統(tǒng)計(jì)分析、用戶管理五大模塊,針對(duì)這五大模塊,系統(tǒng)中又設(shè)計(jì)了與其功能模塊相對(duì)應(yīng)的子模塊.用戶可以通過瀏覽器訪問客戶端來使用系統(tǒng)功能,系統(tǒng)的功能模塊如圖2所示:
圖2中網(wǎng)站首頁是用戶在進(jìn)入系統(tǒng)后默認(rèn)展示的界面,主要用于為用戶提供基本的信息展示,如車輛總數(shù)、派出車輛占比、車輛分布數(shù)據(jù)等,用戶可通過登錄進(jìn)入管理系統(tǒng).
圖2 系統(tǒng)功能模塊圖
車輛管理主要是對(duì)車輛的運(yùn)輸及其軌跡進(jìn)行管理,主要包括的子模塊有車輛實(shí)時(shí)位置管理,車輛運(yùn)輸管理,車輛歷史軌跡管理[12,13].系統(tǒng)還可以針對(duì)固定車輛進(jìn)行車輛軌跡浮現(xiàn),即查看當(dāng)天車輛運(yùn)輸貨物的軌跡,該數(shù)據(jù)還可多方面利用.系統(tǒng)內(nèi)車輛的運(yùn)輸路線是由高德地圖來對(duì)其進(jìn)行展現(xiàn),地圖模塊的定位數(shù)據(jù)來自于運(yùn)輸車輛自帶的北斗定位模塊,并且在展現(xiàn)前系統(tǒng)內(nèi)部將會(huì)對(duì)車輛定位模塊發(fā)送的定位數(shù)據(jù)進(jìn)行獲取,分析與處理.
日常管理包括項(xiàng)眾多,其中涵蓋了工地注冊(垃圾清運(yùn)車起始站點(diǎn))、服務(wù)點(diǎn)注冊、車輛注冊、車輛維修管理、車輛保險(xiǎn)管理、保養(yǎng)管理等.日常管理的主要作用是保證系統(tǒng)服務(wù)的正常運(yùn)行,該模塊在功能區(qū)中的展現(xiàn)方式主要以表格的方式來顯示.
統(tǒng)計(jì)分析是數(shù)據(jù)的綜合部分,統(tǒng)計(jì)分析模塊主要涵蓋了工地收入管理,TCO 統(tǒng)計(jì),車輛進(jìn)出統(tǒng)計(jì),這一功能可以清晰明了的展現(xiàn)承運(yùn)人的總收入,車輛運(yùn)輸總趟數(shù)等綜合性數(shù)據(jù).
用戶管理主要管理在平臺(tái)上注冊的用戶信息,其中主要信息包括:賬號(hào),姓名,電話,角色以及操作權(quán)限等.同時(shí),可通過管理員權(quán)限來增加用戶以及分配相應(yīng)用戶權(quán)限.
對(duì)于北斗衛(wèi)星定位技術(shù)而言[14],它是我國科學(xué)家根據(jù)社會(huì)經(jīng)濟(jì)發(fā)展的需要和基于國家國防安全角度的考慮開發(fā)出來的空間定位技術(shù).此外,北斗衛(wèi)星導(dǎo)航系統(tǒng)可提供雙向高精度授時(shí)和短報(bào)文通信服務(wù),其位置精度為平面5,高程10 m,測速精度0.2 m/s,授時(shí)精度為單向50 ns[15].同時(shí),出于隱私和安全考慮,系統(tǒng)的北斗定位數(shù)據(jù)均采用數(shù)據(jù)包的形式發(fā)送,司機(jī),車輛等信息由貴陽市渣土協(xié)會(huì)提供,并在使用時(shí)通過接口的調(diào)用來返回相應(yīng)數(shù)據(jù).
當(dāng)上級(jí)平臺(tái)與車輛間主從通信鏈路中斷時(shí),需在雙方主從鏈路通信恢復(fù)后補(bǔ)發(fā)中斷期間的車輛定位信息,若車輛需發(fā)送的數(shù)據(jù)包大于5 條時(shí)則以每包5 條的方式進(jìn)行補(bǔ)發(fā).同時(shí),車輛將會(huì)通過推送數(shù)據(jù)包的方式,將數(shù)據(jù)推送到socket 服務(wù)來建立連接,以此讓客戶端獲取到車輛北斗定位模塊所提供的數(shù)據(jù)包.當(dāng)長時(shí)間未收到推送數(shù)據(jù)包時(shí),系統(tǒng)會(huì)將服務(wù)進(jìn)行重啟,并由最后一個(gè)數(shù)據(jù)包的時(shí)間戳,來對(duì)未收到的數(shù)據(jù)包進(jìn)行重新請求.正常獲取到的數(shù)據(jù)包如圖3所示.
圖3 車輛定位數(shù)據(jù)包
然后系統(tǒng)會(huì)在本地對(duì)數(shù)據(jù)包進(jìn)行解析,進(jìn)而獲取到車輛的明確定位數(shù)據(jù).由于系統(tǒng)內(nèi)使用的北斗短報(bào)文通信屬于北斗系統(tǒng)提供的民用短報(bào)文通信.在獲取相應(yīng)信息時(shí)會(huì)使用字符串截取函數(shù)來對(duì)報(bào)文進(jìn)行截取,并將其從16 進(jìn)制轉(zhuǎn)為10 進(jìn)制,并寫入數(shù)據(jù)庫,其數(shù)據(jù)包文件解碼的關(guān)鍵代碼如下:
public static function log($data){
$log_file=__DIR__.' cp_master_log'.date("Y-md").'.txt';
if(($log=fopen ($log_file,"a+"))===FALSE){
echo("創(chuàng)建可寫文件:".$log_file."失敗");
return;
}
fwrite($log,date("Y-m-d H:i:s").":".$data." ");
fclose($log);
}
// 收到數(shù)據(jù)包后自動(dòng)進(jìn)行解碼
public static function decode($recv_buffer){
$recv_buffer=str_replace(pack("H*","5a01"),pack("H*","5b"),$recv_buffer);
$recv_buffer=str_replace(pack("H*","5a02"),pack("H*","5a"),$recv_buffer);
……
}
系統(tǒng)的地圖服務(wù)是基于高德地圖的API[16]來開發(fā)的,該服務(wù)是車輛實(shí)時(shí)定位功能與軌跡查詢功能的基礎(chǔ).在使用高德地圖的API 時(shí),需要在高德開放平臺(tái)上的應(yīng)用管理頁面創(chuàng)建一個(gè)新應(yīng)用,并在該應(yīng)用內(nèi)新添加一個(gè)key,然后就可以在前端頁面內(nèi)通過sctipt 標(biāo)簽引入高德地圖的API來進(jìn)行項(xiàng)目的開發(fā),引用代碼如下:
接著就可以通過高德地圖API 所提供的類以及方法來對(duì)地圖組件來進(jìn)行相應(yīng)的操作.通常使用Amap.Map(" ")方法來創(chuàng)建一個(gè)地圖實(shí)例對(duì)象,再通過該對(duì)象來調(diào)用高德地圖API的類和方法來實(shí)現(xiàn)具體功能.
function init(){
var map;
// 創(chuàng)建地圖實(shí)例
map=new AMap.Map("container");
var lnglats=get_lnglats();
}
對(duì)于數(shù)據(jù)層而言,ThinkPHP中內(nèi)置了抽象數(shù)據(jù)庫訪問層,可以把不同數(shù)據(jù)庫操作封裝起來,并使用公共的Db 類來進(jìn)行操作,Db 類會(huì)自動(dòng)調(diào)用相應(yīng)的數(shù)據(jù)庫適配器來處理.系統(tǒng)主要采用在ThinkPHP中加入MySQL 數(shù)據(jù)庫驅(qū)動(dòng)來建立MySQL 數(shù)據(jù)庫連接,再通過對(duì)象關(guān)系映射來定義模型類與數(shù)據(jù)庫表的映射,然后在Controller中通過對(duì)模型類的引用來操作數(shù)據(jù)庫,以此更加方便地對(duì)數(shù)據(jù)庫進(jìn)行操作,并從數(shù)據(jù)庫中獲取車輛的定位數(shù)據(jù),車輛數(shù)據(jù)以及CAN 總線數(shù)據(jù).
業(yè)務(wù)邏輯層主要是由控制器去執(zhí)行相應(yīng)命令,如車輛運(yùn)輸管理,司機(jī)管理,接口管理等操作.前臺(tái)的業(yè)務(wù)通過接口的形式訪問到該頁面對(duì)應(yīng)的控制器,然后再由控制器來操縱相應(yīng)的模型去處理具體的業(yè)務(wù)邏輯.在ThinkPHP內(nèi),自定義的控制器通常要繼承系統(tǒng)的Controller 類,以此使用系統(tǒng)的內(nèi)置方法.如自定義的控制器LoginController 用于控制用戶登錄,首先控制器會(huì)通過會(huì)在視圖層輸出login.html 頁面,再該界面內(nèi),用戶在輸入用戶名和密碼后會(huì)通過Ajax 請求的方式訪問LoginController的login()方法,方法會(huì)先使用D(“User”)來實(shí)例化User 模型,并通過對(duì)象關(guān)系映射的方式來進(jìn)行數(shù)據(jù)庫查詢,比對(duì)所查內(nèi)容與輸入的數(shù)據(jù)是否一致,以此來判斷用戶可否成功登錄,比對(duì)之后系統(tǒng)將通過JSON 向前端返回相應(yīng)信息.
LoginController的login ()方法主要如下:
public function login (){
$user=D("User");
$result=$user->create(I(""),2);
if(!$result){
json_return(0,"登錄失敗",null,$user->get
Error());
return;
}
$result=$user->login();
if(is_array($result)){
echo json_encode($result);
}
else{
json_return(0,$result);
}
}
業(yè)務(wù)邏輯系統(tǒng)采用Bootstrap 與jQuery來設(shè)計(jì)相應(yīng)應(yīng)用層的樣式以及開發(fā)的效率,再結(jié)合HTML、CSS和JavaScript來實(shí)現(xiàn)網(wǎng)站首頁,車輛管理,日常管理,統(tǒng)計(jì)分析,用戶管理五大模塊的前端視圖.為了便于用戶管理,所有視圖層的文件都將存放于Home/View中,并由ThinkPHP 控制器中的渲染函數(shù)display()來進(jìn)行渲染輸出.
例如,登錄后的初始界面為車輛管理模塊的車輛實(shí)時(shí)定位管理,如圖4所示,界面的左側(cè)為菜單欄,右側(cè)為功能區(qū),其中菜單欄可以根據(jù)登錄的用戶所具有的相應(yīng)權(quán)限來進(jìn)行相應(yīng)的渲染.并且,車輛實(shí)時(shí)定位管理功能的地圖是基于調(diào)用高德地圖API[17]來實(shí)現(xiàn)的,該功能可以通過選定車輛的車牌號(hào)和行駛時(shí)間來對(duì)車輛的運(yùn)行軌跡進(jìn)行查詢,從而快速定位到車輛位置,并實(shí)時(shí)監(jiān)控其運(yùn)輸狀態(tài).與此同時(shí)還可以根據(jù)需求來對(duì)工廠,消納場點(diǎn)等位置是否顯示做出操作.
圖4 車輛實(shí)時(shí)位置管理
系統(tǒng)使用PHPStorm 軟件與基于PHP的ThinkPHP框架完成開發(fā),并已部署至實(shí)際的企業(yè)環(huán)境中運(yùn)行,目前經(jīng)用戶反饋運(yùn)行效果良好.平臺(tái)使用阿里云服務(wù)器提供云服務(wù),使用Windows 系統(tǒng)部署開發(fā)環(huán)境.用戶在系統(tǒng)中可通過相應(yīng)的界面操作,可方便地使用各項(xiàng)功能,清晰的掌握車輛的實(shí)時(shí)位置,以及查看當(dāng)前工地的詳細(xì)收益情況.截至2020年12月7 日,系統(tǒng)共有111 輛渣土運(yùn)輸車接入系統(tǒng),注冊司機(jī)超210 人次,系統(tǒng)內(nèi)啟用的工地共42個(gè),其部分車輛運(yùn)行情況如圖5所示,內(nèi)含車輛當(dāng)前運(yùn)行的位置、速度、駕駛?cè)?、?lián)系電話和時(shí)間等信息.
圖5 車輛運(yùn)行情況
基于北斗的城市垃圾清運(yùn)系統(tǒng)實(shí)現(xiàn)了對(duì)垃圾清運(yùn)車的有效管理,其在技術(shù)上,相對(duì)于傳統(tǒng)城市垃圾回收運(yùn)輸而言,它可以實(shí)現(xiàn)源頭追溯,且具有更便捷的可視化界面;實(shí)現(xiàn)全流程透明化管理,并且實(shí)時(shí)關(guān)注每個(gè)環(huán)節(jié)的進(jìn)展情況,以便更好地為企業(yè)降本增效;與此同時(shí)系統(tǒng)均采用了北斗系列來進(jìn)行數(shù)據(jù)采集,更有效的維護(hù)了信息和技術(shù)的安全.但系統(tǒng)由于定位數(shù)據(jù)量過于龐大,查詢車輛的歷史軌跡的時(shí)候,需要通過查詢車輛的歷史定位數(shù)據(jù)來實(shí)現(xiàn),此時(shí)后臺(tái)數(shù)據(jù)加載時(shí)間會(huì)較長,也有可能會(huì)導(dǎo)致數(shù)據(jù)加載失敗的問題.在后續(xù)的開發(fā)過程中還將會(huì)進(jìn)一步地對(duì)問題進(jìn)行改善,并且還可在后續(xù)的開發(fā)過程中結(jié)合機(jī)器學(xué)習(xí)來對(duì)司機(jī)的駕駛行為與車輛的健康狀況進(jìn)行相應(yīng)的分析.