1、 摘要本毕业论文所介绍的是数据挖掘技术在电信计费系统中的应用。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、事先不知道的、但又是潜在有用的信息和知识的过程。随着网络的高速发展,一些大型厂商推出了服务器出租这项业务。为了使得出租商快捷、方便以及高效的统计出用户的登录信息及应缴费情况,本论文开发了一个电信计费系统。本系统采用C/S架构,在UNIX环境下以C+为主要的开发语言开发完成。客户端的功能包括定时从服务器日志文件采集用户数据,匹配登入/登出信息,向服务器发送数据;服务端的功能包括接收客户端发送过来的数据,存储数据和整合数据等。关键词:毕业设计;电信计费系统;数
2、据匹配;数据整合 The Application of Data Mining Technology in the Telecom Toll SystemAbstractDescribed in this thesis is the application of data mining technology in the telecommunications billing system. Data mining is implied from a large number of incomplete, noisy, fuzzy, random data in which, not known
3、 in advance, but potentially useful information and knowledge. With the rapid development of the Network, some large companies such as China Telecom launched the server rent business. In order to statistic user login information and charge more fast, conveniently and efficiently, a Telecom toll syst
4、em is developed in this paper. This system is programmed by C+ language with C/S architecture in UNIX operating system. The functions in client port include reading user information from server log file ,matching data and sending data to a server. The functions in sever port include receiving data f
5、rom client, data storage and integrating data. Keywords: Graduation design, the Telecom toll system, Data match, Data integration目 录第1章 绪论11系统背景在电信的业务中,有一种Unix实验室出租业务。只要用户向电信运营商申请一个Unix帐号,就可以远程登录Unix实验室,并使用Unix系统。用户使用电信运营商提供的Unix实验室的服务需要缴纳一定的费用,电信运营商需要一套数据采集系统,把用户登录实验室的时间长度数据采集起来,便于在指定的时间范围内作为对用户的收费
6、依据。要求数据采集系统必须采集如下信息:登录用户名,登录的时间,登出的时间,登录总的在线时间,登录的实验室IP,用户的终端IP等信息。系统需要开发这样一个通用的数据采集系统程序来采集Unix机器记录的用户登入和登出的原始记录,并将这些记录解析匹配成用户的登录记录,然后发送给数据采集服务器,在服务器端将这些数据以日期为单位保存在数据库中,然后整合这些数据形成日报表,月报表和年报表。12系统原理任何用户登录Unix系统,Unix系统都会记录用户的登录信息,所有用户登入/登出的信息都保存在Unix的系统日志文件中。数据采集系统就是通过读取Unix系统日志文件中用户登入/登出信息,并找出成对的登入/登
7、出记录,得到用户登录实验室的登入时刻、登出时刻、登录时间长度等电信用户收费需要使用的数据,最后把匹配处理好的数据保存成电信工作人员可以阅读的文本文件,做为电信收费依据。用户登录Unix系统的日志记录文件在Unix的/var/adm目录下,文件名是wtmpx,日志记录文件是一个二进制文件,在Unix中可以使用last指令查看,last命令格式为:last -a -n number | -number -f filename name | ttywtmpx文件中一条登录记录包含372字节,每条记录包含的数据项格式说明如下表1-1所示: (其中黄色背景标识的数据项就是要采集的数据项) 位置范围字节长
8、度含义000-03132/* 用户登录名 */032-0354/* inittab id */036-06732/* device name (console, lnxx) */068-0714/* 进程ID*/072-0732/* 登录类型7-登入,8登出 */074-0752/* process termination*/076-0772/* exit status*/2/* 这是C数据类型补齐产生的空位*/080-0834/* 登录时刻*/*单位是秒 */084-0874/* and microseconds */088-0914/* session ID, used for windo
9、wing */092-11120/* reserved for future use */112-1132/* significant length of ut_host */114-371257/* 登录IP*/【表1:用户登录记录数据项格式】登录记录总数计算公式为:登录记录总数=日志文件大小/372。数据名数据含义是否需要采集备注说明logname用户登录名是匹配同一次登录会话的必须数据之一pid进程ID匹配同一次登录会话的必须数据之二type登录类型7-登入,8登出Type的值在1-8之间,但只处理7与8两种情况logtime登录时刻*/*单位是秒是要采集的数据,logtime是登入或登
10、出时刻logip登录IP是要采集的数据表1-2:要读取的原始记录数据数据名数据含义备注说明logname用户登录名logintime登入时刻logouttime登出时刻durations登录时间长度logip登录终端的ip地址表1-3:匹配登录记录数据用户的登录信息数据在每一台机器上匹配好后需要发送到服务器来,服务器接收到这些匹配好的数据记录后将其保存在数据库中,形成用户登录记录明细表。然后我们的程序需要定期的整理出日报表,月报表和年报表。在数据库中保存的用户登录记录明细表结构如下:数据名数据含义备注说明logname用户登录名logintime登入时刻logouttime登出时刻durati
11、ons登录时间长度logip登录终端的ip地址labip用户登录的实验室IP整理成日报表后形成如下数据项:数据名数据含义备注说明logname用户登录名logip登录终端的ip地址DAY_TIME日登录时间长度Labip用户登录的实验室IPMonth用户登录月份整理成月报表后形成如下数据项:数据名数据含义备注说明logname用户登录名Logip登录终端的ip地址MONTH_TIME月登录时间长度Labip用户登录的实验室IPYear用户登录年份整理成年报表后形成如下数据项:数据名数据含义备注说明Logname用户登录名Logip登录终端的ip地址YEAR_TIME年登录时间长度Labip用户
12、登录的实验室IP第2章 需求分析2.1 功能概述系统主要实现以下核心功能:数据读取,数据匹配,数据发送,数据接收,数据存储,数据整合。2.1.1 数据读取该功能模块的主要任务是读取Unix机器的用户登录记录文件,将文件的信息解析为程序对象,以方便匹配模块的匹配。2.1.2 数据匹配该模块的主要任务是将数据读取模块读取到的数据按照登入/登出的关系匹配成一条完整的登录记录。2.1.3 数据发送该模块的主要任务是建立客户端网络连接,将匹配好的用户登录记录以字符串的形式发送到服务器。2.1.4 数据接受该模块的主要任务是建立服务器端网络连接,从客户端读取匹配好的用户登录记录字符串。2.1.5 数据存储
13、该模块的主要任务是将数据接收模块接收到的数据保存到指定的数据库表中。2.1.6 数据整合该模块的主要任务是将数据库中保存的用户登录记录明细表的数据整合成日报表,月报表和年报表。2.2 系统描述2.2.1 数据采集用例名称数据采集功能简述管理员运行程序,完成数据采集的功能前置条件程序已正确安装并部署基本流1. 管理员启动服务端程序2. 管理员启动客户端程序3. 客户端程序读取上次未匹配的登入记录4. 客户端程序读取用户登录数据文件5. 客户端程序得到用户登入/登出记录列表6. 客户端程序将用户的登入和登出记录按照对应关系匹配成完整的登录记录7. 客户端程序将不能成功匹配的登入记录写到文件中保存8
14、. 客户端程序将匹配好的登录记录发送到数据采集服务端9. 服务端程序接收采集的数据10. 服务端程序将数据写到服务端文件中保存下来分支与异常第1步,若启动服务端程序失败,则报告异常。第2步,若启动客户端程序失败,则报告异常。第3步,若上次未匹配的登入记录文件不存在,则跳过到第3步。第4步,若读取用户登录数据文件失败,则报告异常。第7步,若指定的写出目录不存在,则创建目录。第7步,若创建目录或写文件失败,则报告异常。第8步,若发送数据失败,则定时重传。第10步,若写入文件失败,则报告异常。后置条件无备注无2.2.2 数据读取用例名称数据读取功能简述程序读取系统数据文件和上次未匹配的登入记录,形成
15、用户登录记录列表。前置条件客户端程序启动基本流1. 根据系统配置信息确定上次未匹配的登入记录文件的位置。2. 读取上次未匹配的登入记录,形成用户登录记录列表。3. 根据系统配置信息确定用户登录数据文件的位置。4. 读取数据文件,将文件内容解析成用户登录记录。5. 将上一步中解析得到的用户登录记录添加到列表中。6. 返回用户登录记录列表。分支与异常第2步,若上次未匹配的登入记录文件不存在,则跳过到第3步。第4步,若用户登录数据文件不存在,则报告异常。后置条件无备注无2.2.3 读取上次未匹配的登入记录用例名称读取上次未匹配的登入记录功能简述程序读取上次未匹配的登入记录,形成用户登录记录列表。前置
16、条件客户端程序启动基本流1. 根据系统配置信息确定上次未匹配的登入记录文件的位置。2. 读取文件内容,将数据解析成用户登入记录。3. 创建内存列表,保存读取到的登入记录数据。4. 清空未匹配的登入记录文件。分支与异常第2步,若上次未匹配的登入记录文件不存在,则结束此用例。第2步,若读取文件失败,则报告异常。第4步,若清空文件失败,则报告异常。后置条件无备注无2.2.4 读取用户登录数据文件用例名称读取用户登录数据文件功能简述程序读取用户登录数据文件,形成用户登录记录列表。前置条件客户端程序启动基本流1. 根据系统配置信息确定数据文件位置。2. 备份数据文件,并删除原始数据文件。3. 根据系统配
17、置信息确定上次未匹配的登入记录文件的位置。4. 读取上次未匹配的登入记录,形成用户登录记录列表。5. 读取数据文件,将文件内容解析成用户登录记录。6. 将上一步中解析得到的用户登录记录添加到列表中。7. 返回用户登录记录列表。分支与异常第2步,若找不到数据文件,则报告异常。第2步,若备份数据失败,则报告异常。第3步,若上次未匹配的登入记录文件不存在,则跳过到第4步。第4步,若读取备份数据文件失败,则报告异常。第6步,若指定的写出目录不存在,则创建目录。第6步,若创建目录或写文件失败,则报告异常。第7步,若指定的写出目录不存在,则创建目录。第7步,若创建目录或写文件失败,则报告异常。后置条件无备
18、注无2.2.5 数据匹配用例名称数据匹配功能简述程序读取用户登入/登出记录列表,按照登入/登出的对应关系匹配成完整的用户登录记录,并将本次未匹配的登入记录写到指定文件。前置条件已经获得用户登入/登出记录列表基本流1. 访问用户登入/登出记录列表,按照登入/登出的对应关系匹配登录记录。2. 将未匹配的登入记录写到文件中。分支与异常后置条件无备注无2.2.6 匹配登录记录用例名称匹配登录记录功能简述将用户登入/登出记录按照对应关系匹配成用户登录记录,以便计算用户登录时长。前置条件已经获得用户登入/登出记录列表基本流1. 定义两个列表分别用来保存登入记录和登出记录。2. 循环访问用户登入/登出记录列
19、表,将登入记录和登出记录分检出来,分别存入登入记录列表和登出记录列表。3. 循环访问登出记录列表,每找到一条登出记录后循环访问登入记录列表,找到与之对应的登入记录,将两条对应的记录组合成用户登录记录,并将这两条记录从列表中删除。4. 循环直至所有的登出记录都处理完成。分支与异常后置条件无备注无2.2.7 保存未匹配的登入记录用例名称保存未匹配的登入记录功能简述将匹配之后剩余的登入记录数据保存到文件中,以便下次匹配。前置条件匹配登录记录完成基本流1. 将匹配完成后,登入记录列表中剩余的记录写到文件中保存。分支与异常第1步,若找不到指定文件,则创建。第1步,若创建文件失败,则报告异常。后置条件无备
20、注无2.2.8 数据发送用例名称数据发送功能简述采集系统客户端将匹配好的数据通过网络发送给服务器。前置条件用户登录记录已经匹配完成基本流1. 建立到服务器的网络连接。2. 遍历匹配的用户登录记录集合,拿到一条匹配的用户登录数据记录。3. 将匹配的用户登录数据记录按照指定格式发送。4. 循环2-3步,直到所有匹配的登录记录处理完成。5. 关闭网络连接。分支与异常第1步,若网络连接失败,则报告异常。第2步,若写数据失败,则报告异常。后置条件无备注无2.2.9 数据接收用例名称数据接收功能简述采集系统服务器接收从客户端传送过来的数据。前置条件服务器程序启动,客户端完成匹配,并已发送数据。基本流1.
21、开启服务程序。2. 获得网络连接。3. 开启新的线程为客户服务。4. 获得输入流和输出流。5. 包装流对象。6. 循环从输入流中读取字符串,保存在本地列表中。7. 成功读取一行字符串后向服务器发送成功传送标志。8. 循环5-6步,直到所有字符串接收完成。9. 关闭流对象,关闭网络连接,终止线程。分支与异常第1步,若开启服务失败,则报告异常。第2步,若获得网络连接失败,则报告异常。第4步,若获得流对象失败,则报告异常。第6步,若读取数据失败,则报告异常。第7步,若写出数据失败,则报告异常。后置条件无备注无第3章 系统概要设计3.1 总体设计3.1.1 业务设计这个是项目的大体流程图,还没涉及到具
22、体的细节。大体的流程如图所示,先读取数据即把数据从日志文件中读取出来,之后把放入内存集合中的数据进行匹配成需要的数据,把匹配好的集合发送到服务端。说明:1) 业务流程中几个存储文件的命名规则:1系统日志文件由外部传递给程序,程序需要判定是否存在然后才能采集。2 未匹配登入数据项集合的存储路径由外部传递给程序,文件名采用logins.dat。2) 日志登入/登出数据项读取规则1 系统日志文件中的数据项有很多,但并不是所有数据项都需要采集的只有满足如下条件的数据项才是需要采集的:2 登录名不能以点号(.)开头,以点号开头的一般是登录程序本身的日志数据项,不需要采集。3 登录类型必须是7(登入)或8
23、(登出),登录类型具体说明见下面列表:登录Type值登录type值说明C定义的宏0#define EMPTY1#define RUN_LVL2#define BOOT_TIME3#define OLD_TIME4#define NEW_TIME5-初始化进程#define INIT_PROCESS6-登录进程#define LOGIN_PROCESS7-用户进程(登入)#define USER_PROCESS8-终止进程(登出)#define DEAD_PROCESS表2-1:登录类型定义3.1.2 系统模块物理上系统分为采集客户端(被采集机器)和采集服务器两部分,在采集客户端包含数据采集模块
24、,数据匹配分析模块和数据发送模块;在采集服务器端包含数据接收模块,数据存储模块和数据显示模块,各模块的主要功能和职责如下:1, 数据采集模块:该模块的主要功能职责是读取Unix机器上的用户登录日志文件的内容,将其转化为登录记录对象,将这些对象存储在STL集合中并传给数据匹配合分析模块来分析。该模块的输入数据是Unix机器的日志文件/var/adm/wtmpx,输出数据是若干个登录记录对象(保存在集合中)。2, 数据匹配和分析模块:该模块的主要功能职责是将数据采集模块采集到的用户登录记录数据按照登录/登出的关系匹配成一个完整的登录/登出记录,并计算出该用户本次登录的时长,然后将这些完整的登录/登
25、出记录传送给数据发送模块。该模块的输入数据是原始的登录记录对象,输出数据是匹配好的登录/登出记录对象。3, 数据发送模块:该模块的主要功能职责是将匹配好的登录/登出记录用网络传送的发式发送到采集系统服务器。4, 数据接收模块:该模块的主要功能职责是从网络中读取采集客户端发送来的登录/登出数据。5, 数据存储模块:该模块得主要功能职责是将数据接收模块接收到的数据按照指定的格式写入数据库中,保存为用户登录记录明细表。6, 数据整合模块:将数据库中保存的用户登录记录明细表的数据整理成日报表,根据日报表整合出月报表,根据月报表整合出年报表。3.2 接口设计3.2.1 外部接口系统读取用户登录记录文件,
26、获得用户登录信息。系统读取上次未匹配的登入记录文件,获取未匹配的登入记录数据。系统将匹配好的数据写入指定数据库表中。系统整合出月报表和年报表。3.2.2 内部接口数据读取模块与数据匹配模块间的接口:输入:解析好的用户登入/登出记录列表。输出:无数据匹配模块与数据发送模块间的接口:输入:匹配好的用户登录记录列表。输出:无数据发送模块与数据接收模块间的接口:输入:匹配好的用户登录记录数据项输出:接收成功与否的消息数据接收模块与数据保存模块间的接口:输入:匹配好的用户登录记录列表输出:无数据保存模块与数据库间接口:输入:匹配好的用户登录记录列表输出:无数据整合模块与数据库间接口:输入:用户登录记录明
27、细输出:用户登录记录日报表,月报表和年报表3.2.3 数据结构设计根据系统需求,设计出如下数据实体:1, LogRec:登入/登出记录类,用来表示一条原始的用户登入/登出记录。2, MatchedLogRec:匹配的登录记录类,用来表示一条匹配的用户登录记录。以下分别对这两个实体类的设计作出说明:登入/登出记录数据类LogRec类图:LogRec类成员变量说明:成员变量定义成员变量说明备注char logname32用户登录名int pid用户登录的进程IDshort type登录记录类型7=登入;8=登出int logtime用户登入/登出时刻(秒)原日志中数据单位是秒char logip2
28、57用户登录IP第4章 系统详细设计4.1 系统架构综述系统由以下几个功能模块组成:数据读取模块,数据匹配模块,数据发送模块,数据接收模块,数据保存模块和数据整合模块,每个模块的核心功能如下:数据读取模块:负责从用户登录记录文件和未匹配登录记录文件中读取用户的登录记录数据,将其转化为LogRec对象,然后传递给数据匹配模块匹配。数据匹配模块:负责将用户登录记录数据,按照登入/登出的关系匹配起来,形成匹配的用户登录记录数据(MatchedLogRec对象),并计算出每次登录的时间长度。数据发送模块:将匹配好的用户登录记录通过网络发送到采集系统服务器。数据接收模块:服务器端接收匹配好的用户登录记录
29、数据。数据保存模块:将接受到的用户登录记录数据保存到数据库的用户登录记录明细表中。数据整合模块:将用户登录记录明细表中的数据整合成日报表,月报表和年报表。4.2 静态结构设计4.2.1 数据实体类根据需求分析,我们设计出以下数据实体类:LogRec:登入/登出记录类,用来表示一条原始的用户登入/登出记录。MatchedLogRec:匹配的登录记录类,用来表示一条匹配的用户登录记录。以下分别对这两个实体类的设计作出说明:4.2.2 登入/登出记录数据类登入/登出记录类(LogRec)类图:4.2.3 登入/登出记录类(LogRec)成员变量说明成员变量定义成员变量说明备注char logname
30、32用户登录名int pid用户登录的进程IDshort type登录记录类型7=登入;8=登出int logtime用户登入/登出时刻(秒)原日志中数据单位是秒char logip257用户登录IP4.3 总体类图【客户端类图】【服务端类图】4.3.1 Client 类Client类封装数据采集系统客户端的所有功能。Client类定义 Client类方法说明1)sendLogs方法定义:方法原型public void sendLogs()方法功能执行数据采集客户端的完整过程 logReader 负责读取数据 logSender负责发送数据参数说明无返回类型void抛出异常调用类的异常-Log
31、Reader类定义LogReader成员变量说明成员变量定义成员变量说明char logFileName50用户登录日志文件名char backFileName50日志备份文件名 char failLoginsFileName50未匹配成功的登录记录保存文件名logins list保存登录记录的集合logouts list保存登出记录的集合matches list保存匹配成功记录的集合LogReader类方法说明readLogs方法:方法原型public List readlogs() 方法功能读取日志文件总调度函数 得到匹配好的集合 参数说明无返回类型List抛出异常调用函数中可能抛出的异常
32、readLogs方法活动图:backup方法:方法原型private:void backup() 方法功能备份日志文件 把变化的文件处理成不变的 把日志文件改名即可,系统会自动生成wtmpx文件参数说明无返回类型void抛出异常读取数据失败抛出BackupException readFailLogins方法:方法原型public: void readFailLogins 方法功能读取上一次没有匹配的 登入记录参数说明无返回类型void抛出异常读取数据失败抛出ReadFailLoginExceptionreadFailLogins方法活动图:readBackupFile方法:方法原型public
33、: void readBackupFile方法功能读取备份的日志文件 把读取到的数据放入对应的属性中参数说明无返回类型Void抛出异常读取数据失败抛出ReadBackFileException matchLogRec方法:方法原型public void matchLogRec() 方法功能将用户登入/登出记录匹配为完整的登录记录 logins ,logouts进行匹配存入matches参数说明无返回类型void抛出异常匹配数据失败抛出MatchLogRecExceptionmatchLogRec方法活动图: saveFailLogins方法:方法原型public void saveFailLo
34、gins() 方法功能将匹配失败的日志记录存到文件参数说明无返回类型无抛出异常匹配数据失败抛出SaveFailLoginsException LogSender类 LogSender类定义LogSender类成员变量说明成员变量定义成员变量说明char failSendFileName50发送失败记录的保存文件名int fd采集系统服务器网络描述符unsigned short port服务器的端口char serverIp20要连接的服务器ipLogSender类方法说明1)sendMatches方法:方法原型public void sendMatches(list*matches) 方法功能
35、发送匹配日志集合到服务端参数说明matches 存储发送数据的集合返回类型Void抛出异常建立连接失败抛出SendDataExceptionsendMatches方法活动图: 2)initSocket方法:方法原型public void initNetWork() 方法功能根据ip和port 以及serverIp建立到服务端的socket连接初始化网络参数说明无返回类型void抛出异常建立连接失败抛出SendDataException3)readSendfailed方法:方法原型public void readSendfailed (list*matches) 方法功能读取发送失败的数据文件参
36、数说明matches: 匹配的用户日志记录列表指针返回类型void抛出异常发送数据失败抛出SendDataException4)saveSendfailed方法:方法原型public void saveSendfailed (list*matches) 方法功能存储发送失败的数据 以备下次读取发送参数说明matches: 匹配的用户日志记录列表指针 存储时 把集合中剩余的数据存储到文件返回类型void抛出异常发送数据失败抛出SendDataException4.3.2 Server类Server类定义Server成员变量说明成员变量定义成员变量说明char labIp20实验室ipInt fd
37、 网络套接字描述符DataReciveThread productor接收数据的线程DataSaveThread customer存储数据的线程UserData dataPool线程共享数据缓冲池Server类方法说明1. initSocket方法 方法原型public void initSocket( ) 方法功能初始化服务,启动Socket 的bind listen 和accept参数说明无返回类型void抛出异常DmsServerException 创建ServerSocket过程中发生的异常2. startService方法 方法原型public void startService(
38、) 方法功能响应客户连接请求,开启线程为客户服务参数说明无返回类型void抛出异常DMSServerException 创建相应客户请求过程中发生的异常 DataReciveThread类说明 成员说明: threadid 创建线程时使用 标示一个线程对象 方法说明: run 完成具体的数据接收工作 start 完成线程的创建和启动线程 reciveData(void *) 创建线程时调用的线程函数DataSaveThread类说明 成员说明: threadid 创建线程时使用 标示一个线程对象 logDao 向数据库中存储数据的对象 方法说明: run 完成具体的调用dao的工作 start
39、 完成线程的创建和启动线程 saveData(void *) 创建线程时调用的线程函数 LogDao类说明 方法说明:connect 连接数据库saveData 存储数据 根据日志记录的退出时间放入相应的日志表中 如退出时间是8日 则放入logdetail08日志表中commitData 提交事务disconnect 断开连接UserData类说明 UserData成员变量说明成员变量定义成员变量说明deque data缓冲客户端的数据池的真正存储容器pthread_mutex_t mutex控制线程安全的互斥量pthread_cont_t con_p控制是否生产的条件量pthread_cont_t con_c控制是否消费的条件量UserData类方法说明push_data方法:方法原型public:void push_data(LogData rec) 方法功能向缓冲池中加入数据参数说明LogData rec是要往数据库表中存储的数据返回类型void抛出异常无pop_data方法:方法原型public:LogData pop_data() 方法功能从缓冲池中取出数据参数说明无返回类型LogData