NGL04 型程控交换机的话务统计与分析
2020-10-13姜涛
姜 涛
(91033 部队,山东青岛266000)
话务统计是交换机的一项重要功能,维护人员可以通过分析话务统计中详实的数据,第一时间掌握交换机的运行状态,并根据话务统计中暴露出的问题加以分析并解决,合理运用话务统计是提高设备运行质量的一种重要手段[1]。NGL04 型程控交换机是网内使用比较广泛的一款交换机,该交换机自带一个话务统计工具,但此工具只能对中继部分的参数进行分析,不能对单一用户进行查询,统计条件相对比较固定,不够灵活和直观,不方便交换机维护人员掌握话务实时情况[2]。本文从交换机话务统计文件着手,通过Python 语言编写代码将话务统计文件逐条分拣,存储入MySQL 数据库,写入Excel 文档, 最后通过Pyecharts 插件生成可视化分析图表。
1 话务统计文件的分析
NGL04 型程控交换机的话务统计文件保存在C:NGLDatachargeCDR 文件夹中,每日生成一个以当日日期为文件名的文件[3],该日的话单文件按照时间顺序逐条保存至此文件中,滚动更新,文件命名规则为yyyymmdd.cdr,yyyy 为4 位数,表示年份,mm 为2位数,表示月份,dd 为2 位数,表示日期,所以话单文件的文件名如“20191018.cdr”,要进行话务统计分析必须从每日生成的话单文件着手,按顺序逐条分拣出所有话单,并对每条话单的各个字段进行提取,按照话单文件的定义提取出相关的数据,保存至数据库中。程序整体的功能结构如图1 所示[4]。
图1 程序设计流程图
根据交换机相关文档,CDR 文件是二进制文件,每96 个字节为一条话单记录文件,每条话单记录文件的主要数据包括:
第2 个字节为呼叫类别,常用呼叫类别具体含义如表1 所示,可以根据呼叫类别绘制饼状图,直观分析各个呼叫类别在本局所有呼叫中的比重。
表1 常用呼叫类别定义示意表
第10 个至第21 个字节为被叫用户号码,第22个字节为主叫用户类别,第24 个至第27 个字节为通话结束日期,第28 个字节为出局路由/ 局向号,第29个至第31 个字节为通话时长,第32 个字节为呼叫时长,第33 个至第35 个字节为通话结束时间,第36 个至45 个字节为主叫用户号码。将这些字节中包含的关键数据项逐一提取,就可以详细解析话单文件。
2 话单记录的分拣保存
笔者使用Python 来进行话单文件的分拣,每条话单为96 个字节,根据每日文件的总字节可推算出当日共产生多少条话单,分拣出每条话单后,在每条话单中使用seek 函数逐个提取话单中各个关键数据,并将其保存至列表中,部分字节需要进行10 进制与16 进制的转换。部分代码如下:
# 获取通话结束日期
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 中创建一个名为nglcdr 的数据库,新建名为nglcdr 的表,根据提取的各列数据创建列表,数据库设计如图2 所示。ID 为话单索引,是该表的主键;Callingtypes 为呼叫类别,可以根据此呼叫类别生产饼图;Callinghours 表示通话产生的时间段,为0~23 之间,用于柱状图显示;Calledusernums 代表被叫用户号码;Callingusertypes 代表主叫用户类别;Callingdates 代表通话结束日期;Outgoingroutes 代表出局局向/ 路由号;Callinglengths 代表通话时长;Callingtimes 代表通话结束时间;Callingusernums 代表主叫用户号码。
图2 话务统计数据库设计图
将分拣后的数据逐项保存至数据库中,代码如下:
# 将数据写入本机数据库
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)
通过执行以上程序,一天的话单记录就可以完整保存至数据库中了,进而可以对数据进行使用。如可以根据需要定制各类型的查询,也可以与本局其它交换机的话单文件合并分析,或将数据库开放给上级局,为全网话务统计提供数据支持。
最后,将获取到的主叫号码、被叫号码、呼叫类别、呼叫日期等各项数据写入Excel 文档,Excel 文件保存在同一文件夹的output 子目录中。代码如下:
result = {' 呼叫类别':callingtypes ,' 被叫号码':calledusernums,' 主叫号码类型': callingusertypes,
' 呼叫日期': callingdates, ' 通话路由':outgoingroutes,' 通话时长':callinglengths,' 呼叫时':callinghours,
' 呼叫时间 ':callingtimes,' 主叫号码 ':callingusernums}
results = pandas.DataFrame(result)
results.to_excel(DIROUTPUT+file[- 12:- 4]+'.xls')
通过在主函数中批量读取交换机服务器指定文件夹中所有的CDR 文件,逐条分拣后批量写入output 子目录中,就可以得到所有话单记录的Excel文件,为可视化分析提供数据源。
3 呼叫分析的可视化
将所有话单记录保存至Excel 文件后,使用pyecharts 库进行分析,pyecharts 是一个用于生成Echarts 图表的类库,是一款将Python 与Echarts 结合的强大的数据可视化工具,该库提供柱状图、饼图、地图等各种图表。这里采用柱状图分析话单产生时间,采用饼图分析呼叫类别、运行代码,生成的话单产生时间柱状图、呼叫类型饼状图分别如图3、图4 所示[5]。
话单产生时间柱状图横轴为话单产生的时间,以每小时为统计单位,纵轴为该小时内话单总数。饼状图则可以很明确地看出每种类型话单所占的比重。
图3 话单产生时间柱状图
图4 呼叫类型饼状图
由上图可以看出,凌晨4~5 点是每日话务量最低谷,话务量高峰出现在每日11 点至12 点之间,本局的呼叫类型中,长市汇接占据了一大半,维护人员可以根据此结果分析此长市汇接话务的具体路由,合理规划交换机资源分配,对路由加以优化,减少呼损[6]。
4 结束语
本文从交换机的话单记录入手分析,通过生成一系列图表,将话务统计的内容可视化表达,使维护人员可以总体把握交换机话务的实际情况,对交换机的资源进一步优化,提高交换机的接通率。