姜 濤
(91033 部隊(duì),山東青島266000)
話務(wù)統(tǒng)計(jì)是交換機(jī)的一項(xiàng)重要功能,維護(hù)人員可以通過分析話務(wù)統(tǒng)計(jì)中詳實(shí)的數(shù)據(jù),第一時(shí)間掌握交換機(jī)的運(yùn)行狀態(tài),并根據(jù)話務(wù)統(tǒng)計(jì)中暴露出的問題加以分析并解決,合理運(yùn)用話務(wù)統(tǒng)計(jì)是提高設(shè)備運(yùn)行質(zhì)量的一種重要手段[1]。NGL04 型程控交換機(jī)是網(wǎng)內(nèi)使用比較廣泛的一款交換機(jī),該交換機(jī)自帶一個(gè)話務(wù)統(tǒng)計(jì)工具,但此工具只能對(duì)中繼部分的參數(shù)進(jìn)行分析,不能對(duì)單一用戶進(jìn)行查詢,統(tǒng)計(jì)條件相對(duì)比較固定,不夠靈活和直觀,不方便交換機(jī)維護(hù)人員掌握話務(wù)實(shí)時(shí)情況[2]。本文從交換機(jī)話務(wù)統(tǒng)計(jì)文件著手,通過Python 語言編寫代碼將話務(wù)統(tǒng)計(jì)文件逐條分揀,存儲(chǔ)入MySQL 數(shù)據(jù)庫(kù),寫入Excel 文檔, 最后通過Pyecharts 插件生成可視化分析圖表。
NGL04 型程控交換機(jī)的話務(wù)統(tǒng)計(jì)文件保存在C:NGLDatachargeCDR 文件夾中,每日生成一個(gè)以當(dāng)日日期為文件名的文件[3],該日的話單文件按照時(shí)間順序逐條保存至此文件中,滾動(dòng)更新,文件命名規(guī)則為yyyymmdd.cdr,yyyy 為4 位數(shù),表示年份,mm 為2位數(shù),表示月份,dd 為2 位數(shù),表示日期,所以話單文件的文件名如“20191018.cdr”,要進(jìn)行話務(wù)統(tǒng)計(jì)分析必須從每日生成的話單文件著手,按順序逐條分揀出所有話單,并對(duì)每條話單的各個(gè)字段進(jìn)行提取,按照話單文件的定義提取出相關(guān)的數(shù)據(jù),保存至數(shù)據(jù)庫(kù)中。程序整體的功能結(jié)構(gòu)如圖1 所示[4]。
圖1 程序設(shè)計(jì)流程圖
根據(jù)交換機(jī)相關(guān)文檔,CDR 文件是二進(jìn)制文件,每96 個(gè)字節(jié)為一條話單記錄文件,每條話單記錄文件的主要數(shù)據(jù)包括:
第2 個(gè)字節(jié)為呼叫類別,常用呼叫類別具體含義如表1 所示,可以根據(jù)呼叫類別繪制餅狀圖,直觀分析各個(gè)呼叫類別在本局所有呼叫中的比重。
表1 常用呼叫類別定義示意表
第10 個(gè)至第21 個(gè)字節(jié)為被叫用戶號(hào)碼,第22個(gè)字節(jié)為主叫用戶類別,第24 個(gè)至第27 個(gè)字節(jié)為通話結(jié)束日期,第28 個(gè)字節(jié)為出局路由/ 局向號(hào),第29個(gè)至第31 個(gè)字節(jié)為通話時(shí)長(zhǎng),第32 個(gè)字節(jié)為呼叫時(shí)長(zhǎng),第33 個(gè)至第35 個(gè)字節(jié)為通話結(jié)束時(shí)間,第36 個(gè)至45 個(gè)字節(jié)為主叫用戶號(hào)碼。將這些字節(jié)中包含的關(guān)鍵數(shù)據(jù)項(xiàng)逐一提取,就可以詳細(xì)解析話單文件。
筆者使用Python 來進(jìn)行話單文件的分揀,每條話單為96 個(gè)字節(jié),根據(jù)每日文件的總字節(jié)可推算出當(dāng)日共產(chǎn)生多少條話單,分揀出每條話單后,在每條話單中使用seek 函數(shù)逐個(gè)提取話單中各個(gè)關(guān)鍵數(shù)據(jù),并將其保存至列表中,部分字節(jié)需要進(jìn)行10 進(jìn)制與16 進(jìn)制的轉(zhuǎn)換。部分代碼如下:
# 獲取通話結(jié)束日期
f.seek(1,1)
byte =f.read(4)
strhex = str(binascii.b2a_hex(byte))
callingdates.append(strhex[2:10])
# 獲取通話路由
f.seek(0,1)
byte =f.read(1)
strhex = str(binascii.b2a_hex(byte))
outgoingroutes.append(str(int(strhex[2:4],16)))
在MySQL 中創(chuàng)建一個(gè)名為nglcdr 的數(shù)據(jù)庫(kù),新建名為nglcdr 的表,根據(jù)提取的各列數(shù)據(jù)創(chuàng)建列表,數(shù)據(jù)庫(kù)設(shè)計(jì)如圖2 所示。ID 為話單索引,是該表的主鍵;Callingtypes 為呼叫類別,可以根據(jù)此呼叫類別生產(chǎn)餅圖;Callinghours 表示通話產(chǎn)生的時(shí)間段,為0~23 之間,用于柱狀圖顯示;Calledusernums 代表被叫用戶號(hào)碼;Callingusertypes 代表主叫用戶類別;Callingdates 代表通話結(jié)束日期;Outgoingroutes 代表出局局向/ 路由號(hào);Callinglengths 代表通話時(shí)長(zhǎng);Callingtimes 代表通話結(jié)束時(shí)間;Callingusernums 代表主叫用戶號(hào)碼。
圖2 話務(wù)統(tǒng)計(jì)數(shù)據(jù)庫(kù)設(shè)計(jì)圖
將分揀后的數(shù)據(jù)逐項(xiàng)保存至數(shù)據(jù)庫(kù)中,代碼如下:
# 將數(shù)據(jù)寫入本機(jī)數(shù)據(jù)庫(kù)
db = pymysql.connect(host='127.0.0.1', user='root',passwd=password, db='nglcdr', port=3306, harset='utf8')
cursor = db.cursor()
for i in range(length):
sql = """INSERT IGNORE INTO nglcdr(callingtypes,calledusernums,callingusertypes,callingdates,outgoingroutes,callinglengths,callinghours,callingtimes,callingusernums)
VALUES ('""" + callingtypes [i] + "','" +calledusernums[i] + "','"
+ callingusertypes[i] + "','" + callingdates[i] + "','" + outgoingroutes[i] + "','"
+ callinglengths[i] + "','" + callinghours[i] + "','"+ callingtimes[i] + "','" + callingusernums[i]+"')"
cursor.execute(sql)
通過執(zhí)行以上程序,一天的話單記錄就可以完整保存至數(shù)據(jù)庫(kù)中了,進(jìn)而可以對(duì)數(shù)據(jù)進(jìn)行使用。如可以根據(jù)需要定制各類型的查詢,也可以與本局其它交換機(jī)的話單文件合并分析,或?qū)?shù)據(jù)庫(kù)開放給上級(jí)局,為全網(wǎng)話務(wù)統(tǒng)計(jì)提供數(shù)據(jù)支持。
最后,將獲取到的主叫號(hào)碼、被叫號(hào)碼、呼叫類別、呼叫日期等各項(xiàng)數(shù)據(jù)寫入Excel 文檔,Excel 文件保存在同一文件夾的output 子目錄中。代碼如下:
result = {' 呼叫類別':callingtypes ,' 被叫號(hào)碼':calledusernums,' 主叫號(hào)碼類型': callingusertypes,
' 呼叫日期': callingdates, ' 通話路由':outgoingroutes,' 通話時(shí)長(zhǎng)':callinglengths,' 呼叫時(shí)':callinghours,
' 呼叫時(shí)間 ':callingtimes,' 主叫號(hào)碼 ':callingusernums}
results = pandas.DataFrame(result)
results.to_excel(DIROUTPUT+file[- 12:- 4]+'.xls')
通過在主函數(shù)中批量讀取交換機(jī)服務(wù)器指定文件夾中所有的CDR 文件,逐條分揀后批量寫入output 子目錄中,就可以得到所有話單記錄的Excel文件,為可視化分析提供數(shù)據(jù)源。
將所有話單記錄保存至Excel 文件后,使用pyecharts 庫(kù)進(jìn)行分析,pyecharts 是一個(gè)用于生成Echarts 圖表的類庫(kù),是一款將Python 與Echarts 結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具,該庫(kù)提供柱狀圖、餅圖、地圖等各種圖表。這里采用柱狀圖分析話單產(chǎn)生時(shí)間,采用餅圖分析呼叫類別、運(yùn)行代碼,生成的話單產(chǎn)生時(shí)間柱狀圖、呼叫類型餅狀圖分別如圖3、圖4 所示[5]。
話單產(chǎn)生時(shí)間柱狀圖橫軸為話單產(chǎn)生的時(shí)間,以每小時(shí)為統(tǒng)計(jì)單位,縱軸為該小時(shí)內(nèi)話單總數(shù)。餅狀圖則可以很明確地看出每種類型話單所占的比重。
圖3 話單產(chǎn)生時(shí)間柱狀圖
圖4 呼叫類型餅狀圖
由上圖可以看出,凌晨4~5 點(diǎn)是每日話務(wù)量最低谷,話務(wù)量高峰出現(xiàn)在每日11 點(diǎn)至12 點(diǎn)之間,本局的呼叫類型中,長(zhǎng)市匯接占據(jù)了一大半,維護(hù)人員可以根據(jù)此結(jié)果分析此長(zhǎng)市匯接話務(wù)的具體路由,合理規(guī)劃交換機(jī)資源分配,對(duì)路由加以優(yōu)化,減少呼損[6]。
本文從交換機(jī)的話單記錄入手分析,通過生成一系列圖表,將話務(wù)統(tǒng)計(jì)的內(nèi)容可視化表達(dá),使維護(hù)人員可以總體把握交換機(jī)話務(wù)的實(shí)際情況,對(duì)交換機(jī)的資源進(jìn)一步優(yōu)化,提高交換機(jī)的接通率。