電信主機計費系統_數據采集子模塊


需求分析

1.按照軟件工程的要求,復述用戶的需求,得到用戶的認可。

2.用戶化需求和專業化需求。

3.需求規格說明書的主要內容
1)用例:系統中的角色。
2)事件流:系統中的角色如何協作完成具體的功能。
3)異常流:對各種意外情況的處理。
4)前置條件:事件流和異常流中每個具體環節的依賴條件。
5)后置條件:事件流和異常流中每個具體環節的輸出結果。

名詞解釋

DMS:數據挖掘系統(Data Mining System)

用戶:需要使用Unix實驗室出租業務的客戶,用戶通過電信公司提供的帳號和密碼登錄指定的Unix機器,並使用Unix服務。

終端機器:用戶通過一台本地終端機器來訪問我們的Unix機器,並使用Unix服務,該本地終端就是我們所說的終端機器。在我們的程序中要記錄這一終端的IP,做為向用戶收費的依據之一。

登錄日志文件:在Unix機器中自動記錄用戶登入/登出日志的文件,該文件為:/var/adm/wtmpx;在我們的程序中該文件也可以是程序外部指定的另一個文件。我們的程序需要提取該文件的數據來匹配出用戶登入/登出的記錄,並將其作為將來的收費依據。

用戶登入記錄:在登錄日志文件中記錄的用戶登入Unix系統的日志記錄,該日志記錄包含用戶的登錄名,用戶登入Unix的時刻,登錄的終端機器IP等信息。

用戶登出記錄:在登錄日志文件中記錄的用戶登出Unix系統的日志記錄,該日志記錄包含用戶的登錄名,用戶登出Unix的時刻,登錄的終端機器IP等信息。我們需要將用戶的登入記錄和登出記錄匹配起來,得到一條條完整的登錄信息,並計算出用戶本次登錄的時長。
用戶的登錄記錄:將用戶的登入記錄和登出記錄按照對應關系匹配起來,形成一條完整的登錄記錄,登錄記錄中包含以下信息:用戶登錄名,登入時刻,登出時刻,登錄時長,登錄終端機器IP等。

匹配的登入/登出記錄:等同於用戶的登錄記錄。

未匹配的登入記錄:在登錄日志文件中理論上一條登入記錄跟一條登出記錄匹配,但有可能在我們采集數據時用戶還沒有登出,所以日志文件中可能出現沒有登出記錄與之匹配的登入記錄,這些登入記錄我們將其保存在一個指定的文件中,在下次采集時再讀取。

項目背景

在電信的業務中,有一種Unix實驗室出租業務。只要用戶向電信運營商申請一個Unix帳號,就可以遠程登錄Unix實驗室,並使用Unix系統。
用戶使用電信運營商提供的Unix實驗室的服務需要繳納一定的費用,電信運營商需要一套數據采集系統,把用戶登錄實驗室的時間長度數據采集起來,便於在指定的時間范圍內作為對用戶的收費依據。
要求數據采集系統必須采集如下信息:登錄用戶名,登錄的時間,登出的時間,登錄總的在線時間,登錄的實驗室IP,用戶的終端IP等信息。
DMS3.0項目需要開發這樣一個通用的數據采集系統程序,來采集Unix機器記錄的用戶登入和登出的原始記錄,並將這些記錄解析匹配成用戶的登錄記錄,然后發送給數據采集服務器,在服務器端將這些數據以日期為單位保存在數據庫中,然后整合這些數據形成日報表,月報表和年報表。
這里寫圖片描述

業務原理

任何用戶登錄Unix系統,Unix系統都會記錄用戶的登錄信息,所有用戶登入/登出的信息都保存在Unix的系統日志文件中。數據采集系統就是通過讀取Unix系統日志文件中用戶登入/登出信息,並找出成對的登入/登出記錄,得到用戶登錄實驗室的登入時刻、登出時刻、登錄時間長度等電信用戶收費需要使用的數據,最后把匹配處理好的數據保存成電信工作人員可以閱讀的文本文件,做為電信收費依據。
用戶登錄Unix系統的日志記錄文件在Unix的/var/adm目錄下,文件名是wtmpx,日志記錄文件是一個二進制文件,在Unix中可以使用last指令查看,last命令格式為:
last [-a] [-n number | -number] [-f filename] [name | tty]
wtmpx文件中一條登錄記錄包含372字節,每條記錄包含的數據項格式說明如下表1-1所示: (其中黃色背景標識的數據項就是要采集的數據項)

這里寫圖片描述

登錄記錄總數計算公式為:登錄記錄總數=日志文件大小/372。

這里寫圖片描述

匹配后的數據記錄
這里寫圖片描述

功能概述

DMS3.0系統主要實現以下核心功能:數據讀取,數據匹配,數據發送,數據接收,數據存儲,數據整合。

這里寫圖片描述

1. 數據讀取

該功能模塊的主要任務是讀取Unix機器的用戶登錄記錄文件,將文件的信息解析為程序對象,以方便匹配模塊的匹配。

2. 數據匹配

該模塊的主要任務是將數據讀取模塊讀取到的數據按照登入/登出的關系匹配成一條完整的登錄記錄。

3. 數據發送

該模塊的主要任務是建立客戶端網絡連接,將匹配好的用戶登錄記錄以字符串的形式發送到服務器。

4. 數據接收

該模塊的主要任務是建立服務器端網絡連接,從客戶端讀取匹配好的用戶登錄記錄字符串。

5. 數據存儲

該模塊的主要任務是將數據接收模塊接收到的數據保存到指定的數據庫表中。

6. 數據整合

該模塊的主要任務是將數據庫中保存的用戶登錄記錄明細表的數據整合成日報表,月報表和年報表。

系統用例

0.術語概念

1)用例:系統中的角色。
2)事件流:系統中的角色如何協作完成具體的功能。
3)異常流:對各種意外情況的處理。
4)前置條件:事件流和異常流中每個具體環節的依賴條件。
5)后置條件:事件流和異常流中每個具體環節的輸出結果。

1.用例圖

這里寫圖片描述
【DMS3.0系統用例圖】

2.用例描述

數據采集

功能簡述 :DMS管理員運行DMS程序,完成數據采集的功能

前置條件 : DMS程序已正確安裝並部署

基本流 :

  1. DMS管理員啟動DMS服務端程序
  2. DMS管理員啟動DMS客戶端程序
  3. DMS客戶端程序讀取上次未匹配的登入記錄
  4. DMS客戶端程序讀取用戶登錄數據文件
  5. DMS客戶端程序得到用戶登入/登出記錄列表
  6. DMS客戶端程序將用戶的登入和登出記錄按照對應關系匹配成完整的登錄記錄
  7. DMS客戶端程序將不能成功匹配的登入記錄寫到文件中保存
  8. DMS客戶端程序將匹配好的登錄記錄發送到數據采集服務端
  9. DMS服務端程序接收采集的數據
  10. DMS服務端程序將數據寫到服務端文件中保存下來

分支與異常

第1步,若啟動服務端程序失敗,則報告異常。
第2步,若啟動客戶端程序失敗,則報告異常。
第3步,若上次未匹配的登入記錄文件不存在,則跳過到第3步。
第4步,若讀取用戶登錄數據文件失敗,則報告異常。
第7步,若指定的寫出目錄不存在,則創建目錄。
第7步,若創建目錄或寫文件失敗,則報告異常。
第8步,若發送數據失敗,則定時重傳。
第10步,若寫入文件失敗,則報告異常。

數據讀取
功能簡述:
DMS程序讀取系統數據文件和上次未匹配的登入記錄,形成用戶登錄記錄列表。

前置條件
DMS客戶端程序啟動

基本流
1. 根據系統配置信息確定上次未匹配的登入記錄文件的位置。
2. 讀取上次未匹配的登入記錄,形成用戶登錄記錄列表。
3. 根據系統配置信息確定用戶登錄數據文件的位置。
4. 讀取數據文件,將文件內容解析成用戶登錄記錄。
5. 將上一步中解析得到的用戶登錄記錄添加到列表中。
6. 返回用戶登錄記錄列表。

分支與異常
第2步,若上次未匹配的登入記錄文件不存在,則跳過到第3步。
第4步,若用戶登錄數據文件不存在,則報告異常。

讀取上次未匹配的登入記錄
功能簡述
DMS程序讀取上次未匹配的登入記錄,形成用戶登錄記錄列表。

前置條件
DMS客戶端程序啟動

基本流
1. 根據系統配置信息確定上次未匹配的登入記錄文件的位置。
2. 讀取文件內容,將數據解析成用戶登入記錄。
3. 創建內存列表,保存讀取到的登入記錄數據。
4. 清空未匹配的登入記錄文件。

分支與異常
第2步,若上次未匹配的登入記錄文件不存在,則結束此用例。
第2步,若讀取文件失敗,則報告異常。
第4步,若清空文件失敗,則報告異常。

讀取用戶登錄數據文件

功能簡述
DMS程序讀取用戶登錄數據文件,形成用戶登錄記錄列表。

前置條件
DMS客戶端程序啟動

基本流
1. 根據系統配置信息確定數據文件位置。
2. 備份數據文件,並刪除原始數據文件。
3. 根據系統配置信息確定上次未匹配的登入記錄文件的位置。
4. 讀取上次未匹配的登入記錄,形成用戶登錄記錄列表。
5. 讀取數據文件,將文件內容解析成用戶登錄記錄。
6. 將上一步中解析得到的用戶登錄記錄添加到列表中。
7. 返回用戶登錄記錄列表。

分支與異常
第2步,若找不到數據文件,則報告異常。
第2步,若備份數據失敗,則報告異常。
第3步,若上次未匹配的登入記錄文件不存在,則跳過到第4步。
第4步,若讀取備份數據文件失敗,則報告異常。
第6步,若指定的寫出目錄不存在,則創建目錄。
第6步,若創建目錄或寫文件失敗,則報告異常。
第7步,若指定的寫出目錄不存在,則創建目錄。
第7步,若創建目錄或寫文件失敗,則報告異常。

數據匹配

功能簡述
DMS程序讀取用戶登入/登出記錄列表,按照登入/登出的對應關系匹配成完整的用戶登錄記錄,並將本次未匹配的登入記錄寫到指定文件。
前置條件
已經獲得用戶登入/登出記錄列表
基本流
1. 訪問用戶登入/登出記錄列表,按照登入/登出的對應關系匹配登錄記錄。
2. 將未匹配的登入記錄寫到文件中。

匹配登錄記錄
功能簡述
將用戶登入/登出記錄按照對應關系匹配成用戶登錄記錄,以便計算用戶登錄時長。
前置條件
已經獲得用戶登入/登出記錄列表
基本流
1. 定義兩個列表分別用來保存登入記錄和登出記錄。
2. 循環訪問用戶登入/登出記錄列表,將登入記錄和登出記錄分檢出來,分別存入登入記錄列表和登出記錄列表。
3. 循環訪問登出記錄列表,每找到一條登出記錄后循環訪問登入記錄列表,找到與之對應的登入記錄,將兩條對應的記錄組合成用戶登錄記錄,並將這兩條記錄從列表中刪除。
4. 循環直至所有的登出記錄都處理完成。

* 保存未匹配的登入記錄*

功能簡述
將匹配之后剩余的登入記錄數據保存到文件中,以便下次匹配。

前置條件
匹配登錄記錄完成

基本流
1. 將匹配完成后,登入記錄列表中剩余的記錄寫到文件中保存。

分支與異常
第1步,若找不到指定文件,則創建。
第1步,若創建文件失敗,則報告異常。

數據發送

功能簡述
采集系統客戶端將匹配好的數據通過網絡發送給服務器。

前置條件
用戶登錄記錄已經匹配完成

基本流
1. 建立到服務器的網絡連接。
2. 遍歷匹配的用戶登錄記錄集合,拿到一條匹配的用戶登錄數據記錄。
3. 將匹配的用戶登錄數據記錄按照指定格式發送。
4. 循環2-3步,直到所有匹配的登錄記錄處理完成。
5. 關閉網絡連接。

分支與異常
第1步,若網絡連接失敗,則報告異常。
第2步,若寫數據失敗,則報告異常。

數據接收

功能簡述
采集系統服務器接收從客戶端傳送過來的數據。

前置條件
服務器程序啟動,客戶端完成匹配,並已發送數據。

基本流
1. 開啟服務程序。
2. 獲得網絡連接。
3. 開啟新的線程為客戶服務。
4. 獲得輸入流和輸出流。
5. 包裝流對象。
6. 循環從輸入流中讀取字符串,保存在本地列表中。
7. 成功讀取一行字符串后向服務器發送成功傳送標志。
8. 循環5-6步,直到所有字符串接收完成。
9. 關閉流對象,關閉網絡連接,終止線程。

分支與異常
第1步,若開啟服務失敗,則報告異常。
第2步,若獲得網絡連接失敗,則報告異常。
第4步,若獲得流對象失敗,則報告異常。
第6步,若讀取數據失敗,則報告異常。
第7步,若寫出數據失敗,則報告異常。

數據保存

功能簡述
采集系統服務器將接收到的數據保存到數據庫。

前置條件
服務器已經接收到數據。

基本流
1. 建立到數據庫的連接
2. 循環訪問接收到的數據列表
3. 將列表中的記錄插入到用戶登錄記錄明細表中
4. 訪問完成后關閉連接

分支與異常
第1步,若建立數據庫連接失敗,則報告異常。
第3步,若插入記錄失敗,則報告異常。

數據整合

功能簡述
采集系統服務器將用戶登錄記錄明細表的數據整合出日表,月表和年表。

前置條件
用戶登錄記錄明細表存在

基本流
1. 執行SQL語句,將用戶登錄記錄明細表中前一天的記錄按照用戶名和實驗室ip為條件組合,統計出每一天,用戶登錄某一實驗室機器的總時長數據,形成日報表。
2. 執行SQL語句,根據用戶登錄記錄日報表數據整合出用戶登錄記錄月報表。
3. 執行SQL語句,根據用戶登錄記錄月報表數據整合出用戶登錄記錄年報表。

整合出日報表

功能簡述
根據用戶登錄記錄明細整合出用戶登錄記錄日報表

前置條件
已經得到前一天所有用戶登錄記錄明細
一天執行一次

基本流
1. 建立到數據庫的連接。
2. 執行SQL語句,將用戶登錄記錄明細表中前一天的記錄按照用戶名和實驗室ip為條件組合,統計出每一天,用戶登錄某一實驗室機器的總時長數據,形成日報表。
3. 關閉到數據庫的連接

分支與異常
第1步,若建立連接失敗,則報告異常。
第2步,若執行SQL失敗,則報告異常。
第3步,若關閉數據庫連接失敗,則報告異常。

整合出月報表

功能簡述
根據用戶登錄記錄日報表整合出月報表

前置條件
已經得到前一天所有用戶登錄記錄日報表
如二號時已經得到一號所有的數據
一天執行一次

基本流
1. 建立到數據庫的連接。
2. 按用戶登錄名和實驗室IP為條件分組,計算出每個用戶登錄每個實驗室的月登錄時長,將其存入月表中 若是第一次存入對應的月表則插入 不是第一次就是更新操作。
3. 關閉數據庫連接。

分支與異常
第1步,若建立連接失敗,則報告異常。
第2步,若訪問表失敗,則報告異常。
第3步,若關閉連接失敗,則報告異常。

* 整合出年報表*
功能簡述
根據用戶登錄記錄月報表整合出年報表

前置條件
已經得到前一月所有用戶登錄記錄日報表
如二月時已經得到一號所有的數據
一個月執行一次

基本流
1. 建立到數據庫的連接。
2.按用戶登錄名和實驗室IP為條件分組,計算出每個用戶登錄每個實驗室的月登錄時長,將其存入年表中 若是第一次存入對應的年表則插入 不是第一次就是更新操作。
3.關閉數據庫連接。

分支與異常
第1步,若建立連接失敗,則報告異常。
第2步,若訪問表失敗,則報告異常。
第3步,若關閉連接失敗,則報告異常。

概要設計

名詞解釋

物理結構:描述系統各功能模塊與物理設備之間的聯系。

系統模塊:描述系統的功能模塊。

接口設計:設計出系統與用戶,系統與外部,系統各功能模塊之間的依賴關系。

用戶接口:描述系統與用戶交互的依賴關系。

外部接口:描述系統與外部其他系統間的依賴關系。

內部接口:描述系統內部各功能模塊間的依賴關系。

總體設計

業務流程
這個是項目的大體流程圖,還沒涉及到具體的細節。大體的流程如圖所示,先讀取數據即把數據從日志文件中讀取出來,之后把放入內存集合中的數據進行匹配成需要的數據,把匹配好的集合發送到服務端。服務端接收數據,保存數據到數據庫,數據進入數據庫進行整合。
這里寫圖片描述

說明:
1,業務流程中幾個存儲文件的命名規則:
1.1 系統日志文件由外部傳遞給程序,程序需要判定是否存在然后才能采集。
1.2 未匹配登入數據項集合的存儲路徑由外部傳遞給程序,文件名采用logins.dat。
2, 業務規則說明:
2.1日志登入/登出數據項讀取規則
系統日志文件中的數據項有很多,但並不是所有數據項都需要采集的,只有滿足如下條件的數據項才是需要采集的:
a) 登錄名不能以點號(.)開頭,以點號開頭的一般是登錄程序本身的日志數據項,不需要采集。
b) 登錄類型必須是7(登入)或8(登出),登錄類型具體說明見下面列表:這里寫圖片描述
系統模塊

這里寫圖片描述

1, 數據采集模塊:該模塊的主要功能職責是讀取Unix機器上的用戶登錄日志文件的內容,將其轉化為登錄記錄對象,將這些對象存儲在STL集合中並傳給數據匹配合分析模塊來分析。該模塊的輸入數據是Unix機器的日志文件/var/adm/wtmpx,輸出數據是若干個登錄記錄對象(保存在集合中)。
2, 數據匹配和分析模塊:該模塊的主要功能職責是將數據采集模塊采集到的用戶登錄記錄數據按照登錄/登出的關系匹配成一個完整的登錄/登出記錄,並計算出該用戶本次登錄的時長,然后將這些完整的登錄/登出記錄傳送給數據發送模塊。該模塊的輸入數據是原始的登錄記錄對象,輸出數據是匹配好的登錄/登出記錄對象。
3, 數據發送模塊:該模塊的主要功能職責是將匹配好的登錄/登出記錄用網絡傳送的發式發送到采集系統服務器。
4, 數據接收模塊:該模塊的主要功能職責是從網絡中讀取采集客戶端發送來的登錄/登出數據。
5, 數據存儲模塊:該模塊得主要功能職責是將數據接收模塊接收到的數據按照指定的格式寫入數據庫中,保存為用戶登錄記錄明細表。
6, 數據整合模塊:將數據庫中保存的用戶登錄記錄明細表的數據整理成日報表,根據日報表整合出月報表,根據月報表整合出年報表。

接口設計

1. 用戶接口
用戶:執行命令,啟動DMS3.0服務端程序。
系統:服務端系統運行,等待接收數據。

用戶:執行命令,啟動DMS3.0客戶端程序。
系統:客戶端系統運行,采集並發送數據。

用戶:修改客戶端配置文件參數
系統:下次運行時根據新的配置參數來處理數據。

用戶:修改服務端配置文件參數
系統:下次運行時根據新的配置參數來處理數據。

2. 外部接口
系統讀取用戶登錄記錄文件,獲得用戶登錄信息。
系統讀取上次未匹配的登入記錄文件,獲取未匹配的登入記錄數據。
系統將匹配好的數據寫入指定數據庫表中。
系統整合出月報表和年報表。
3. 內部接口
數據讀取模塊與數據匹配模塊間的接口:
輸入:解析好的用戶登入/登出記錄列表。
輸出:無

數據匹配模塊與數據發送模塊間的接口:
輸入:匹配好的用戶登錄記錄列表。
輸出:無

數據發送模塊與數據接收模塊間的接口:
輸入:匹配好的用戶登錄記錄數據項
輸出:接收成功與否的消息

數據接收模塊與數據保存模塊間的接口:
輸入:匹配好的用戶登錄記錄列表
輸出:無

數據保存模塊與數據庫間接口:
輸入:匹配好的用戶登錄記錄列表
輸出:無

數據整合模塊與數據庫間接口:
輸入:用戶登錄記錄明細
輸出:用戶登錄記錄日報表,月報表和年報表

數據結構設計

根據系統需求,設計出如下數據實體:
1, LogRec:登入/登出記錄類,用來表示一條原始的用戶登入/登出記錄。
2, MatchedLogRec:匹配的登錄記錄類,用來表示一條匹配的用戶登錄記錄。
以下分別對這兩個實體類的設計作出說明:

LogRec類圖:
這里寫圖片描述

說明:
這里寫圖片描述

MatchedLogRec類圖:
這里寫圖片描述

說明:
這里寫圖片描述

數據庫設計

這里寫圖片描述

詳細設計

1.數據類圖

服務器端類圖
這里寫圖片描述
1)server類說明
成員變量說明:
這里寫圖片描述
類方法說明:

  • public void initSocket( ) :初始化服務,啟動Socket 的bind listen 和accept
  • public void startService( ) :響應客戶連接請求,開啟線程為客戶服務
    2)DataReciveThread類說明

這里寫圖片描述
成員說明:
threadid 創建線程時使用 標示一個線程對象
方法說明:
run 完成具體的數據接收工作
start 完成線程的創建和啟動線程
reciveData(void *) 創建線程時調用的線程函數
3)DataSaveThread類說明
這里寫圖片描述

成員說明:
threadid 創建線程時使用 標示一個線程對象
logDao 向數據庫中存儲數據的對象
方法說明:
run 完成具體的調用dao的工作
start 完成線程的創建和啟動線程
saveData(void *) 創建線程時調用的線程函數
4)LogDao類說明
這里寫圖片描述
方法說明:
connect 連接數據庫
saveData 存儲數據 根據日志記錄的退出時間放入相應的日志表中
如退出時間是8日 則放入logdetail08日志表中
commitData 提交事務
disconnect 斷開連接
5) UserData類說明
這里寫圖片描述
成員變量說明
這里寫圖片描述

類方法說明

  • public:void push_data(LogData rec) :向緩沖池中加入數據
  • public:LogData pop_data() 從緩沖池中取出數據

客戶端類圖
這里寫圖片描述

1)client類的說明:

這里寫圖片描述
- public void sendLogs()
函數功能:執行數據采集客戶端的完整過程 logReader 負責讀取數據 logSender負責發送數據.

2)LogReader類的說明:
logReader類封裝了日志讀取的所有功能
這里寫圖片描述

成員變量說明
這里寫圖片描述
類函數說明:

  • public List readlogs() :讀取日志文件總調度函數 得到匹配好的集合
    活動圖:
    這里寫圖片描述
  • public: void readFailLogins :讀取上一次沒有匹配的 登入記錄

活動圖:
這里寫圖片描述

  • private:void backup()
    備份日志文件 把變化的文件處理成不變的 把日志文件改名即可,系統會自動生成wtmpx文件
  • public: void readBackupFile()
    讀取備份的日志文件 把讀取到的數據放入對應的屬性中
    這里寫圖片描述
  • public void matchLogRec()
    將用戶登入/登出記錄匹配為完整的登錄記錄 logins
    ,logouts進行匹配存入matches.
    這里寫圖片描述
  • public void saveFailLogins() :將匹配失敗的日志記錄存到文件

3) LogSender類

成員變量說明
這里寫圖片描述

  • public void sendMatches(list*matches):發送匹配日志集合到服務端
    活動圖:
    這里寫圖片描述
  • public void initNetWork() :根據ip和port 以及serverIp建立到服務端的socket連接初始化網絡.
  • public void readSendfailed (list*matches):讀取發送失敗的數據文件
  • public void saveSendfailed (list*matches):存儲發送失敗的數據 以備下次讀取發送

異常類
這里寫圖片描述

1)客戶端異常類說明
這里寫圖片描述


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com