CHƯƠNG 3: PHÁT TRIỂN MÔ HÌNH GIÁM SÁT MẠNG 3G VÀ
3.3 Phát triển modul giám sát thoại (VoIP) trong hệ thống
3.3.2. Thiết kế giao diện
Hình 3.3: Sơ đồ khối thiết kế ứng dụng 3.3.3 . Xây dựng modul chương trình giám sát
3.3.3.1. Xây dựng các tiểu trình a. Xử lý giao tiếp giữa server và client Xử lý gửi giao tiếp giữa server và client
Server sau khi đƣợc khởi động sẽ thực hiện lắng nghe ở một địa chỉ socket (tại IP của server và ở một cổng xác định, giá trị của cổng này có thể đƣợc cấu hình ở phía server).
Để giao tiếp với server , trước tiên chương trình client sẽ phải thực hiện tạo một kết nối đến địa chỉ socket của server ở trên. Sau khi kết nối thành công, việc giao tiếp giữa client và server sẽ đƣợc thực hiện thông qua việc gửi/nhận những gói tin sử dụng giao thức TCP (Transfer Control Protocol) theo format mà server đã quy định.
Các bước xử lý cơ bản bao gồm:
Khai báo sử dụng những thư viện hỗ trợ:
//Khai báo sử dụng thư viện hỗ trợ
#include "Ws2tcpi.h"
#include "Winock2.h"
Khởi tạo việc sử dụng các thư viện Winsock:
// khơi tạo việc sử dụng các thư viện Winsock int iResult;
WSADATA wsaData;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR){
return 1;
}
- WSAStartup là method bắt buộc phải gọi trước khi có thê thực hiện xử lý kết nối hay xử lý gửi/nhận dữ liệu thông qua socket.
Tạo socket và thực hiện tạo kết nối với server:
// Tao shocket vaf thuc hien ket noi server
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET){
wprintf(L "Có lỗi: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
struct SOCKADDR_IN clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("126.0.0.1");
clientService.sin_port = htons(27015);
iResult = connect(ConnectSocket, (SOCKADDR)&
clientService, sizeof(clientService));
if (iResult == SOCK_ERROR){
wprintf(L "Có lỗi: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
- Socket là method dùng để tạo một socket mới.
- SOCKADDR_IN là cấu trúc dữ liệu dùng để chỉ định địa chỉ của server bao gồm 3 thông tin chính là họ địa chỉ (family), địa chỉ ip và cổng).
- connect là method dùng để tạo kết nối đến server thông qua socket đã tạo.
- WSAGetLastError là method dùng để lấy về thông tin lỗi phát sinh cuối cùng (khi thực hiện các xử lý socket).
- WSACleanup là method cần phải gọi trước khi kết thúc chương trình đế dọn dẹp những tài nguyên đang đƣợc socket sử dụng.
Gửi dữ liệu đến server:
// Gủi dữ liệu đến server
char *sendbuf = "Dữ liệu gủi đi";
iResult = send(ConnectSocket, sendbuf,(int)strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR){
wprintf(L "Có lỗi: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
Printf("Đã gủi thành công: %d byte\n", iResult);
- send là method dùng để gửi dữ liệu đến server thông qua kết nối đã đƣợc thiết lập.
Nhận dữ liệu mà server gửi về client:
// nhận dữ liệu mà server gủi vê client char recvbuf[512]= ""; do{
iResult = recv(ConnectSocket, recvbuf, reccvbuflen, 0);
if (iResult>0)
wprintf(L"Đã nhận được: %d byte\n", iResult);
else
wprintf(L"Đã nhận được: %d\n", WSAGetLastError());
} while(iResult>0);
- recv là method dùng để đọc dữ liệu mà server gửi về client.
Do dữ liệu đƣợc truyền tuần tự qua mạng và theo thời gian nên không thê biết trước được kích thước của dữ liệu, do đó phải thực hiện đọc từng phấn và đưa vào buffer để xử lý.
Tùy thuộc vào đặc điểm của dữ liệu và xử lý của chuông trình mà chọn kích thước buffer phù hợp (ví dụ ở trên lựa chọn kích thước buffer là 512byte).
Giao thức liên lạc giữa client và server
Để có thể thực hiện những giao tiếp phức tạp giữa client và server, thông thường phía server sẽ quy định trước giao thức giao tiếp, phía client sẽ phải tuân thủ đúng giao thức này khi thực hiện kết nối với server.
- Quy định định dạng của các dữ liệu gửi/nhận theo dạng gói có cấu trúc (packet).
- Mỗi gói dữ liệu thường bao gồm phần header và phần nội dung.
- Phần header sẽ cho biết cách thức mà server hoặc client sẽ xử lý đối với phần nội dung ( trong xử lý đăng nhập, phía client sẽ gửi gói tin có phần header cho biết là gói tin đăng nhập, còn phần nội dung lưu thông tin tài khoản và mật khẩu dùng cho đăng nhập).
Ngắt kết nối // ngắt kết nối
iResult = shutdow(ConnectSocket, SD_SEND);
if(iResult == SOCKET_ERROR){
wprintf(L"Có lỗi: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
iResult = closesocket(ConnectSocket);
if(iResult == SOCKET_ERROR){
wprintf(L"Có lỗi: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
WSACleanup();
Thông thường thì server sẽ được chạy liên tục đế đáp ứng yêu cầu của nhiều client, nên phía client thường chủ động kết thúc liên lạc.
Trong đó:
- Shutdown là method dùng để ngắt kết nối khỏi server.
- Closesocket là method dùng để đóng socket đã tạo.
Xử lý đăng nhập
Phía client sẽ thực hiện gửi gói tin yêu cầu đăng nhập với Request type là REQ_LOGIN. Phần nội dung của gói tin lưu 2 thông tin là:
- Name là tài khoản đăng nhập.
- Password là mật khấu đăng nhập.
Phía server thực hiện kiểm tra tính đúng đắn của thông tin đăng nhập, nếu họp lệ thì sẽ gửi trả lại gói tin phản hồi với Data Type là DATAJLOGIN. Phần nội dung của gói tin lưu các thông tin:
- Login token lưu giá trị token được server sinh mới (không trùng lặp). Những gói tin yêu cầu sau đều phải gắn kèm giá trị của token này.
- Permissions là thông tin phân quyền của tài khoản đã đăng nhập
- Timeout là thời gian ngừng liên lạc tối đa đƣợc cấu hình trên server . Nếu trong khoảng thời gian này mà chương trình client không gửi bất kỳ gói tin yêu cầu nào thì server sẽ tự động ngắt kết nối (user login sẽ tự động ngắt khỏi hệ thống và phải login lại nếu muốn tiếp tục sử dụng).
Trường hợp đăng nhập thất bại, server sẽ trả về gói tin phản hồi lỗi (Data Type là DATA_ERROR), Phần nội dung của gói tin lưu các thông tin:
- Error code là mã lỗi đã phát sinh (ERROR_LOGIN)
- Message là chuỗi thông báo lỗi mà server trả về, trong trường họp này là
“Username and password are not matched”.
Xử lý gửi yêu cầu giám sát
Phía client sẽ thực hiện gửi gói tin yêu cầu giám sát với Request type là RE REQ_REGIST_SURVEIL. Tùy vào việc chỉ định loại thông tin giám sát cũng nhu điều kiện giám sát của từng loại thông tin mà phần nội dung có thế chứa một hoặc nhiều thông tin sau:
- Name dùng để chỉ định tên của phiên giám sát.
- Description dùng để lưu những thông tin phụ (như mục đích giám sát, phạm vi giám sát..)
- Http, Email, Webmail, IM, File, VoIP, Flow, AAA là những cò' dùng để chỉ định những đối tƣợng sẽ đƣợc giám sát.
- Các tiêu chí giám sát sẽ đƣợc chỉ định thông qua các nhóm 4 thuộc tính:
o Value dùng đế chỉ định các điều kiện giám sát.
o Type dùng để chỉ định phương thức giám sát.
o Probe dùng để chỉ định điểm giám sát.
o Enabled dùng đế mở hoặc đóng từng tiêu chí giám sát.
- Expire date dùng để chỉ định thời gian giám sát tối đa (nếu quá thời gian này phiên giám sát vẫn đang chạy thì nhí a server sẽ tự động ngừng phiên giám sát).
Phía server sẽ xem xét thông tin yêu cầu nhận đƣợc. Neu là yêu cầu hợp lệ, sẽ thực hiện đăng ký yêu cầu giám sát vào hệ thống và gửi trả gói tin phản hồi kết quả đăng ký (Data type là DATA_REGIST_SURVEIL), bao gồm các thông tin:
- Session id là mã session đã đƣợc đăng ký mới. Những thông tin giám sát đƣợc gửi trả sau này đều gắn kèm mã này đế phân biệt và phân nhóm kết quả.
- Expire date là ngày giờ giám sát tối đa (đƣợc tính toán dựa vào giá trị Expire date trong yêu cầu và thông số cấu hình của hệ thống).
Trường hợp không thể đăng ký theo yêu cầu của client , server sẽ gửi trả lại gói tin phản hồi lỗi.
Xử lý tiếp nhận yêu cầu giám sát
Yêu cầu giám sát hợp lệ sau khi đƣợc đăng ký sẽ đƣợc khởi động ngay lập tức ở phía server. Khi phát hiện đƣợc đối tƣợng giám sát, phía server sẽ chủ động gửi gói tin phản hồi kết quả giám sát. Tùy theo loại thông tin mà Data type có giá trị khác nhau.
Đối với thông tin truy cập Web, Data type có giá trị là DATA_WEB và phần nội dung lưu các thông tin sau:
- Session id là giá trị id của session đã đăng ký từ trước.
- Start Time là thời gian đối tƣợng gửi yêu cầu truy cập web.
- End Time là thời gian đối tƣợng nhận đƣợc nội dung trang web.
- Probe là điếm giám sát đã bắt đƣợc gói tin.
- Request IP và Request Port là địa chỉ socket của đối tƣợng gửi yêu cầu.
- Response IP và Response Port là địa chỉ socket của server đích.
- Server là tên server đích.
- Url là url của trang web đã đƣợc yêu cầu.
- Response code là mã kết quả xử lý (ví dụ 200 là OK, 404 là trang web không tồn tại).
- Origin cho biết gốc ban đầu (trong trường hợp được truyền qua nhiều trung gian).
- Method là phƣong thức đã thực hiện yêu cầu.
- Type là phân loại nội dung phản hồi (thông thường các trang web đều có dạng text/html).
- Encoding cho biết hình thức mã hóa của dữ liệu phản hồi.
- Size là kích thước của trang web phản hồi.
- Source là mã nguồn của trang web phản hồi.
Đối vói file truyền qua mạng, Data type có giá trị là DATA_FILE và phần nội dung lưu các thông tin sau:
- Session id là giá trị id của session đã đăng ký từ trước.
- Start Time là thời gian đối tƣợng gửi yêu cầu truy cập web.
- End. Time là thời gian đối tƣợng nhận đƣợc nội dung trang web.
- Probe là điểm giám sát đâ bất đƣợc gói tin.
- Request IP và Request Port là địa chỉ socket của đối tƣợng gửi yêu cầu.
- Response IP và Response Port là địa chỉ socket của server đích.
- Protocol là giao thức gửi file đã sử dụng (thường là FTP).
- Login và Password là tài khoản mà đối tƣợng sử dụng đế yêu cầu file.
- Filename là tên file đã đƣợc gửi.
- Hashcode là giá trị đã đƣợc tính toán trên nội dung file (có thế sử dụng để kiểm tra nhanh 2 file khác nhau có phải có cùng nội dung hay không).
Đối với các cuộc gọi VoIP, Data type có giá trị là DATA__VOIP và phần nội dung lưu các thông tin sau:
- Session id là giá trị id của session đã đăng ký từ trước.
- Start Time là thời gian đối tƣợng gửi yêu cầu truy cập web.
- End Time là thời gian đối tƣợng nhận đƣợc nội dung trang web.
- Probe là điểm giám sát đã bắt đƣợc gói tin.
- Request IP và Request Port là địa chỉ socket của đối tƣợng gửi yêu cầu.
- Response IP và Response Port là địa chỉ socket của server đích.
- Protocol là giao thức VoIP đã sử dụng (ví dụ nhƣ SIP).
- Request number là định danh của người gọi.
- Response number là địnhrlanh của người nhận cuộc gọi.
- Status là trạng thái cuộc gọi.
- Type là định danh của dữ liệu.
- Call ID là mã định danh của cuộc gọi.
File id là id của file đã được lưu trên server.
Đối với thông tin chat, Data type có giá trị là DATA__IM và phần nội dung lưu các thông tin sau:
- Session id là giá trị id của session đã đăng ký từ trước.
- Start Time là thời gian yêu cầu đƣợc gửi.
- End Time là thời gian yêu cầu đƣợc xử lý.
- Probe là điểm giám sát đã bắt đƣợc gói tin.
- Protocol là giao thức chat đƣợc sử dụng (ví dụ Yahoo, ICQ,...).
- Source address là địa chỉ (IP, cống) của người gửi.
- Source id là định danh (nickname) của người gửi.
- Target address là địa chỉ (IP, cống) của người nhận.
- Target id là định danh (nickname) của người nhận.
- “ Source là nội dung chat.
Xử lý download file
Với những thông tin có file đính kèm (ví dụ email, file, VoIP), nội dung file được lưu lại ở server và server chỉ trả về client thông tin File id tương ứng. Đe lấy nội dung các file này, client phải thực hiện gửi gói tin yêu cầu riêng với Request type là REQ_DOWNLOAD. Phần nội dung của gói tin lưu 2 thông tin là:
- Session id là giá trị id của session đã bắt đƣợc file.
- File id là giá trị id của file đã lưu trên server.
Phía server sẽ xác định file dựa vào các id nhận đƣợc. Nếu tồn tại thì sẽ trả về gói tin phản hồi có Data Type là DATA_DOWNLOAD. Phần nội dung của gói tin lưu các thông tin sau:
- Session id là giá trị id của session (lấy từ yêu cầu).
- File id là giá trị id của file (lấy từ yêu cầu).
- Filename là tên file (không bao gồm đường dẫn hay thư mục).
- Content là toàn bộ nội dung binary của file.
Trường hơ ̣p không tìm thấy file thì server sẽ gửi trả lại gói tin phản hồi lỗi.
Xử lý hủy bỏ yêu cầu giám sát
Để kết thúc phiên giám sát, phía client chủ động gửi gói tin yêu cầu ngừng giám sát có Request type là REQ_STOP_SURVEIL. Phần nội dung chỉ lưu thông tin
Session id đã nhận đƣợc từ server khi đăng ký yêu cầu giám sát.
Phía server khi nhận được yêu cầu này sẽ thực hiện hủy bỏ phiên giám sát tương ứng khỏi hệ thống và trả về gói tin phản hồi thông báo (gói tin phản hồi thông báo cũng tương tự gói tin phản hồi lỗi, nhưng trường Error Code được thiết đặt giá trị đặc biệt là NO_ERROR = 0).
- Error code đƣợc thiết lập là NO_ERROR.
- Message đƣợc thiết lập là “Session <mã session> is terminated”.
Trường hợp phát sinh lỗi (chang hạn khi không tìm thấy phiên giám sát), server sẽ gửi trả lại gói tin phản hồi lỗi.
Xử lý thoát hệ thống và ngắt kết nối
Để thoát khỏi hệ thống, phía client chủ động gửi gói tin với Request type là REQ_LOGOUT (xử lý này được thực hiện tự động khi người sử dụng đóng chương trình). Gói tin này không có phần nội dung.
Phía server khi nhận đƣợc yêu cầu này sẽ thực hiện hủy bỏ tất cả các phiên giám sát đang hoạt động đối của user (xác định thông qua Login Token trong header của gói tin yêu cầu) và thực hiện đóng kết nối với client.
3.3.3.2. Xây dựng và tích hợp cơ sở dữ liệu Cơ sở dữ liệu bao gồm:
a. Thông tin thuê bao di động
Số nhận dạng thuê bao di động quốc tế IMSI
IMSI xác định đƣợc các thuê bao vào mạng. Nó xác định duy nhất các thuê bao trong mạng GSM toàn cầu. IMSI đƣợc truy cập vào trong thẻ SIM khi thuê bao đăng ký với nhà cung cấp dịch vụ PLMN. IMSI đƣợc bao gồm 3 phần:
- Mã quốc gia di động (MCC) - Mã mạng di động (MNC)
- Nhận dạng số thuê bao di động (MSIN)
- Mã quốc gia di động (MCC): con số này xác định quốc gia của thuê bao mạng có 3 chữ số.
- Mã mạng di động (MNC): con số này xác định các nhà GSM PLMN của thuê bao (Viettel, Vinaphone, vv). Nó có 2 hoặc 3 chữ số. Một số mạng có thể có nhiều hơn một MNC phân bổ cho nó.
- Nhận dạng số thuê bao di động (MSIN): con số này đƣợc xác định duy nhất một người sử dụng trong các nhà mạng GSM.
Số thuê bao điện thoại di động ISDN (MSISDN)
MSISDN là số điện thoại của thuê bao. Đó là số người khác sẽ quay số để kết nối tới thuê bao. MSISDN bao gồm 3 phần:
- Mã quốc gia (CC).
- Mã nhà cung cấp dịch vụ (NDC).
- Số thuê bao (SN).
- Mã quốc gia (CC): Đây là mã quay số quốc tế cho bất cứ nước MS được đăng ký.
- Mã nhà cung cấp dịch vụ (NDC): NDC đƣợc gán cho mỗi PLMN. Trong nhiều trường hợp, một PLMN có thể cần nhiều hơn 1 NDC.
- Số thuê bao (SN): Đây là một số đƣợc gia cho các thuê bao bởi các nhà cung cấp dịch vụ (PLMN), sự kết hợp của NDC và SN đƣợc biết đến nhƣ quốc gia (đáng kể) số điện thoại di động.
Số nhận dạng thiết bị đầu cuối (IMEI)
IMEI xác định duy nhất các thiết bị di động. Bản chất là một chuỗi số đƣợc ghi trực tiếp vào điện thoại của nhà sản xuất. IMEI bao gồm 3 phần:
- Loại phân bố mã (TAC) - 8 chữ số.
- Số serial (SNR) - 6 chữ số.
- Phụ (SP) - 1 chữ số.
- Loại phân bổ Mã (TAC): con số này xác định duy nhất mô hình của một thiết bị không dây. Nó bao gồm 8 chữ số. Theo hệ thống mới (nhƣ của tháng tƣ 2004), hai chữ số đầu tiên của TAC là các báo cáo nhận dạng cơ thể của nhóm đã đƣợc phê duyệt GSMA rằng phân bổ loại mô hình này.
- Serial Number (SNR) - Con số này là một nhà sản xuất xác định số nối tiếp cho các mô hình của thiết bị không dây.
- Phụ (SP) con số này là một số kiểm tra đƣợc biết đến nhƣ 1 Luhn Check Digit. Đƣợc bỏ qua trong quá trình truyền trong mạng GSM.
Thông tin vị trí thuê bao di động