i TRƯỜNG ………………….
KHOA……………………….
Báo cáo tốt nghiệp
Đề tài:
XÂY DỰNG ỨNG DỤNG CLIENT CHO HỆ
THỐNG THÔNG TIN GIAO THÔNG
ii LỜI CÁM ƠN
Khóa luận này là thành quả lớn nhất trong những năm học đại học của em. Để hoàn
thành được khóa luận, ngoài sự cố gắng của bản thân, em đã nhận được sự giúp đỡ của rất
nhiều người.
Đầu tiên con xin cám ơn bố mẹ đã sinh thành và nuôi dưỡng con đến ngày hôm nay.
TÓM TẮT KHÓA LUẬN iii
Chương 1. Mở đầu 1
Chương 2. Lập trình ứng dụng cho điện thoại di động với J2ME 3
2.1. Tổng quan về J2ME 3
2.1.1. Giới thiệu J2ME 3
2.1.2. Kiến trúc của J2ME 4
2.2. Cấu trúc ứng dụng MIDlet 7
2.2.1. JAD và JAR 7
2.2.2 Vòng đời của một MIDLet 8
2.3. Đồ họa trong J2ME 10
2.3.1. Đồ họa mức cao (High Level Graphics) : 11
2.4. Lưu trữ dữ liệu với Record Management System (RMS) 12
2.4.1. Các thao tác mở, đóng hay xóa bản ghi 13
2.4.2. Thao tác với các bản ghi 13
2.4.3. Sử dụng hiệu quả RMS qua các lớp tiện ích 15
2.5. Kết nội mạng cơ bản trong J2ME 15
2.5.1. Cơ chế kết nối Client – Server 15
2.5.2. Tìm hiểu CLDC Generic Connection Framework 16
Chương 3. Dịch vụ tin nhắn SMS 18
3.1. Lịch sử của SMS 18
v
3.2. Lợi ích của dịch vụ tin nhắn SMS 18
3.3 Mô hình dịch vụ tin nhắn SMS 19
Chương 4. Ứng dụng hệ thống giao thông cho thiết bị di động sử dụng SMS 20
4.1. Mô tả hoạt động của hệ thống: 20
4.2. Hoạt động và các chức năng chính của Client 21
Chương 5. Phân tích thiết kế ứng dụng 22
5.1 Biểu đồ ca sử dụng 22
5.1.1. Lược đồ các ca sử dụng chính 22
Hình 11: Các thành phần của hệ thống 20
Hình 12: Biểu đồ các ca sử dụng 23
Hình 13: Biểu đồ lớp mức tổng thể 27
Hình 14: Biểu đồ lớp Location 28
Hình 15: Biểu đồ lớp Zone 28
Hình 16: Biểu đồ lớp DataRMS 29
Hình 17: Biểu đồ lớp DisplayManager 29
Hình 18: Cơ chế hoạt động của Stack 30
Hình 19: Biểu đồ lớp BaseForm 30
Hình 20: Các lớp kế thừa từ BaseForm 31
Hình 21: Biểu đồ lớp SettingForm 32
Hình 22: Biểu đồ lớp DetailForm 32
vii
Hình 23: Biểu đồ các lớp Sender và Receiver 33
Hình 24: Màn hình chính của SMS Gateway giả lập 34
Hình 25: Màn hình chính ứng dụng Client 35
Hình 26: Màn hình xem danh sách địa điểm và khu vực 35
Hình 27: Màn hình quản lý địa điểm 36
Hình 28: Màn hình tìm kiếm địa điểm 37
Hình 29: Màn hình thiết lập cấu hình 38
Hình 30: Màn hình chờ tin nhắn đến trên SMS Gateway 39
Hình 31: Tin nhắn nhận được trên SMS Gateway 39
Hình 32: Hiển thị tin nhắn nhận được lên màn hình 40
Hình 33: Màn hình chọn tình trạng địa điểm 41
Hình 34: Cú pháp tin nhắn cập nhật địa điểm 41
Hình 35: Màn hình hướng dẫn sử dụng 42
DANH SÁCH BẢNG
Bảng 1: Danh sách các ca sử dụng 24
Khóa luận này sẽ nghiên cứu tìm hiểu công nghệ lập trình ứng dụng cho điện thoại
di động J2ME, các kiến thức cơ bản về dịch vụ nhắn tin SMS. Sau đó ở phần cuối ứng
dụng sẽ xây dựng phần Client cho hệ thống thông tin giao thông.
Mặc dù để triển khai ứng dụng đi vào thực tế, sẽ còn nhiều vấn đề cần xem xét giải
quyết, tuy nhiên khóa luận cũng đã giới thiệu đầy đủ những kiến thức cần thiết về J2ME
để có thể xây dựng một ứng dụng đơn giản. Chương trình demo phần Client của hệ thống
thông tin giao thông đã được cài đặt và cho kết quả tốt trên thiết bị giả lập.
Khóa luận được chia thành 7 chương:
2
Chương 1 giới thiệu tổng quan về mục đích và ý nghĩa của khóa luận.
Chương 2 sẽ trình bày một cách khái quát về J2ME. Trong phạm vi khóa luận, tôi
chỉ giới thiệu các vấn đề đã nghiên cứu, tìm hiểu trong quá trình xây dựng ứng dụng
Client.
Chương 3 sẽ dành để nói về dịch vụ tin nhắn SMS, lịch sử, hiệu quả kinh tế, và cơ
chế hoạt động của dịch vụ này.
Các chương 4,5,6 trình bày về quá trình phân tích, thiết kế để xây dựng ứng dụng.
Chương 7 kết luận những vấn đề đã giải quyết được hay hướng phát triển, triển khai
cho hệ thống.
3 Chương 2. Lập trình ứng dụng cho điện thoại di động với J2ME
2.1. Tổng quan về J2ME
2.1.1. Giới thiệu J2ME
Java là một ngôn ngữ lập trình bậc cao hướng đối tượng được Sun giới thiệu rộng rãi
từ tháng 5 năm 1995. Sự kiện này đã tạo nên một cuộc cách mạng trong tư duy lập trình
và hướng giải quyết vấn đề của các nhà phát triển. Bộ công cụ phát triển Java (Java
Development Kit) phiên bản đầu tiên cũng được Sun công bố ngay sau đó vào tháng 2
năm 1996, tạo thuận lợi cho việc tạo ra các chương trình Java.
Các thành phần cơ bản trong kiến trúc của J2ME gồm có:
Cấu hình (Configuration) là đặc tả định nghĩa một môi trường phần mềm cho một
dòng các thiết bị được phân loại bởi tập hợp các thuộc tính, ví dụ như:
+ Kiểu và số lượng bộ nhớ
+ Kiểu và tốc độ bộ vi xử lý
+ Kiểu mạng kết nối
Do đây là đặc tả nên các nhà sản xuất thiết bị như Samsung, Nokia …bắt buộc phải
thực thi đầy đủ các đặc tả do Sun qui định để các lập trình viên có thể dựa vào môi trường
lập trình nhất quán và thông qua sự nhất quán này, các ứng dụng được tạo ra có thể mang
tính độc lập thiết bị cao nhất có thể.
Hiện nay Sun đã đưa ra 2 dạng Configuration:
- Cấu hình thiết bị kết nối giới hạn (Connected Limited Device
Configuration CLDC):
1
Nguồn từ
5
Được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end), các thiết bị
này thông thường là máy điện thọai di động và PDA với khoảng 512 KB bộ nhớ.
- Cấu hình thiết bị kết nối (Connected Device Configuration).
CDC được đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị thuộc
CLĐC nhưng vẫn yếu hơn cho các hệ thống máy để bàn sử dụng J2SE. Những thiết bị
này có nhiều bộ nhớ hơn hơn (thông thường là trên 2Mb) và có bộ xử lý mạnh hơn. Các
sản phẩm này có thể kể đến như các máy PDA cấp cao, điện thoại web hay các thiết bị gia
dụng trong gia đình.
Một thành phần đặc trưng chung của tất cả các công nghệ Java, bao gồm cả J2ME,
đó là máy ảo Java.
Các thiết bị CLDC sử dụng bộ nhớ không bay hơi để lưu trữ các thư viện thực thi và
KVM, và máy ảo khác được tạo cho thiết bị riêng biệt. Bộ nhớ bay hơi được dùng để cấp
phát bộ nhớ thực thi.
7
Một hiện trạng khung mà trên đó bạn phát triển hiện trạng của riêng mình, Hiện
trạng nền móng (the Foundation Profile), được cung cấp cho CDC. Tuy nhiên ở đây ta chỉ
quan tâm đến các hiện trang trên CLDC cho các thiết bị nhỏ.
Cấu hình các thiết bị kết nối giới hạn (Connected Limited Device Configuration -
CLDC) và Hiện trạng thiết bị thông tin di động (Mobile Information Device Profile -
MIDP) kết hợp tương ứng để hỗ trợ phần lớn các thiết bị di động giá thấp được dùng hiện
nay, như PDAs, điện thoại không dây, và máy nhắn tin hai chiều.
2.2. Cấu trúc ứng dụng MIDlet
2.2.1. JAD và JAR
Các thành phần cơ bản của bất kỳ bộ MIDlet bao gồm tệp tin JAD (Java
Application) và JAR (Java Archive).
Các lớp đã biên dịch của ứng dụng MIDlet được đóng gói trong một tập tin JAR
(Java Archive File). Đây chính là tập tin JAR được tải xuống điện thoại di động.
Tập tin JAR chứa tất cả các tập tin đã biên dịch thành tập tin class từ một hay nhiều
MIDlet, cũng như các tài nguyên cần thiết. Hiện tại, MIDP chỉ hỗ trợ định dạng hình .png
(Portable Network Graphics). Tập tin JAR cũng chứa tập tin kê khai (manifest file) mô tả
nội dung của MIDlet cho bộ quản lý ứng dụng. Nó cũng phải chứa các tập tin dữ liệu mà
MIDlet cần. Tập tin JAR là toàn bộ ứng dụng MIDlet. MIDlet có thể load và triệu gọi các
phương thức từ bất kỳ lớp nào trong tập tin JAR, trong MIDP, hay CLDC. Nó không thể
truy xuất các lớp không phải là bộ phận của tập tin JAR hay vùng dùng chung của thiết bị
di động.
Nội dung của tập tin JAR:
Các trường yêu cầu
- Manifest-Version // Phiên bản tập tin Manifest
Các ứng dụng J2ME được gọi là MIDlet (Mobile Information Device applet). Lớp
chính của một ứng dụng được định nghĩa là lớp mở rộng (extends) của lớp MIDlet trong
MIDP. Có thể chỉ có một lớp trong ứng dụng mở rộng lớp này. Lớp MIDlet được trình
quản lý ứng dụng trên điện thoại di động dùng để khởi động, dừng, và tạm dừng MIDlet
(ví dụ, trong trường hợp có cuộc gọi đến). Khi sử dụng lớp Midlet, chúng ta phải khai báo
sử dụng thư viện java.microedition.midlet.MIDlet và thực thi ba phương thức startApp(),
pauseApp(), và destroyApp().
Cấu trúc của một ứng dụng với Midlet gồm sáu phần chính:
- Khai báo import thư viện java.microedition.midlet.MIDlet.
- Khai báo một lớp (mà lớp này là lớp chính của ứng dụng) extends từ lớp
Midlet.
- Hàm khởi tạo (constructor) cho lớp vừa khai báo.
- Cài đặt phương thức startApp():
Được gọi bởi bộ quản lý ứng dụng khi MIDlet được khởi tạo, và mỗi khi MIDlet trở
về từ trạng thái tạm dừng. Nói chung, các biến toàn cục sẽ được khởi tạo lại trừ hàm tạo
3
Nguồn từ
10
bởi vì các biến đã được giải phóng trong hàm pauseApp(). Nếu không thì chúng sẽ không
được khởi tạo lại bởi ứng dụng.
- Cài đặt phương thức pauseApp():
Được gọi bởi bộ quản lý ứng dụng mỗi khi ứng dụng cần được tạm dừng (ví dụ,
trong trường hợp có cuộc gọi hoặc tin nhắn đến). Cách thích hợp để sử dụng pauseApp()
là giải phóng tài nguyên và các biến để dành cho các chức năng khác trong điện thoại
trong khi MIDlet được tạm dừng. Cần chú ý rằng khi nhận cuộc gọi đến hệ điều hành trên
điện thoại di động có thể dừng KVM thay vì dừng MIDlet. Việc này không được đề cập
trong MIDP mà đó là do nhà sản xuất quyết định sẽ chọn cách nào.
các lớp giao diện đồ họa mức cao. Còn các lớp xây dựng đồ họa mức thấp phù hợp cho
các ứng dụng trò chơi có giao diện động phức tạp. Do vậy cơ sở lý thuyết cho phần đồ
họa mức thấp sẽ được đề cập đến trong những tài liệu khác phù hợp hơn.
4
Nguồn từ
12
Đồ họa mức cao là lớp con của lớp Screen. Nó cung cấp các thành phần như
textbox, form, list và alert. Việc sắp xếp các thành phần trên màn hình hạn chế, phụ thuộc
vào nhà sản xuất.
Cấu trúc phân cấp các thành phần của các lớp đồ họa mức cao có thể được minh họa
theo biểu đồ sau:
Hình 6: Cấu trúc phân cấp các lớp đồ họa mức cao
5
2.4. Lưu trữ dữ liệu với Record Management System (RMS)
Trong quá trình thực hiện khóa luận, tiếp xúc và tìm hiểu cơ chế lưu trữ dữ liệu
thông qua RMS là một khái niệm khá mới và thú vị. RMS là một “hệ cơ sở dữ liệu” đơn
giản, nó tổ chức và quản lý tất cả dữ liệu dưới dạng các record (bản ghi). RMS chỉ cho
phép thao tác đọc và ghi với dữ liệu ở dạng một mảng byte nhị phân. Do đó để làm việc
được với RMS, các kiểu dữ liệu thông thường cũng như các kiểu dữ liệu do người dùng
định nghĩa đều phải được chuyển thành mảng byte nhị phân để ghi vào các record trong
RMS. Trong phần xây dựng chương trình demo, các lớp yêu cầu phải lưu trữ trực tiếp lên
RMS đều có phương thức cho phép chuyển đổi các kiểu dữ liệu thông thường thành mảng
byte và ngược lại.
5
14 Hình 7: Cơ chế lưu trữ trong một kho chứa các bản ghi
- Thêm một bản ghi:
Phương thức dùng để thêm một bản ghi lên RecordStore là:
public int addRecord(byte[] data, int offset, int numBytes)
Ví dụ sau giải thích rõ hơn cho phương thức này:
Zone cauGiay = new Zone(“Cau Giay”, “CG”);
byte[ ] data = cauGiay.toByteArray();
int id = zoneRecord.addRecord(data,0,data.length());
- Đọc một bản ghi:
public byte[ ] getRecord(int recordId);
Phương thức trên cho phép đọc một bản ghi có định danh tại recordId. Trong ứng
dụng này, sau khi lưu trữ toàn bộ thông tin các khu vực và địa điểm lên RMS, để hiển thị
lên màn hình, dữ liệu được lấy từ RMS và gọi hàm khởi tạo đối tượng Zone (hoặc
Location)
int size = zoneRecord.getSize();
Zone zone = null;
for(int i = 0; i < size; i++){
byte[] buffer = zoneRecord.getRecord(i);
zone = new Zone(buffer);
}
- Thay thế một bản ghi:
Phương thức:
15
public void setRecord(int recordId, byte[] newData,
int offset, int numBytes)
Khi làm việc với J2SE, các lớp hỗ trợ kết nối mạng là java.io.* và java.net.* yêu cầu
nhiều bộ nhớ hơn so với những gì mà các thiết bị cầm tay có thể hỗ trợ. Do vậy, một nền
tảng được thiết kế dành riêng cho các thiết bị CLDC là Generic Connection Framework
(GCF). GCF cung cấp một bộ các lớp trừu tượng được sử dụng ở mức lập trình cho phép
điều khiển nhiều loại giao tiếp.
Trong nền tảng này, mọi kết nối đều được tạo ra sử dụng phương thức tĩnh open của
lớp Connector. Nếu thành công, phương thức này sẽ trả về một đối tượng thực thi một
trong các giao diện kết nối chung. Hình sau sẽ cho thấy mối quan hệ is-a giữa các giao
diện. Giao diện Connection là giao diện cơ sở.
Hình 9: Mối quan hệ giữa các giao diện hỗ trợ cho lập trình mạng trong J2ME
76
Nguồn từ
17
Tham số của phương thức open là một chuỗi ký tự mô tả giao thức, địa chỉ, và tham
số:
…
Try{
Connector.open(“protocol:address;parameters”);
}catch(ConnectionNotFoundExeption e){
//
}
Ví dụ về việc sử dụng phương thức open cho các kết nối khác nhau:
HTTP Connection: Connector.open("
Socket Connection: Connector.open("socket://java.sun.com:port")
Datagram Connection:
SMS.
3.2. Lợi ích của dịch vụ tin nhắn SMS
Lợi ích của SMS dành cho các thuê bao tập trung sự tiện lợi, linh hoạt và đơn giản
của các dịch vụ nhắn tin và truy cập dữ liệu. Từ quan điểm này, lợi ích chính của SMS là
khả năng sử dụng các thiết bị cầm tay như một phần mở rộng của máy tính. Những lợi ích
này thường phụ thuộc vào các nhà cung cấp dịch vụ, nhưng ít nhất, SMS cũng mang lại
những tiện ích sau: