小 T 導(dǎo)讀:車聯(lián)網(wǎng)業(yè)務(wù)是中通科技配送全鏈路業(yè)務(wù)中非常重要的一環(huán),在實(shí)際的項(xiàng)目需求中,需要實(shí)時(shí)查詢車輛最新位置狀態(tài),達(dá)到車輛運(yùn)營(yíng)可視化管理。中智車聯(lián)服務(wù)平臺(tái)選擇了用 TDengine 來(lái)高效處理從車輛上實(shí)時(shí)采集的時(shí)序數(shù)據(jù)。
業(yè)務(wù)背景
目前,中通科技擁有一支千人規(guī)模的研發(fā)團(tuán)隊(duì),在數(shù)字信息科技研發(fā)方面以“互聯(lián)網(wǎng)+物流”的理念,自研的軟件系統(tǒng)和數(shù)字化工具已達(dá)百余個(gè),賦能覆蓋快遞業(yè)務(wù)全場(chǎng)景,同時(shí)為快運(yùn)、國(guó)際、云倉(cāng)、優(yōu)選、金融、商業(yè)等生態(tài)圈業(yè)務(wù)提供全方位的研發(fā)支持,建立起完善的互聯(lián)網(wǎng)產(chǎn)品研發(fā)體系,全場(chǎng)景、全鏈路的數(shù)字化、互聯(lián)化和智能化的業(yè)務(wù)地圖愈發(fā)成熟。
2021 年年底,中通快遞已完成了總部園區(qū)的實(shí)景三維模型,通過(guò)接入園區(qū)內(nèi)的在線傳感器,根據(jù)現(xiàn)有園區(qū)各功能區(qū)的區(qū)位布局,基于此三維模型開展園區(qū)內(nèi)生產(chǎn)規(guī)劃、調(diào)度運(yùn)行和維護(hù)管理的全過(guò)程應(yīng)用,從而實(shí)現(xiàn)園區(qū)內(nèi)人、車、物在精準(zhǔn)運(yùn)行、資源優(yōu)化和配置服務(wù)中的全過(guò)程精益化管理。
隨著生產(chǎn)設(shè)備的小型化和智能化,快遞企業(yè)也將更快地進(jìn)入空間地理信息數(shù)據(jù)生產(chǎn)領(lǐng)域,有包裹流動(dòng)的地方,就會(huì)有時(shí)空數(shù)據(jù)服務(wù)的需求。
這里先給大家介紹一下配送全鏈路業(yè)務(wù),這是指包裹從商家倉(cāng)出來(lái)一直到用戶手上的這段派送履約鏈路,它包含 4 個(gè)主要的實(shí)操流程,分別是分撥實(shí)操、運(yùn)輸實(shí)操、站點(diǎn)實(shí)操和快遞員實(shí)操。把 4 種實(shí)操管理放到三個(gè)系統(tǒng)里面,這三個(gè)系統(tǒng)分別是分撥管理、運(yùn)輸管理、末端站點(diǎn)實(shí)操管理。具體如下圖所示。

其中車聯(lián)網(wǎng)業(yè)務(wù)也是非常重要的一環(huán),通過(guò)人、車、貨、場(chǎng)全鏈條覆蓋的車聯(lián)網(wǎng)設(shè)備應(yīng)用,實(shí)現(xiàn)物流運(yùn)輸全鏈路感知。在實(shí)際的項(xiàng)目需求中,我們需要實(shí)時(shí)查詢車輛最新位置狀態(tài),達(dá)到車輛運(yùn)營(yíng)可視化管理,也就是我們的中智車聯(lián)服務(wù)平臺(tái)。
技術(shù)選型
在上述業(yè)務(wù)過(guò)程中,我們使用了 TDengine 來(lái)完成這個(gè)目標(biāo)。
在選型時(shí),我們對(duì)比了 Prometheus 和 TDengine 這兩款很有代表性的時(shí)序數(shù)據(jù)庫(kù)(Time Series Database)。 相對(duì)而言,TDengine 的“一個(gè)設(shè)備采集點(diǎn)一張表”的底層設(shè)計(jì),自帶的降采樣和窗口函數(shù)的優(yōu)秀性能,都十分契合車輛網(wǎng)場(chǎng)景。其列式存儲(chǔ)帶來(lái)的壓縮比也更好。所以我們選擇了 TDengine。
技術(shù)架構(gòu)
我們?cè)诿枯v車上都安裝了部標(biāo)機(jī)(即衛(wèi)星定位汽車行駛記錄儀),來(lái)實(shí)時(shí)采集車輛的行駛速度、時(shí)間、里程以及與車輛行駛相關(guān)的其他狀態(tài)信息。采集到的數(shù)據(jù),通過(guò)我們的 IoT service 這層應(yīng)用來(lái)處理。然后數(shù)據(jù)經(jīng)由 MQ (消息隊(duì)列)層由 JDBC-RESTful 的方式寫入 TDengine 集群,以供上游平臺(tái)使用,而部標(biāo)機(jī)產(chǎn)生的其他類數(shù)據(jù)則通過(guò)別的途徑供上游平臺(tái)使用。

我們使用了三節(jié)點(diǎn)三副本的模式落地了 TDengine 集群。

建表很簡(jiǎn)單,我們選擇了一類數(shù)據(jù)對(duì)應(yīng)一張超級(jí)表,超級(jí)表下根據(jù)車牌號(hào)劃分子表,表結(jié)構(gòu)如下圖所示。目前還是項(xiàng)目初期,所以只接入了 700 余輛車,后續(xù)會(huì)逐步增加接入車輛。也正因?yàn)檫@套環(huán)境接入設(shè)備不多,寫入方面并無(wú)壓力,遠(yuǎn)遠(yuǎn)達(dá)不到 TDengine 的寫入極限。

具體應(yīng)用
我們要通過(guò)數(shù)據(jù)的變化來(lái)實(shí)時(shí)得到車輛的很多信息,比如是否有停留、超速、緩行、離線等事件發(fā)生。有些功能可以通過(guò) TDengine 的查詢功能實(shí)現(xiàn),有些不方便實(shí)現(xiàn)的暫時(shí)通過(guò)應(yīng)用來(lái)完成。
下面我們通過(guò)幾個(gè)例子來(lái)看看目前業(yè)務(wù)中使用比較頻繁的查詢:
1.獲取車輛的最新位置
SQL 語(yǔ)句如下。
select last_row(longitude,latitude),deviceId from ioc_gps.vehicle_location groupby deviceId where device_id = #{deviceId} and ts >= #{startTime} and ts <= #{endTime}
業(yè)務(wù)需要快速查詢每輛車的最新坐標(biāo),這里用到了 TDengine 提供的 last_row 函數(shù)。除了查詢單獨(dú)某輛車,經(jīng)常還會(huì)根據(jù) groupId 或者一批 deviceId 去查詢一批車輛的最新坐標(biāo)。
系統(tǒng)界面如下圖所示。

2. 車查軌跡信息查詢:
select ts,device_id as deviceId,longitude,latitude,altitude,speed as speed,direction,alarm as warnBit,status as statusBit,mobile,mileage,speed2,rssi,satellites,signal_status as signalStatus,gmt_create as gmtCreate,create_ip as createIp,kind,oil,message_id as messageId,device_name as deviceName,plate,device_group_id as deviceGroupId,device_group_name as deviceGroupName,acc, device_code as deviceCode
from ioc_gps.vehicle_location
where device_id = #{deviceId}
and ts >= #{startTime}
and ts <= #{endTime}
通過(guò)指定時(shí)間范圍和具體的車牌號(hào),就可以立刻獲得該車輛的軌跡數(shù)據(jù)并渲染出軌跡圖像。如果知道子表名的話,還可以直接查詢子表,這樣會(huì)減少超級(jí)表中對(duì)于標(biāo)簽的檢索。
系統(tǒng)界面如下圖所示。

未來(lái)規(guī)劃
通過(guò)項(xiàng)目初期的表現(xiàn),可以知道 TDengine 能夠輕松滿足我們的業(yè)務(wù)需求。未來(lái)我們還有其他的使用規(guī)劃,比如在我們的表字段中,有個(gè) ACC 字段,1 表示點(diǎn)火,0 表示熄火,要求能夠計(jì)算點(diǎn)火駕駛行程,由于 TDengine 當(dāng)前還沒(méi)有直接支持 GIS 計(jì)算,暫時(shí)不能通過(guò)坐標(biāo)算出直線距離(當(dāng)前所用的 TDengine 2.0 版本可能需要使用自定義的 UDF 實(shí)現(xiàn)),但是應(yīng)該可以通過(guò)狀態(tài)窗口+加權(quán)平均速度+開火時(shí)間算出車輛每次點(diǎn)火的駕駛路程,就想這樣:
select time*speed from (select elapsed(ts,1s)as time,twa(speed) as speed,acc from t1 state_window(acc)) where acc =1 ;
而每次 ACC 開火熄火的起始點(diǎn)和結(jié)束點(diǎn)信息,可以通過(guò) state_window 配合 first/last 函數(shù)來(lái)實(shí)現(xiàn),比如:
select last(*),first(*) from t2 state_window(charge);
除此之外,我們也需要電子圍欄計(jì)算,需要快速計(jì)算新軌跡點(diǎn)是否進(jìn)入某電子圍欄之中,或者需要快速計(jì)算(1s 內(nèi))位于某行政區(qū)劃(省份/城市)邊界內(nèi)的所有車輛的數(shù)量。這類查詢都需要等 TDengine 繼續(xù)完善才能實(shí)現(xiàn)。
后續(xù)我們接入的車輛會(huì)達(dá)到幾萬(wàn)輛,對(duì)于部標(biāo)機(jī)產(chǎn)生的相關(guān)時(shí)序數(shù)據(jù)的使用也會(huì)越來(lái)越多。期待 TDengine 可以繼續(xù)為車聯(lián)網(wǎng)場(chǎng)景下的查詢提供更為多樣性的支持,產(chǎn)品越來(lái)越好。



互聯(lián)網(wǎng).png)



-1.png)




.png)


證.png)


伙伴.png)
伙伴.png)
伙伴.png)



