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

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

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

建表很簡單,我們選擇了一類數(shù)據(jù)對應一張超級表,超級表下根據(jù)車牌號劃分子表,表結構如下圖所示。目前還是項目初期,所以只接入了 700 余輛車,后續(xù)會逐步增加接入車輛。也正因為這套環(huán)境接入設備不多,寫入方面并無壓力,遠遠達不到 TDengine 的寫入極限。

具體應用
我們要通過數(shù)據(jù)的變化來實時得到車輛的很多信息,比如是否有停留、超速、緩行、離線等事件發(fā)生。有些功能可以通過 TDengine 的查詢功能實現(xiàn),有些不方便實現(xiàn)的暫時通過應用來完成。
下面我們通過幾個例子來看看目前業(yè)務中使用比較頻繁的查詢:
1.獲取車輛的最新位置
SQL 語句如下。
select last_row(longitude,latitude),deviceId from ioc_gps.vehicle_location groupby deviceId where device_id = #{deviceId} and ts >= #{startTime} and ts <= #{endTime}
業(yè)務需要快速查詢每輛車的最新坐標,這里用到了 TDengine 提供的 last_row 函數(shù)。除了查詢單獨某輛車,經(jīng)常還會根據(jù) groupId 或者一批 deviceId 去查詢一批車輛的最新坐標。
系統(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}
通過指定時間范圍和具體的車牌號,就可以立刻獲得該車輛的軌跡數(shù)據(jù)并渲染出軌跡圖像。如果知道子表名的話,還可以直接查詢子表,這樣會減少超級表中對于標簽的檢索。
系統(tǒng)界面如下圖所示。

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



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



-1.png)












伙伴.png)



