ĐẠI HỌC QUỐC GIA HÀ NỘI

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Đặng Đình Hùng

NGHIÊN CỨU CÔNG NGHỆ J2ME VÀ THỬ NGHIỆM LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG

KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY

Ngành: Công nghệ thông tin

HÀ NỘI - 2010

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Đặng Đình Hùng

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY

Đặng Đình Hùng

NGHIÊN CỨU CÔNG NGHỆ J2ME VÀ THỬ NGHIỆM LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG NGHIÊN CỨU CÔNG NGHỆ J2ME VÀ THỬ NGHIỆM LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG

Ngành: Công nghệ thông tin

KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Cán bộ hướng dẫn: ThS Đào Ngọc Phong

Ngành: Công nghệ thông tin

HÀ NỘI - 2010

Cán bộ hướng dẫn: ThS Đào Ngọc Phong

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Lời cảm ơn

Sau một thời gian tập trung nghiên cứu và thực hiện, em đã hoàn thành xong luận

văn của mình. Đây là kết tinh của một quá trình lao động và học tập nghiêm túc dựa trên

kiến thức mà em đã thu thập được dưới sự truyền dạy của quý thầy cô.

Lời đầu tiên, em xin được gửi lời cảm ơn sâu sắc tới ThS. Đào Ngọc Phong và thầy–

PGS TS Trịnh Nhật Tiến, những người thầy đã nhiệt tình giúp đỡ em cũng như các bạn

được thầy hướng dẫn trong suốt quá trình làm khóa luận.

Em xin được cảm ơn các thầy, các cô đã giảng dạy em trong suốt bốn năm qua. Những kiến thức mà các thầy, các cô đã dạy sẽ mãi là hành trang giúp em vững bước trong tương lai.

Em cũng xin được cảm ơn tập thể lớp K51CC, một tập thể lớp đoàn kết với những người bạn luôn nhiệt tình giúp đỡ mọi người, những người bạn đã giúp đỡ em trong suốt bốn năm học tập trên giảng đường Đại học.

Cuối cùng, em xin được gửi lời cảm ơn sâu sắc tới bố mẹ và gia đình em, những người luôn kịp thời động viên, khích lệ em, giúp đỡ em vượt qua những khó khăn trong cuộc sống.

Hà Nội, tháng 5 năm 2010

Đặng Đình Hùng

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Tóm tắt nội dung

Khóa luận tập trung nghiên cứu công nghệ J2ME trên thiết bị di động với trọng

tâm là phục vụ cho việc đáp ứng các dịch vụ trực tuyến trong thực tế cuộc sống. B ên cạnh

đó còn có các công nghệ liên quan nhằm trợ giúp các lập trình viên dễ dàng tiếp cận với

việc xây dựng các ứng dụng trên thiết bị di dộng một cách linh hoạt và chuyên nghiệp.

Việc xây dựng ứng dụng thử nghiệm được đáp ứng hai khía cạnh, một là xây dựng

ứng dụng Web Services để xây dựng và quản trị nội dung, hai là thử nghiệm ứng dụng

trên thiết bị di động dành cho người dùng với một chương trình mô phỏng.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Mục lục

Chương 1. Tổng quan về lập trình trên thiết bị di động .................................................... 1 1.1. Thực tế các ứng dụng trên thiết bị di động ______________________________ 1

1.2. Đặc điểm của lập trình ứng dụng trên thiết bị di động _____________________ 1

1.3. Các công nghệ trong lập trình trên thiết bị di động _______________________ 1

Chương 2. Giới thiệu J2ME................................................................................................ 3 2.1. Lịch sử hình thành J2ME ____________________________________________ 3

2.2. Các phiên bản, đặc điểm _____________________________________________ 3

2.2.1. MIDP 1.0 _______________________________________________________ 3

2.2.2 . MIDP 2.0 _______________________________________________________ 4

2.3. Sự khác nhau giữa J2ME và J2SE _____________________________________ 5

2.4. Các đặc điểm khác _________________________________________________ 7

Chương 3. Công nghệ lập trình J2ME trên thiết bị di động ............................................. 8 3.1. Kiến trúc _________________________________________________________ 8

3.2. Các lớp của J2ME _________________________________________________ 10

3.3. Các tầng của CLDC J2ME __________________________________________ 11

3.4. Tầng máy ảo Java _________________________________________________ 12

3.5. Tầng cấu hình ____________________________________________________ 15

3.6. Tầng hiện trạng ___________________________________________________ 16

3.7. MIDlet _________________________________________________________ 16

3.7.1. Bộ khung MIDlet ________________________________________________ 17

3.7.2. Chu kỳ sống của MIDlet __________________________________________ 18

3.7.3. Tập tin JAR ____________________________________________________ 20

3.7.4. Tập tin kê khai và JAD ___________________________________________ 20

3.7.5. Bộ MIDlet _____________________________________________________ 21

Chương 4. Một số công nghệ trong J2ME ....................................................................... 22 4.1. Đồ họa __________________________________________________________ 23

4.1.1. Đồ họa mức cao _________________________________________________ 23

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

4.1.1.1. Text Box _____________________________________________________ 23

4.1.1.2. Form ________________________________________________________ 23

4.1.1.3. List _________________________________________________________ 23

4.1.1.4. Alert ________________________________________________________ 23

4.1.1.5. Form và các Form Item __________________________________________ 24

4.1.1.5.1. String Item __________________________________________________ 24

4.1.1.5.2. Image Item __________________________________________________ 24

4.1.1.5.3. Text Field ___________________________________________________ 24

4.1.1.5.4. Date Field ___________________________________________________ 24

4.1.1.5.5. Choice Group ________________________________________________ 24

4.1.1.5.6. Gause ______________________________________________________ 25

4.1.1.5.7 . Ticker ______________________________________________________ 25

4.1.2. Đồ họa mức thấp ________________________________________________ 25

4. 2. Lập trình mạng ___________________________________________________ 26

4.2.1. Khung mạng CLDC tổng quát ______________________________________ 26

4.2.2. Các lớp giao diện kết nối __________________________________________ 28

4.2.3. Kết nối HTTP ___________________________________________________ 30

4.2.3.1. Ví dụ kết nối HTTP GET ________________________________________ 31

4.2.3.2. Ví dụ kết nối HTTP POST _______________________________________ 32

4.2.4. Triệu gọi CGI script ______________________________________________ 33

4.2.5. HTTP Request Header ____________________________________________ 34

4.3. Wireless Messaging API ____________________________________________ 34

Chương 5. Xây dựng ứng dụng thử nghiệm .................................................................... 38 5.1. Giới thiệu ứng dụng _______________________________________________ 38

5.1.1. Mục tiêu _______________________________________________________ 38

5.1.2. Ứng dụng thử nghiệm ____________________________________________ 38

5.2. Các công nghệ sử dụng trong chương trình _____________________________ 38

5.2.1. Lightweight UI Toolkit (LWUIT) ___________________________________ 38

5.2.2. XML __________________________________________________________ 40

5.2.2.1. Phân tách XML ________________________________________________ 41

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

5.2.2.2. Các bộ phân tích XML cho KVM _________________________________ 42

5.2.2.2.1. kXML ______________________________________________________ 43

5.2.2.2.2. Tiny XML __________________________________________________ 43

5.2.2.2.3. Nano XML __________________________________________________ 43

5.2.2.3. Làm việc với kXML ____________________________________________ 44

5.2.2.4. Gói org.kxml __________________________________________________ 44

5.2.2.5. Gói org.kxml.io ________________________________________________ 45

Chương 6. Tổng quan về chương trình ứng dụng thử nghiệm ...................................... 46 6.1. Web Services ____________________________________________________ 46

6.1.1. Giới thiệu khung xử lý hệ thống ____________________________________ 46

6.1.2. Xây dựng cơ sở dữ liệu cho hệ thống ________________________________ 48

6.1.3. Quá trình hoạt động của hệ thống ___________________________________ 49

6.1.3.1. Phần quản trị nội dung __________________________________________ 49

6.1.3.1.1. Khu vực người quản trị đăng nhập vào hệ thống ____________________ 49

6.1.3.1.2. Khu vực chung _______________________________________________ 50

6.1.3.1.3. Khu vực thao tác với các danh mục tin ____________________________ 50

6.1.3.1.4. Khu vực quản lý nội dung ______________________________________ 51

6.1.3.2. Phần dành cho người quản trị _____________________________________ 51

6.1.3.2.1. Phần menu bên trái ___________________________________________ 51

6.1.3.2.2. Phần quản lý nhóm người dùng __________________________________ 52

6.1.3.2.3. Phần quản lý nhóm thực đơn ____________________________________ 52

6.1.3.2.4. Phần quản lý các nhóm Component ______________________________ 53

6.1.3.2.5. Phần quản lý ngôn ngữ hiển thị _________________________________ 53

6.1.3.3. Phần xuất bản nội dung định dạng XML ____________________________ 54

6.1.3.3.1. Xuất bản nội dung các danh mục tin ______________________________ 54

6.1.3.3.2. Xuất bản các bản tin trong cùng danh mục _________________________ 54

6.2. Trên thiết bị di động _______________________________________________ 55

6.2.1. Quy trình hoạt động ______________________________________________ 55

6.3. Các module chính trong ứng dụng ____________________________________ 57

6.3.1. Web Services ___________________________________________________ 57

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

6.3.2. Trên thiết bị di động______________________________________________ 61

6.4. Mã nguồn tham khảo ______________________________________________ 65

6.4.1. kxml2 _________________________________________________________ 65

6.4.2. Convert UTF-8 __________________________________________________ 65

6.4.3. LWUIT ________________________________________________________ 65

Chương 7. Cài đặt ứng dụng thử nghiệm ....................................................................... 66 7.1. Web Services ____________________________________________________ 66

7.1.1. Cài đặt phần giả lập máy chủ Web trên máy tính cá nhân ________________ 66

7.1.2. Cấu hình gói ứng dụng Web Services ________________________________ 66

7.2. Trên thiết bị di động _______________________________________________ 67

7.2.1. Cài đặt phần mềm mô phỏng _______________________________________ 67

7.2.2 . Cấu hình ứng dụng thử nghiệm _____________________________________ 67

Kết luận:………………………………………………………………………………….... Tài liệu tham khảo:………………………………………………………………………...

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Danh mục hình vẽ và bảng biểu

Hình 1: Lịch sử J2ME............................................................................................... ....3

Hình 2: Sơ đồ kiểm tra của bộ tiền kiểm tra và bộ kiểm tra..........................................5

Hình 3: Mô hình Sandbox……………………………………………………….…….6

Hình 4: J2ME và J2SE………………………………………………………………...7

Hình 5: Kiến trúc J2ME……………………………………………………………….8

Hình 6: Phân khúc dòng thiết bị với các ngôn ngữ Java……………………………....9

Hình 7: Các lớp của J2ME……………………………………………………………. 11

Hình 8: Tiến trình xây dựng MIDlet…………………………………………………. .13

Hình 9: MIDlet………………………………………………………………………..16

Hình 10: Bộ khung yêu cầu tối thiểu cho một ứng dụng MIDlet……………………...17

Hình 11: Chu kỳ sống của MIDlet…………………………………………………….18

Hình 12: Hai bộ MIDlet……………………………………………………………….21

Hình 13. Phân cấp lớp đồ họa………………………………………………………… .25

Hình 14. Khung mạng CLDC tổng quát………………………………………………. 26

Hình 15. Các lớp kết nối………………………………………………………………. 27

Hình 16. Các trạng thái kết nối HTTP…………………………………………………29

Hình 17: Các phân tầng lớp trong LWUIT…………………………………………….38

Hình 18 : Ứng dụng thử nghiệm với LWUIT………………………………………….39

Hình 19 : Quá trình xử lý trên web services……………………………………………45

Hình 20 : Biểu đồ thực thể liên kết của hệ thống………………………………………48

Hình 21: Người quản trị đăng nhập vào hệ thống……………………………………...49

Hình 22: Khu vực mặc định của hệ thống……………………………………………...49

Hình 23: Khu vực hiển thị danh mục của hệ thống…………………………………….50

Hình 24: Khu vực hiển thị nội dung bản tin……………………………………………50

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 25: Phần tùy chọn bên trái của hệ thống………………………………………….51

Hình 26: Phần quản lý nhóm người dùng………………………………………………51

Hình 27: Phần quản lý nhóm thực đơn…………………………………………………52

Hình 28: Phần quản lý Component ……………………………………………………. 52

Hình 29: Khu vực quản lý ngôn ngữ hiển thị trong hệ thống………………………….53

Hình 30: Kết quả thu được với trình duyệt Mozilla Firefox 3.5…………………….…53

Hình 31: Kết quả thu được với trình duyệt Mozilla Firefox 3.5…………………………54

Hình 32: Màn hình khởi động của ứng dụng……………………………………………..55

Hình 33: Màn hình tùy chọn ứng dụng………………………………………………...…57

Hình 34:Yêu cầu cho phép kết nối tới dịch vụ………………………………………...…57

Hình 35: Các quá trình khi xem tin tức với ứng dụng……………………………………58

Hình 36: Tạo cơ sở dữ liệu trong phpmyadmin………………………………………..…66

Hình 37: Quá trình nhập cơ sở dữ liệu…………………………………………………...66

Hình 38: Bước đầu tạo Project mới………………………………………………………67

Hình 39: Cấu hình ban đầu…………………………………………………….…………68

Hình 40: Cấu hình chi tiết…………………………………………………...……………68

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Thuật ngữ viết tắt

Application Program Interface API

American Standard Code for Information Interchange ASCII

Abstract Window ToolKit AWT

Cell Broadcast Short Message Service CBS

Connected Device Configuration CDC

Code Division Multiple Access CDMA

Common Gateway Interface CGI

Connected Limited Device Configuration CLDC

Central Processing Unit CPU

Document Object Model DOM

Document Type Definition DTD

Enhanced Data GSM Environment EDGE

General Packet Radio Service GPRS

Global Positioning System GPS

Global System for Mobile Communications GSM

Graphical User Interface GUI

Hyper-Text Markup Language HTML

Hyper-Text Transfer Protocol HTTP

Integrated Development Environment IDE

Internet Protocol IP

Infra Red IR

Java 2 Platform, Enterprise Edition J2EE

Java 2 Platform, Micro Edition J2ME

Java 2 Platform, Standard Edition J2SE

Java Application Descriptor JAD

Java Application Archive JAR

Java Community Process JCP

JavaNative Interface Support JNI

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Java Specification Request JSR

K Virtual Machine KVM

MIDP applet MIDlet

Mobile Information Device Profile MIDP

Model-View-Controller MVC

Over The Air OTA

Personal Computer PC

Personal Digital Assistant PDA

PHP Hypertext Preprocessor PHP

Remote Method Invocation RMI

Record Management System RMS

Simple API for XML SAX

Short Message Service SMS

User Datagram Protocol UDP

Uniform Resource Locator URL

Wireless Application Protocol WAP

Wap Binary XML WBXML

Wireless Messaging API WMA

eXensible Markup Language XML

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 1. Tổng quan về lập trình trên thiết bị di động

1.1 . Thực tế các ứng dụng trên thiết bị di động

Mạng điện thoại di động đã xuất hiện tại Việt Nam từ đầu những năm 1990 và theo

thời gian, số lượng các thuê bao cũng như các nhà cung cấp dịch vụ di động tại Việt Nam

ngày càng tăng. Cùng với sự phát triển của số lượng thuê bao di động là sự đa dạng hóa

các dịch vụ hướng đến thiết bị di động. Trong những năm gần đây, điện thoại di động

không chỉ mang chức năng nghe gọi hay nhắn tin thông thường mà còn là một thiết bị

giải trí, tra cứu thông tin hay trợ giúp cá nhân đắc lực. Do vậy, xây dựng các ứng dụng

cho điện thoại di động đang là một yêu cầu tất yếu trong xu thế hiện nay. Năm 2009, các nhà mạng lớn đã bắt tay vào việc triển khai mạng 3G tại Việt Nam, năm 2010 trở đi được đánh giá là những năm nở rộ các dịch vụ tiện ích trên thiết bị di động đặc biệt là các ứng dụng trực tuyến trên nền thiết bị di động.

Trong tương lai, với sự phát triển mạnh mẽ của các thiết bị di động về phần cứng

cũng như chất lượng mạng di động, ngành công nghiệp phần mềm trên thiết bị di động sẽ gặt hái được nhiều thành quả và nó sẽ thu hút lượng lớn các nhân công cũng như hứa hẹn nhiều điều thú vị.

1.2 . Đặc điểm của lập trình ứng dụng trên thiết bị di động

Đặc trưng thiết bị di động hỗ trợ tài nguyên phần cứng không cao, với đặc điểm là bộ nhớ hạn chế, khả năng xử lý chậm, các thiết bị mở rộng còn hạn chế, vì vậy lập trình ứng dụng trên thiết bị di động đòi hỏi các lập trình viên quản lý tốt bộ nhớ, độ lớn của mã nguồn, cũng như các thư viện hay cơ chế làm việc với các file media.

Do thiết bị di động được phát triển bởi nhiều hãng nên cấu trúc phần cứng đa dạng và khó có chuẩn chung nên yêu cầu các ngôn ngữ lập trình độc lập với phần cứng và linh

hoạt là rất cao.

1.3 . Các công nghệ trong lập trình trên thiết bị di động

Hai hướng phát triển ứng dụng trên điện thoại di động phổ biến hiện nay là sử dụng ngôn ngữ C++ trên nền hệ điều hành Symbian và J2ME. Khoảng mấy năm trở lại đây,

1

nền tảng di động mở Android của Google và iPhone OS của Apple cũng đang có tín hiệu phát triển rất khả quan.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Các ứng dụng viết trên nền Symbian có các ưu thế truy cập trực tiếp các tài nguyên

của điện thoại cũng như hỗ trợ hệ thống tập tin, thư mục… như máy tính cá nhân vì được

hỗ trợ trực tiếp bởi hệ điều hành. Tuy nhiên hệ điều hành Symbyan lại có kích thước khá

lớn nên chỉ có ở các thế hệ điện thoại tương đối cao cấp, và xây dựng ứng dụng dùng

Symbian API cũng phức tạp hơn.

Đối trọng với Symbian API là công nghệ J2ME với kích thước nhỏ gọn, tiện dụng,

được hỗ trợ bởi hầu hết các thế hệ điện thoại mới ra đời, kể cả các điện thoại có hệ điều

hành Symbian. J2ME không những là một ngôn ngữ hướng đến các thiết bị di động mà

còn là ngôn ngữ chính để lập trình trên các thiết bị gia dụng, thẻ tín dụng điện tử và các thiết bị thông minh khác. Chúng ta có thể nói đối tượng của ngôn ngữ J2ME là rộng hơn rất nhiều so với C++ trên nền Symbyan. Tại thời điểm hiện tại, ngôn ngữ J2ME không hỗ

trợ được nhiều tính năng như trên C++ trên nền Symbian nhưng lại có những ưu điểm trội hơn. J2ME là một ngôn ngữ nhỏ, gọn nhưng rất chặt chẽ và dễ nắm bắt, với những lập trình viên đã có kinh nghiệm với Java việc lập trình với J2ME trở nên rất dễ dàng. J2ME còn là ngôn ngữ được các tổ chức mã nguồn mở ủng hộ mạnh mẽ và phát triển rất nhanh chóng.

Năm 2007, liên minh Google, OHA ra mắt nền tảng Android, nó được giới thiệu là một nền tảng mở với sự kết hợp của ngôn ngữ Java và hệ điều hành Linux 2.6. Trong Android, nét đặc trưng nổi bật là tính tương thích lẫn nhau, khả năng hỗ trợ thiết bị, cũng như ngôn ngữ Java SE cộng với việc tích hợp sử dụng cơ sở dữ liệu ngay trong thiết bị.

Một đối thủ rất đáng gờm trong thị phần của điện thoại thông minh đó là iPhone của Apple, các ứng dụng của iPhone được viết bằng ngôn ngữ Objective C hoạt động trên nền

iPhone OS. Đặc điểm chính của Objective C là ngôn ngữ hướng đối tượng nhưng được hỗ trợ nhiều bởi các API nên việc xử lý đa phương tiện nổi trội, điều này cũng tạo nên

2

thương hiệu đình đám của Apple.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 2. Giới thiệu J2ME

2.1. Lịch sử hình thành J2ME

J2ME được phát triển từ kiến trúc Java Card, Embeded Java và Personal Java của

phiên bản Java 1.1. Đến sự ra đời của Java 2 thì Sun quyết định thay thế Personal Java và

được gọi với tên là Java 2 Micro Edition, hay viết tắt là J2ME. J2ME là nền tảng cho các

thiết bị có tính chất nhỏ gọn:

Hình 1: Lịch sử J2ME.

2.2. Các phiên bản, đặc điểm

Có hai phiên bản MIDP chính trong ngôn ngữ J2ME:

2.2.1. MIDP 1.0

Phiên bản này xuất hiện đầu tiên vào năm 2001, và phổ biến rộng rãi ở Mỹ (dẫn đầu

là Motorola ). Với thế hệ ban đầu này, các chương trình chỉ được hỗ trợ cơ bản như giao

diện chương trình, giao thức HTTP và các tính năng hỗ trợ âm thanh hay khả năng viết game chưa được hỗ trợ.

Các lớp và kiểu dữ liệu: Phần lớn các lớp mà các lập trình viên Java quen thuộc vẫn còn được giữ lại ví dụ như các lớp trong gói java.util như Stack, Vector và

Hastable cũng như Enumeration.

 Hỗ trợ đối tượng Display: Đúng như tên gọi một chương trình MIDP sẽ hỗ

3

trợ duy nhất một đối tượng Display là đối tượng quản lý việc hiển thị dữ liệu trên màn hình điện thoại.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

   Hỗ trợ Form và các giao diện người dùng. Hỗ trợ Timer và Alert. Cung cấp tính năng Record Management System (RMS) cho việc l ưu trữ dữ

liệu.

2.2.2 . MIDP 2.0

Phiên bản MIDP 2.0 được Sun hỗ trợ đầy đủ, cộng với các API chính quy. Các tính

năng về gửi SMS, kết nối với các tập tin âm thanh, hình ảnh được hỗ trợ tốt. Ngoài ra, lập

trình viên còn có thể viết các ứng dụng kết nối bluetooth hay viết game trên thiết bị di

động với J2ME.

Nâng cấp các tính năng bảo mật như:

  Download qua mạng an toàn hơn qua việc hỗ trợ giao thức HTTPS. Kiểm soát việc kết nối giữa máy di động và server: ví dụ như các chương

trình không thể kết nối tới server nếu thiếu sự chấp thuận của người sử dụng.

Thêm các API hỗ trợ Multimedia. Một trong nhưng cải tiến hấp dẫn nhất của MIDP 2.0 là tập các API media của nó. Các API này là một tập con chỉ hỗ trợ âm thanh của Mobile Media API (MMAPI).

Mở rộng các tính năng của Form. Nhiều cải tiến đã được đưa vào API javax.microedition.lcdui trong MIDP 2.0, nhưng các thay đổi lớn nhất (ngoài API cho game) là trong Form và Item.

Hỗ trợ các lập trình viên Game bằng cách tung ra Game API: Có lẽ Sun đã kịp nhận ra thị trường đầy tiềm năng của các thiết bị di động trong lĩnh vực Game. Với MIDP 1.0 thì các lập trình viên phải tự mình viết code để quản lý các hành động của nhân

vật cũng như quản lý đồ họa. Việc này sẽ làm tăng kích thước file của sản phẩm cũng như việc xuất hiện các đoạn mã bị lỗi. Được hưởng lợi nhất từ Game API trong MIDP 2.0

không chỉ là các lập trình viên Game mà còn là các lập trình viên cần sử dụng các tính năng đồ họa cao cấp. Ý tưởng cơ bản của Game API là việc giả định rằng một màn hình

4

game là tập hợp các layer (lớp). Với Game API nhà phát triển còn được cung cấp các tính năng như quản lý các thao tác bàn phím.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

 Hỗ trợ kiểu ảnh RGB: một trong những cải tiến hấp dẫn cho các nhà phát

triển MIDP là việc biểu diễn hình ảnh dưới dạng các mảng số nguyên, cho phép MIDlet

thao tác với dữ liệu hình ảnh một cách trực tiếp.

2.3. Sự khác nhau giữa J2ME và J2SE

Các điểm khác nhau là do một trong hai lý do. Do lớp Java đã bị bỏ đi để giảm kích thước của J2ME hoặc do lớp bị bỏ bởi vì nó ảnh hưởng đến sự an toàn, bảo mật của thiết bị di động hay của các ứng dụng khác trên thiết bị di động (có thể dẫn đến phát triển virus). 

Điểm khác biệt chính là không có phép toán số thực. Không có JNI (JavaNative Interface Support) do đó không thể truy xuất các chương trình khác được viết bằng ngôn ngữ của thiết bị (như C hay C++). Luồng (thread) được cho phép nhưng không có các nhóm luồng (thread group).

CLDC định nghĩa một mô hình an toàn, bảo mật được thiết kế để bảo vệ thiết bị di động, KVM, và các ứng dụng khác khỏi các mã phá hoại. Hai bộ phận được định nghĩa bởi CLDC này là bộ tiền kiểm tra và mô hình sandbox.

Hình 2 biểu diễn cách mà bộ tiền kiểm tra và bộ kiểm tra làm việc với nhau để kiểm

Trạm phát triển

Hello.class

Bộ tiền kiểm tra

Hello.class

Download về thiết bị

Thiết bị đích

Bộ kiểm tra

Bộ biên dịch mã bytecode Java

tra mã chương trình Java trước khi chuyển nó cho KVM.

5

Hình 2: Sơ đồ kiểm tra của bộ tiền kiểm tra và bộ kiểm tra.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Bộ tiền kiểm tra

Các tập tin lớp được gán nhãn bằng một thuộc tính trên máy trạm. Thuộc tính này

sau đó được bộ tiền kiểm tra kiểm tra trước khi mã chương trình được giao cho KVM hay

bộ biên dịch mã bytecode.

Một bộ phận khác của bảo mật trong CLDC là mô hình sandbox.

API

Tài nguyên thiết bị

Class Loader

Chương trình ứng dụng Java

API

Các CLDC API

API

Các MIDP API

Hệ thống JVM

Hình 3 biểu diễn khái niệm mô hình sandbox:

Hình 3: Mô hình Sandbox.

Mô hình Sandbox

Ứng dụng J2ME đặt trong một sandbox bị giới hạn truy xuất đến tài nguyên của

thiết bị và không được truy xuất đến Máy ảo Java hay bộ nạp chương trình. Ứng dụng được truy xuất đến các API của CLDC và MIDP. Ứng dụng được truy xuất tài nguyên

của thiết bị di động chỉ khi nhà sản xuất điện thoại di động cung cấp các API tương ứng. Nhưng các API này không phải là một phần của J2ME.

Thế hệ kế tiếp của CLDC là đặc tả JSR - 139 và được gọi là CLDC thế hệ kế tiếp.

6

Nó sẽ nhắm đến các vấn đề như nâng cao việc quản lý lỗi và có thể phép toán số thực.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 4: J2ME và J2SE.

2.4. Các đặc điểm khác

Khi viết J2ME, do đặc tính cần nhỏ gọn và bảo mật tốt cho thiết bị di động nên Sun đã lược bớt các lớp đồ sộ chỉ để lại các lớp c ơ bản, do vậy, về bản chất J2ME là ngôn ngữ kế thừa và tinh lược của phiên bản J2SE.

Bên cạnh đó nhưng MIDP vì được viết cho thiết bị có cấu hình lẫn bộ nhớ thấp nên

nó không hỗ trợ:

Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rất nhiều tài nguyên CPU và phần lớn các CPU cho các thiết bị di động không hỗ trợ phép tính này, do đó MIDP cũng không có.

  Bộ nạp class (Class Loader). Hỗ trợ từ khóa finalize() như trong J2SE: Việc “dọn dẹp“ tài nguyên trước

khi nó bị xóa được đẩy về phía các lập trình viên.

Hỗ trợ hạn chế thao tác bắt lỗi.

  Phần lớn các thư viện API cho Swing và AWT không thể sử dụng được

trong MIDP. 

Không hỗ trợ các tính năng quản lý file và thư mục: Đây có thể làm bạn ngạc nhiên nhưng thực tế là các thiết bị J2ME không có hỗ trợ các thiết bị lưu trữ thông

thường như ổ cứng v.v. Tuy nhiên, điều đó không có nghĩa là bạn phải mất đi mọi dữ liệu quan trọng mỗi khi tắt máy, Sun đã cung cấp một chức năng khác tương đương gọi là

7

Record Management system (RMS) để cung cấp khả năng lưu trữ cho các thiết bị này.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 3. Công nghệ lập trình J2ME trên thiết bị di động

3.1. Kiến trúc

Hình 5: Kiến trúc J2ME.

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 đặc tính, ví dụ như:

o o o Kiểu và số lượng bộ nhớ Kiểu và tốc độ vi xử lý Kiểu mạng kết nối

Do đây là các đặc tả nên nhà sản xuất thiết bị đầu cuối 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ể. Ví dụ như một lập trình viên viết chương

trình game cho điện thoại Samsung thì có thể sửa đổi chương trình một cách tối thiểu nhất để có thể chạy trên điện thoại Nokia…

Hiện nay Sun đưa ra hai dạng cấu hình:

 CLDC (Connected Limited Device Configuration-Cấu hình thiết bị kết nối

8

giới hạn): được thiết kế để nhằm vào thị trường các thiết bị cấp thấp, các thiết bị này

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

thông thường là máy điện thoại di động và PDA với khoảng 512 KB bộ nhớ. Vì tài

nguyên bộ nhớ hạn chế nen CLDC được gắn với Java không dây, dạng cho phép người

dùng mua hoặc tải về các ứng dụng Java, ví dụ như Midlet.

 CDC (Connected Device Configuration-Cấu hình thiết bị kết nối): 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 CLDC

nhưng vẫn yếu hơn 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 (thông thường trên 2 Mb) 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, các thiết bị gia dụng…

Cả hai dạng cấu hình kể trên đều chứa máy ảo Java – JVM (Java Virtual Machine) và tập hợp các lớp Java cơ bản để cung cấp một môi trường cho các ứng dụng J2ME. Tuy nhiên, với các thiết bị cấp thấp, do hạn chế về tài nguyên như bộ nhớ và bộ xử lý nên không thể yêu cầu máy ảo hỗ trợ tất cả các tính năng như máy ảo của J2SE, đơn cử, các

thiết bị thuộc CLDC không có phần cứng yêu cầu các phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không được yêu cầu hỗ trợ kiểu float và double.

9

Hình 6: Phân khúc dòng thiết bị với các ngôn ngữ Java.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

CLDC CDC

>=32Kb, <=512Kb >=256Kb RAM

>=128Kb, <=512Kb >=512Kb ROM

Có giới hạn Không giới hạn Nguồn năng lượng

Chậm Nhanh Network

Bảng so sánh các thông số kĩ thuật giữa CLDC và CDC

Profile: profile là mở rộng của configuration bằng cách thêm vào các lớp để bổ trợ các tính năng cho từng thiết bị chuyên biệt. Cả hai configuration đều có những profile liên quan và từ những profile này có thể dùng các lớp của nhau. Chính vì vậy mà do mỗi profile định nghĩa một tập hợp các lớp khác nhau nên thường thì ta không thể chuyển ứng dụng Java viết cho profile này sang một máy hỗ trợ profile khác. Cũng vì vậy mà không thể lấy ứng dụng viết trên J2SE hay J2EE để chạy trên máy hỗ trợ J2ME. Sau đây là một số profile tiêu biểu:

o Mobile Information Device Profile (MIDP): profile này sẽ bổ sung các tính

năng như hỗ trợ kết nối, các thành phần hỗ trợ giao diện người dùng … vào CLDC. Profile này được thiết kế chủ yếu để nhắm vào điện thọai di động với đặc tính là màn hình hiển thị hạn chế, dung lượng chứa có hạn. Do đó MIDP sẽ cung cấp một giao diện người dùng đơn giản và các tính năng mạng đơn giản dựa trên HTTP. Có thể nói MIDP là profile nổi tiếng nhất bởi vì nó là kiến thức cơ bản cho lập trình Java trên các máy di động (Wireless Java).

o PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA với

màn hình và bộ nhớ lớn hơn.

o Foundation Profile: cho phép mở rộng các tính năng của CDC với phần lớn

các thư viện của bộ Core Java2 1.3.

Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile.

3.2. Các lớp của J2ME

Mục tiêu của J2ME là giúp các lập trình viên viết các ứng dụng độc lập với thiết bị

10

di động, viết một lần đúng mọi chỗ, không cần quan tâm đến phần cứng thực sự. Để làm

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

điều này, J2ME được xây dựng bằng các tầng (layer) khác nhau để giấu đi việc thực hiện

Các API khác

Hiện trạng: MIDP

Cấu hình CLDC

Máy ảo Java

Phần cứng thiết bị

phần cứng khỏi nhà phát triển.

Hình 7: Các lớp của J2ME.

3.3. Các tầng của CLDC J2ME

Mỗi tầng trên tầng hardware là tầng trừu tượng hơn cung cấp cho lập trình viên

nhiều giao diện lập trình ứng dụng (API-Application Program Interface) thân thiện hơn.

Từ dưới lên trên:

 Tầng phần cứng thiết bị (Device hardware layer):

Đây chính là cấu hình thực sự của thiết bị di động với cấu hình phần cứng như bộ nhớ hay cấu hình của nó. Đây độc lập với J2ME nhưng nó là nơi xuất phát. Mỗi thiết bị di

động và các nhà sản xuất khác nhau thì thường có các bộ vi xử lý khác nhau cùng với các tập mã lệnh khác nhau. Mục tiêu của J2ME là cung cấp một chuẩn chung cho tất cả các

thiết bị di động khác nhau này.

 Tầng máy ảo Java (Java Virtual Machine Layer):

11

Khi mã nguồn Java được biên dịch nó được chuyển đồi thành mã bytecode. Mã này sau đó được chuyển thành mã ngôn ngữ máy của thiết bị di động. Tầng máy ảo Java bao gồm KVM (K Virtual Machine) là bộ biên dịch mã bytecode có nhiệm vụ chuyển mã bytecode của chương trình Java thành ngôn ngữ máy để chạy trên thiết bị di động. Tầng

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

này cung cấp một sự chuẩn hóa cho các thiết bị di động để ứng dụng J2ME sau khi đã

biên dịch có thể hoạt động trên bất kỳ thiết bị di động nào có J2ME KVM.

 Tầng cấu hình (Configuration Layer)

Tầng cấu hình của CLDC định nghĩa giao diện ngôn ngữ Java (Java language

interface) cơ bản để cho phép chương trình Java chạy trên thiết bị di động. Đây là một tập

các API định nghĩa lõi của ngôn ngữ J2ME.

 Tầng hiện trạng (Profile Layer)

Tầng hiện trạng hay MIDP ( Mobile Information Device Profile ) cung cấp tập các

API hữu dụng hơn cho lập trình viên. Mục đích của hiện trạng là xây dựng trên lớp cấu

hình và cung cấp nhiều thư viện ứng dụng hơn. MIDP định nghĩa các API riêng biệt cho thiết bị di động. Cũng có thể có các hiện trạng và các API khác ngoài MIDP được dùng cho ứng dụng. Ví dụ, có thể có hiện trạng PDA định nghĩa các lớp và phương thức hữu dụng cho việc tạo các ứng dụng PDA (lịch, sổ hẹn, sổ địa chỉ…). Cũng có thể có một hiện trạng định nghĩa các API cho việc tạo các ứng dụng Bluetooth. Thực tế, các hiện trạng kể trên và tập các API đang được xây dựng. Chuẩn hiện trạng PDA là đặc tả JSR-75 và chuẩn Bluetooth API là đặc tả JSR-82 với JSR là viết tắt của Java Specification Request.

3.4. Tầng máy ảo Java

Vai trò của máy ảo Java hay KVM là dịch mã bytecode được sinh ra từ chương trình Java đã biên dịch sang ngôn ngữ máy. Chính KVM sẽ chuẩn hóa output của các chương trình Java cho các thiết bị di động khác nhau có thể có bộ vi xử lý và tập lệnh khác nhau. Không có KVM, các chương trình Java phải được biên dịch thành tập lệnh cho mỗi thiết bị di động. Như vậy lập trình viên phải xây dựng nhiều đích cho mỗi loại thiết bị di động.

12

Hình dưới đây biểu diễn tiến trình xây dựng ứng dụng MIDlet hoàn chỉnh và vai trò của KVM.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Trạm phát triển

Tập tin JAR

Tập tin nguồn Java *.java

Tập tin lớp Java *.class

Bộ biên dịch và bộ tiền kiểm tra Java

Tập tin lớp Java *.class

Tập tin nguồn Java *.java

Thiết bị đích

Mã bytecode

Mã máy

Bộ biên dịch mã bytecode KVM

Hình 8: Tiến trình xây dựng MIDlet.

Quá trình phát triển ứng dụng MIDlet với IDE ( Intergrated Development

Environment ):

Lập trình viên: Bước đầu tiên là lập trình viên phải tạo mã nguồn Java, có thể có

nhiều tập tin (*.java).

Trên IDE:

Bộ biên dịch Java (Java Compiler): Biên dịch mã nguồn thành mã bytecode.

Mã bytecode này sẽ được KVM dịch thành mã máy. Mã bytecode đã biên dịch sẽ

được lưu trong các tập tin *.class và sẽ có một tập tin *.class sinh ra cho mỗi lớp Java.

Bộ tiền kiểm tra (Preverifier): Kiểm tra tính hợp lệ của mã bytecode. Một trong

13

những yêu cầu an toàn của J2ME là bảo đảm mã bytecode chuyển cho KVM là hợp lệ và không truy xuất các lớp hay bộ nhớ ngoài giới hạn của chúng. Do đó tất cả các lớp đều

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

phải được tiền kiểm tra trước khi chúng có thể được download về thiết bị di động. Việc

tiền kiểm tra được xem là một phần của môi trường phát triển làm cho KVM có thể được

thu nhỏ hơn. Bộ tiền kiểm tra sẽ gán nhãn lớp bằng một thuộc tính (attribute) đặc biệt chỉ

rằng lớp đó đã được tiền kiểm tra. Thuộc tính này tăng thêm khoảng 5% kích thước của

lớp và sẽ được kiểm tra bởi bộ kiểm tra trên thiết bị di động.

Trên IDE: Tạo tập tin JAR. IDE sẽ tạo một tập tin JAR chứa:

o Tất cả các tập tin *.class

o Các hình ảnh của ứng dụng. Hiện tại chỉ hỗ trợ tập tin *.png

o Các tập tin dữ liệu có thể được yêu cầu bởi ứng dụng

o Một tập tin kê khai (manifest.mf) cung cấp mô tả về ứng dụng cho bộ quản lý

ứng dụng (application manager) trên thiết bị di động.

o Tập tin JAR được bán hoặc được phân phối đến người dùng đầu cuối

Sau khi đã gỡ rối và kiểm tra mã lệnh trên trình giả lập (simulator), mã lệnh đã sẵn

sàng được kiểm tra trên điện thoại di động và sau đó được phân phối cho người dùng.

Người dùng: Download ứng dụng về thiết bị di động. Người dùng sau đó download tập tin JAR chứa ứng dụng về thiết bị di động. Trong hầu hết các điện thoại di động, có ba cách để download ứng dụng:

o Kết nối cáp dữ liệu từ PC sang cổng dữ liệu của điện thoại di động :Việc này yêu cầu người dùng phải có tập tin JAR thật sự và phần mềm truyền thông để download ứng dụng sang thiết bị thông qua cáp dữ liệu.

o Cổng hồng ngoại IR (Infra Red) Port: Việc này yêu cầu người dùng phải có tập tin JAR thật sự và phần mềm truyền thông để download ứng dụng sang thiết bị

thông qua cổng hồng ngoại.

o OTA (Over the Air): Sử dụng phương thức này, người dùng phải biết địa chỉ

URL chỉ đến tập tin JAR.

Trên thiết bị di động:

14

Bộ tiền kiểm tra: Kiểm tra mã bytecode.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Bộ tiền kiểm tra kiểm tra tất cả các lớp đều có một thuộc tính hợp lệ đã được thêm

vào bởi bộ tiền kiểm tra trên trạm phát triển ứng dụng. Nếu tiến trình tiền kiểm tra thất bại

thì ứng dụng sẽ không được download về thiết bị di động.

Bộ quản lý ứng dụng: Lưu trữ chương trình.

Bộ quản lý ứng dụng trên thiết bị di động sẽ lưu trữ chương trình trên thiết bị di

động. Bộ quản lý ứng dụng cũng điều khiển trạng thái của ứng dụng trong thời gian thực

thi và có thể tạm dừng ứng dụng khi có cuộc gọi hoặc tin nhắn đến.

Người dùng: Thực thi ứng dụng.

Bộ quản lý ứng dụng sẽ chuyển ứng dụng cho KVM để chạy trên thiết bị di động.

KVM: Thực thi mã bytecode khi chương trình chạy.

KVM dịch mã bytecode sang ngôn ngữ máy của thiết bị di động để chạy.

3.5 . Tầng cấu hình

Tầng J2ME kế trên tầng KVM là CLDC hay Cấu hình thiết bị kết nối giới hạn. Mục đích của tầng này là cung cấp một tập tối thiểu các thư viện cho phép một ứng dụng Java chạy trên thiết bị di động. Nó cung cấp cơ sở cho tầng Hiện trạng, tầng này sẽ chứa nhiều API chuyên biệt hơn.

CLDC – Connected Limited Device Configuration:

Phạm vi: Định nghĩa các thư viện tối thiểu và các API.

Định nghĩa:

o Tương thích ngôn ngữ JVM

o Các thư viện lõi

o I/O

o Mạng

o Bảo mật

o Quốc tế hóa

15

Không định nghĩa:

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

o Chu kỳ sống ứng dụng

o Giao diện người dùng

o Quản lý sự kiện

o Giao diện ứng dụng và người dùng

Các lớp lõi Java cơ bản, input/output, mạng, và bảo mật được định nghĩa trong

CLDC. Các API hữu dụng hơn như giao diện người dùng và quản lý sự kiện được dành

cho hiện trạng MIDP.

3.6 . Tầng hiện trạng

Tầng J2ME cao nhất là tầng hiện trạng và mục đích của nó là định nghĩa các API cho các thiết bị di động. Một thiết bị di động có thể hỗ trợ nhiều hiện trạng. Một hiện trạng có thể áp đặt thêm các giới hạn trên các loại thiết bị di động (như nhiều bộ nhớ hơn hay độ phân giải màn hình cao hơn). Hiện trạng là tập các API hữu dụng hơn cho các ứng dụng cụ thể. Lập trình viên có thể viết một ứng dụng cho một hiện trạng cụ thể và không cần quan tâm đến nó chạy trên thiết bị nào.

3.7 . MIDlet

HelloWorld.java

import javax.microedition.midlet.* import java.lang.Math.* public class HelloWorld extends MIDlet

MIDP

CLDC

Các ứng dụng J2ME được gọi là MIDlet (Mobile Information Device applet).

Hình 9: MIDlet

16

Thông báo import dùng để truy xuất các lớp của CLDC và MIDP.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Lớp chính của ứng dụng được định nghĩa là lớp kế thừa lớp MIDlet của MIDP. Có

thể chỉ có một lớp trong ứng dụng kế thừa 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).

3.7.1. Bộ khung MIDlet

Một MIDlet là một lớp Java kế thừa (extend) của lớp trừu tượng

java.microedition.midlet.MIDlet và thực thi (implement) các phương thức startApp(),

1

2

3

4

5

public MIDletExample() {} public void startApp() {} public void pauseApp() {} public void destroyApp(boolean unconditional) {}

6

import javax.microedition.midlet.*; public class MIDletExample extends MIDlet { }

pauseApp(), và destroyApp().

Hình 10: Bộ khung yêu cầu tối thiểu cho một ứng dụng MIDlet.

Bộ khung MIDlet

1) Phát biểu import

Các phát biểu import được dùng để include các lớp cần thiết từ các thư viện CLDC

và MIDP.

2) Phần chính của MIDlet

MIDlet được định nghĩa như một lớp kế thừa lớp MIDlet. Trong ví dụ này

MIDletExample là bắt đầu của ứng dụng.

3) Hàm tạo (Constructor)

Hàm tạo chỉ được thực thi một lần khi MIDlet được khởi tạo lần đầu tiên. Hàm tạo

sẽ không được gọi lại trừ phi MIDlet thoát và sau đó khởi động lại.

17

4) startApp()

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

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.

5) pauseApp()

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.

6) destroyApp()

Phương thức destroyApp() được gọi khi thoát MIDlet. (ví dụ khi nhấn nút exit trong

ứng dụng). Nó chỉ đơn thuần là thoát MIDlet. Nó không thật sự xóa ứng dụng khỏi điện thoại di động. Phương thức destroyApp() chỉ nhận một tham số Boolean. Nếu tham số này là true, MIDlet được tắt vô điều kiện. Nếu tham số là false, MIDlet có thêm tùy chọn từ chối thoát bằng cách ném ra một ngoại lệ MIDletStateChangeException.

Tóm tắt các trạng thái khác nhau của MIDlet:

Tạo (Created)  Hàm tạo MIDletExample() được gọi một một lần.

Hoạt động (Active)  Phương thức startApp() được gọi khi chương trình bắt đầu

hay sau khi tạm dừng.

Tạm dừng (Paused)  Phương thức pauseApp() được gọi. Có thể nhận các sự kiện

timer.

Hủy (Destroyed)  Phươ ức destroy() được gọi.

18

3.7.2. Chu kỳ sống của MIDlet

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

destroyApp()

startApp()

destroyApp()

Chương trình được tạo

Tạm dừng

Hoạt động

Hủy

pauseApp()

Hình 11: Chu kỳ sống của MIDlet.

Chu kỳ sống của MIDlet

Khi người dùng yêu cầu khởi động ứng dụng MIDlet, bộ quản lý ứng dụng sẽ thực thi MIDlet (thông qua lớp MIDlet). Khi ứng dụng thực thi, nó sẽ được xem là đang ở trạng thái tạm dừng. Bộ quản lý ứng dụng gọi h àm tạo và hàm startApp(). Hàm startApp() có thể được gọi nhiều lần trong suốt chu kỳ sống của ứng dụng. Hàm destroyApp() chỉ có thể gọi từ trạng thái hoạt động hay tạm dừng.

Lập trình viên cũng có thể điều khiển trạng thái của MIDlet.

Các phương thức dùng để điều khiển các trạng thái của MIDlet:

resumeRequest(): Yêu cầu vào chế độ hoạt động

Ví dụ: Khi MIDlet tạm dừng, và một sự kiện timer xuất hiện.

notifyPaused(): Cho biết MIDlet tự nguyện chuyển sang trạng thái tạm dừng

Ví dụ: Khi đợi một sự kiện timer.

notifyDestroyed(): Sẵn sàng để hủy

Ví dụ: Xử lý nút nhấn Exit

Lập trình viên có thể yêu cầu tạm dừng MIDlet trong khi đợi một sự kiện timer

hết hạn. Trong trường hợp này, phươ ức notifyPaused() sẽ được dùng để yêu cầu

19

bộ quản lý ứng dụng chuyển ứng dụng sang trạng thái tạm dừng.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

3.7.3. Tập tin JAR

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 download xuống điện thoại di động.

Tập tin JAR chứa tất cả các 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.

3.7.4. Tập tin kê khai và JAD

Tập tin kê khai (manifest.mf) và tập tin JAD (Java Application Descriptor) mô tả

các đặc điểm của MIDlet. Sự khác biệt của hai tập tin này là tập tin kê khai là một phần của tập tin JAR còn tập tin JAD không thuộc tập tin JAR. Ưu điểm của tập tin JAD là các đặc điểm của MIDlet có thể được xác định trước khi download tập tin JAR. Nói chung, cần ít thời gian để download một tập tin văn bản nhỏ hơn là download một tập tin JAR. Như vậy, nếu người dùng muốn download một ứng dụng không được thiết bị di động hỗ trợ (ví dụ, MIDP 2.0), thì quá trình download sẽ bị hủy bỏ thay vì phải đợi download hết toàn bộ tập tin JAR.

Mô tả nội dung của tập tin JAR:

Các trường yêu cầu

// Phiên bản tập tin Manifest

// Tên bộ MIDlet (MIDlet suite) // Phiên bản bộ MIDlet

// Nhà sản xuất MIDlet // Tên của MIDlet

// Phiên bản hiện trạng

20

o Manifest-Version o MIDlet-Name o MIDlet-Version o MIDlet-Vendor o MIDlet- for each MIDlet o MicroEdtion-Profile o MicroEdtion-Configuration // Phiên bản cấu hình

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Ví dụ một tập tin manifest.mf:

MIDlet-Name: CardGames

MIDlet-Version: 1.0.0

MIDlet-Vendor: Sony Ericsson

MIDlet-Description: Set of Card Games

MIDlet-Info-URL: http://www.semc.com/games

MIDlet-Jar-URL: http://www.semc.com/j2me/games

MIDlet-Jar-Size: 1063

MicroEdtion-Profile: MIDP-1.0

MicroEdtion-Configuration: CLDC-1.0

MIDlet-1: Solitaire, /Sol.png, com.semc.Solitaire

MIDlet-2: BlackJack, /Blkjk.png, com.semc.BlackJack

Tập tin JAD chứa cùng thông tin như tập tin manifest. Nhưng nó nằm ngoài tập tin

JAR.

Các thuộc tính MIDlet-Name, MIDlet-Version, và MIDlet-Vendor phải được lặp lại trong tập tin JAD và JAR. Các thuộc tính khác không cần phải lặp lại. Giá trị trong tập tin mô tả sẽ đè giá trị của tập tin manifest.

3.7.5. Bộ MIDlet

Một tập các MIDlet trong cùng một tập tin JAR được gọi là một bộ MIDlet (MIDlet suite). Các MIDlet trong một bộ MIDlet chia sẻ các lớp, các hình ảnh, và dữ liệu lưu trữ

21

bền vững. Để cập nhật một MIDlet, toàn bộ tập tin JAR phải được cập nhật.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Bộ MIDlet 1

Bộ MIDlet 2

MIDlet1, MIDlet2, MIDlet3

MIDlet4

midlet4.class

midlet1.class

Lưu trữ bền vững 1

funstuff.class

Lưu trữ bền vững 4

midlet2.class

Lưu trữ bền vững 2

afile.class

midlet3.class

Lưu trữ bền vững 3

needed.class

Hình 12: Hai bộ MIDlet.

Các bộ MIDlet

Trong hình trên, một bộ MIDlet chứa MIDlet1, MIDlet2, và MIDlet3. Bộ kia chỉ chứa MIDlet4. Ba MIDlet trong bộ đầu tiên truy xuất các lớp và dữ liệu của nhau nhưng

không truy xuất đến các lớp hay dữ liệu của MIDlet4. Ngược lại, MIDlet4 cũng không truy xuất được các lớp, hình ảnh, và dữ liệu của chúng.

22

[ Nguồn [9] ].

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 4. Một số công nghệ trong J2ME

4.1. Đồ họa

Các lớp MIDP cung cấp hai mức đồ họa: đồ họa mức thấp và đồ họa mức cao. Đồ

họa mức cao dùng cho văn bản hay form. Đồ họa mức thấp dùng cho các ứng dụng trò

chơi yêu phải vẽ lên màn hình.

4.1.1. Đồ họa mức cao

Đồ 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ư text

box, form, list, và alert. Ta ít điều khiển sắp xếp các thành phần trên màn hình. Việc sắp xếp thật sự phụ thuộc vào nhà sản xuất.

4.1.1.1. Text Box

Lớp TextBox cho phép người dùng nhập và soạn thảo văn bản. Lập trình viên có thể định nghĩa số ký tự tối đa, giới hạn loại dữ liệu nhập (số học, mật khẩu, email,…) và hiệu chỉnh nội dung của textbox. Kích thước thật sự của textbox có thể nhỏ hơn yêu cầu khi thực hiện thực tế (do giới hạn của thiết bị). Kích thước thật sự của textbox có thể lấy bằng

phương thức getMaxSize().

4.1.1.2. Form

Form là lớp hữu dụng nhất của các lớp Screen bởi vì nó cho phép chứa nhiều item trên cùng một màn hình. Các item có thề là DateField, TextField, ImageItem, TextItem, ChoiceGroup.

4.1.1.3. List

Lớp List là một Screen chứa danh sách các lựa chọn chẳng hạn như các radio

button. Người dùng có thể tương tác với list và chọn một hay nhiều item.

4.1.1.4. Alert

23

Alert hiển thị một màn hình pop-up trong một khoảng thời gian. Nói chung nó dùng để cảnh báo hay báo lỗi. Thời gian hiển thị có thể được thiết lập bởi ứng dụng. Alert có

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

thể được gán các kiểu khác nhau (alarm, confirmation, error, info, warning), các âm th anh

tương ứng sẽ được phát ra.

4.1.1.5. Form và các Form Item

Sử dụng form cho phép nhiều item khác nhau trong cùng một màn hình. Lập trình

viên không điều khiển sự sắp xếp các item trên màn hình. Sau khi đã định nghĩa đối tượng

Form, sau đó sẽ thêm vào các item.

Mỗi item là một lớp con của lớp Item:

4.1.1.5.1. String Item

Public class StringItem extends Item

StringItem chỉ là một chuỗi hiển thị mà người dùng không thể hiệu chỉnh. Tuy

nhiên, cả nhãn và nội dung của StringItem có thể được hiệu chỉnh bởi ứng dụng.

4.1.1.5.2. Image Item

public class ImageItem extends Item

ImageItem cho phép thêm vào hình form. ImageItem chứa tham chiếu đến một đối

tượng Image phải được tạo trước đó.

4.1.1.5.3. Text Field

public class TextField extends Item

TextField cho phép người dùng nhập văn bản. Nó có thể có giá trị khởi tạo, kích

thước tối đa, và ràng buộc nhập liệu. Kích thước thật sự có thể nhỏ hơn yêu cầu do giới hạn của thiết bị di động.

4.1.1.5.4. Date Field

public class DateField extends Item

DateField cho phép người dùng nhập thông tin ngày tháng và thời gian. Có thể xác

định giá trị khởi tạo và chế độ nhập ngày tháng (DATE), thời gian (TIME), hoặc cả hai.

24

4.1.1.5.5. Choice Group

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

public class ChoiceGroup extends Item Implements Choice

ChoiceGroup cung cấp một nhóm các radio-button hay checkbox cho phép lựa chọn

đơn hay lựa chọn nhiều.

4.1.1.5.6. Gause

public class Gauge extends Item

Lớp Gauge cung cấp một hiển thị thanh (bar display) của một giá trị số học. Gauge

có thể có tính tương tác hoặc không. Nếu một gauge là tương tác thì người dùng có thể

thay đổi giá trị của tham số qua gauge. Gauge không tương tác chỉ đơn thuần là để hiển thị.

4.1.1.5.7. Ticker

Một màn hình có thể có một ticker là một chuỗi văn bản chạy liên tục trên màn hình.

Hướng và tốc độ là do thực tế qui định. Nhiều màn hình có thể chia sẻ cùng một ticker.

Ví dụ:

Ticker myTicker = new Ticker(“Useful Information”);

MainScreen = new Form(“Main Screen”);

MainScreen.setTicker(myTicker);

Ticker(String str)

public class Ticker extends Object

4.1.2. Đồ họa mức thấp

Đồ họa mức thấp là lớp con của lớp Canvas. Lớp này cung cấp các phương thức đồ họa cho phép vẽ lên màn hình hay vào một bộ đệm hình cùng với các phương thức xử lý

25

sự kiện bàn phím. Lớp này dùng cho các ứng dụng trò chơi cần điều khiển nhiều về màn hình.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Command

Displayable

Item

Canvas

DateField

Screen

TextField

TextBox

Gauge

Form

ImageItem

Alert

TextItem

List

ChoiceGroup

Choice

Nằm trong gói sau:

import javax.microedition.lcdui.*;

Hình 13. Phân cấp lớp đồ họa.

4. 2. Lập trình mạng

4.2.1. Khung mạng CLDC tổng quát

Mạng cho phép client di động gởi và nhận dữ liệu đến server. Nó cho phép thiết bị di động sử dụng các ứng dụng như tìm kiếm cơ sở dữ liệu, trò chơi trực tuyến… Trong

J2ME, mạng được chia làm hai phần. Phần đầu tiên là khung được cung cấp bởi CLDC và phần hai là các giao thức thật sự được định nghĩa trong các hiện trạng.

CLDC cung cấp một khung tổng quát để thiết lập kết nối mạng. Ý tưởng là nó là đưa ra một khung mà các hiện trạng khác nhau sẽ sử dụng. Khung CLDC không định nghĩa

26

giao thức thật sự. Các giao thức sẽ được định nghĩa trong các hiện trạng.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Socket: Comm ports: Datagrams: Files: HTTP:

Connector.open(“string”); Với định dạng string như sau: “:

;

Connector.open(“:

;”); Trả về một đối tượng Connection

Hình 14. Khung mạng CLDC tổng quát.

Kết nối mạng được xây dựng bằng phương thức open() của lớp Connector trong CLDC. Phương thức open() nhận một tham số đầu vào là chuỗi. Chuỗi này dùng để xác định giao thức. Định dạng của chuỗi là:

protocol:address;parameters

CLDC chỉ xác định tham số là một chuỗi nhưng nó không định nghĩa bất kỳ giao thức thật sự nào. Các hiện trạng có thể định nghĩa các giao thức kết nối như HTTP, socket, cổng truyền thông, datagram,… Phương thức open() trả về một đối tượng Connector. Đối tượng này sau đó có thể đóng vai trò là một giao thức xác định được định nghĩa trong hiện trạng.

Connector.open(“:

;”);

Một số giao thức ví dụ (nhưng không được hỗ trợ bởi CLDC hay MIDP):

Socket: Connector.open(“socket://199.3.122.21:1511”);

Comm port: Connector.open(“comm:0;baudrate=9600”);

Datagram: Connector.open(“Datagram://19.3.12.21:1511”);

Files: Connector.open(“file:/filename.txt”);

MIDP hỗ trợ giao thức HTTP:

27

HTTP: Connector.open(“http://www.sonyericsson.com”);

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Trả về một đối tượng Connection

Ví dụ trên minh họa kết nối socket, cổng truyền thông, datagram, file và HTTP. Tất

cả các kết nối mạng đều có cùng định dạng, không quan tâm đến giao thức thật sự. Nó chỉ

khác nhau ở chuỗi chuyển cho phương thức open(). Phương thức open() sẽ trả về một đối

tượng Connection đóng vai trò là lớp giao thức (ví dụ. HttpConnection) để có thể sử dụng

các phương thức cho giao thức đó. J2ME chỉ định nghĩa một kết nối là kết nối HTTP

trong MIDP.

4.2.2. Các lớp giao diện kết nối

Dẫn xuất từ lớp Connection là nhiều lớp giao diện con cung cấp khung kết nối

Connection c = Connector.open(url);

Connection

DatagramConnection

StreamConnectionNotifier

InputConnection

OutputConnection

StreamConnection

InputConnection

CLDC

MIDP

HttpConnection

mạng. Các giao diện khác nhau để hỗ trợ các loại thiết bị di động khác nhau.

Hình 15. Các lớp kết nối.

Sau đây là mô tả các giao diện kết nối được định nghĩa trong CLDC

28

StreamConnectionNotifier

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Giao diện StreamConnectionNotifier được dùng khi đợi một kết nối phía server

được thiết lập. Phương thức acceptAndOpen() bị chặn cho đến khi client thiết lập kết nối.

Giao diện DatagramConnection

Kết nối datagram cung cấp kiểu truyền thông gói không chứng thực. Datagram chứa

gói dữ liệu và địa chỉ. Chuỗi địa chỉ có định dạng sau:

datagram:[//{host}]:{port}

Nếu tham số host được xác định, thì datagram mở kết nối ở chế độ client. Nếu tham

số host không được xác định, thì datagram được mở ở chế độ server

c = Connector.open("datagram://192.365.789.100:1234"); // Chế độ client

c = Connector.open("datagram://:1234"); // Chế độ server

Giao diện InputConnection dùng để thực hiện một luồng nhập tuần tự dữ liệu chỉ đọc.

Giao diện InputConnection

Giao diện OutputConnection

Giao diện OutputConnection dùng để thực hiện một luồng xuất dữ liệu chỉ viết.

Giao diện StreamConnection

Giao diện StreamConnection là kết hợp của cả hai giao diện InputConnection và

OutputConnection. Nó dùng cho các thiết bị di động có truyền thông hai chiều.

Giao diện ContentConnection

Giao diện ContentConnection kế thừa giao diện StreamConnection và thêm vào các

phương thức getType(), getEncoding(), và getLength(). Nó cung cấp cơ sở cho giao diện HttpConnection của MIDP.

Giao diện HttpConnection

Giao diện HttpConnection được định nghĩa trong MIDP và kế thừa giao diện

ContentConnection của CLDC. Giao diện này cung cấp các phươ ức thiết lập một

29

kết nối HTTP.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

4.2.3. Kết nối HTTP

Hiện trạng MIDP hỗ trợ kết nối HTTP phiên bản 1.1 thông qua giao diện

HttpConnection. Hỗ trợ GET, POST, HEAD của HTTP. Yêu cầu GET (GET request)

được dùng để lấy dữ liệu từ server và đây là phương thức mặc định. Yêu cầu POST dùng

để gởi dữ liệu đến server. Yêu cầu HEAD tương tự như GET nhưng không có dữ liệu trả

về từ server. Nó có thể dùng để kiểm tra tính hợp lệ của một địa chỉ URL.

Phương thức open() của lớp Connector dùng để mở kết nối. Phương thức open() trả

về một đối tượng Connection sau đó có thể đóng vai trò là một HttpConnection cho phép

dùng tất cả các phương thức của HttpConnection.

Kết nối đã được tạo, gởi các tham số yêu cầu, chờ hồi đáp

Thiết lập

Kết nối

Đóng

Kết nối đến server chưa được tạo

openInputStream() openOutputStream() getLength() getType() getEncoding() getHeaderField() getResponseCode() getResponseMessage() getHeaderFieldInt() getHeaderFieldDate()

Đóng, kết nối không còn dùng được, các luồng I/O vẫn còn

30

Một kết nối HTTP có thể ở một trong ba trạng thái khác nhau: Thiết lập (Setup), Kết nối (Connectd), hay Đóng (Close). Trong trạng thái Thiết lập, kết nối chưa được tạo. Phương thức setRequestMethod() và setRequestProperty() chỉ có thể được dùng trong trạng thái thiết lập. Chúng được dùng để thiết lập phương thức yêu cầu (GET, POST, HEAD) và thiết lập thuộc tính HTTP (ví dụ. User-Agent). Khi sử dụng một phương thức yêu cầu gởi dữ liệu đến hay nhận dữ liệu về từ server sẽ làm cho kết nối chuyển sang trạng thái Kết nối. Gọi phương thức close() sẽ làm cho kết nối chuyển sang trạng thái Đóng.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 16. Các trạng thái kết nối HTTP.

Lưu ý rằng gọi bất kì phương thức nào liệt kê ở trên (ví dụ. openInputStream(),

getLenght()) cũng sẽ làm cho kết nối chuyển sang trạng thái Kết nối.

4.2.3.1. Ví dụ kết nối HTTP GET

Phương thức HTTP GET cho phép lấy dữ liệu từ server và là phương thức mặc định

nếu không xác định phương thức trong trạng thái Thiết lập.

Ví dụ thực hiện một kết nối HTTP GET cơ bản:

InputStream is = null;

} processBuffer(stringBuffer);

void getViaHttpConnection(String url) throws IOException { HttpConnection c = null; try { c = (HttpConnection)Connector.open(url); // Mở kết nối HTTP is = c.openInputStream(); // Mở Input Stream, mặc định GET type = c.getType(); int len = (int)c.getLength(); if (len > 0) { byte[] data = new byte[len]; int numBytes = is.read[data]; // Nếu biết chiều dài processData(data); } else { int ch; while ((ch = is.read()) != -1) { // đọc đến khi nào gặp -1 stringBuffer.append((char)ch); } } finally { if (is != null) is.close(); if (c != null) c.close(); } }

31

getViaHttpConnection() nhận một chuỗi là tham số đầu vào, đó là địa chỉ địa chỉ URL chuyển cho phương thức open() của lớp Connection. Phương thức open() trả về một

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

đối tượng Connection đóng vai trò là một lớp HttpConnection. Phương thức openInputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối. Vì không có yêu cầu phương thức nào, kết nối sẽ mặc định là một kết nối HTTP GET.

Phương thức getLength() sẽ trả về chiều dài của dữ liệu gởi từ server. Nếu biết được chiều dài, thì biến len sẽ chứa chiều dài dữ liệu và ta có thể đọc toàn bộ khối dữ liệu. Nếu không thì len sẽ chứa giá trị -1 và dữ liệu phải được đọc từng ký tự một cho đến khi gặp đánh dấu cuối file (-1). Phương thức processData() và processBuffer() xử lý dữ liệu đến từ server. Khối lệnh cuối cùng sẽ đóng tất cả các kết nối không quan tâm đến có lỗi từ khối lệnh try ở trước hay không.

4.2.3.2. Ví dụ kết nối HTTP POST

HTTP POST cho phép gởi dữ liệu đến server. Dữ liệu gởi đến server qua phương thức GET chỉ giới hạn là dữ liệu chứa địa chỉ URL. Phương thức POST cho phép gởi một luồng byte đến server. Phương thức HTTP POST thực hiện theo cách tương tự với phương thức HTTP GET.

Ví dụ thực hiện một kết nối HTTP POST:

InputStream is = null;

throw new IOException(“not OK”);

32

void postViaHttpConnection(String url) throws IOException { HttpConnection c = null; OutputStream os; try { c = (HttpConnection)Connector.open(url); // Mở kết nối // Thiết lập phương thức POST // trong khi vẫn ở trạng thái Thiết lập c.setRequestMethod(HttpConnection.POST); // Mở luồng output stream và chuyển sang trạng thái Kết nối os = c.openOutputStream(); // Chuyển đổi dữ liệu thành luồng byte // và gởi đến server os.write(“Data Sent to Server\n”.getBytes()); int status = c.getResponseCode(); // Kiểm tra status if (status != HttpConnection.HTTP_OK) int len = (int)c.getLength();

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

// Giống như ví dụ HTTP GET: // Kiểm tra length và xử lý tương ứng }

} finally { // Đóng kết nối giống như ví dụ HTTP GET }

Như ví dụ trước, phương thức postViaHttpConnection() nhận tham số đầu vào là một chuỗi là địa chỉ URL được chuyển đến phương thức open() của lớp Connection.

Phương thức open() trả về một đối tượng Connection đóng vai trò là một lớp

HttpConnection.

Kết nối bây giờ ở trong trạng thái thiết lập và phương thức yêu cầu được đặt là POST bằng phương thức setRequestMethod(). Tất cả các thuộc tính khác phải được thiết lập trong trạng thái này.

Phương thức openOutputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối.

Phương thức write() và flush() sẽ gởi dữ liệu đến server.

Đoạn mã còn lại giống như phương thức GET. Luồng input được mở, chiều dài của dữ liệu được kiểm tra, và dữ liệu được đọc toàn bộ khối hay từng ký tự một tùy vào chiều dài được trả về. Khối lệnh cuối cùng sẽ đóng kết nối.

4.2.4. Triệu gọi CGI script

Cả hai phương thức GET và POST có thể được dùng để triệu gọi CGI script (Common Gateway Interface script) và cung cấp dữ liệu nhập. Ví dụ, một MIDlet có một

form cho người dùng điền dữ liệu, sau đó có thể gởi dữ liệu kết quả cho server để CGI script xử lý. CGI script có thể được triệu gọi giống như phương thức GET và POST. Tên

của CGI script và dữ liệu tham số nhập có thể chuyển trong địa chỉ URL. Nếu cần gởi thêm dữ liệu cho server, thì có thể dùng phương thức POST.

Ví dụ các tham số được gởi là một phần của URL:

url = http://www.asite.com/cgi-bin/getlocation.cgi?location+name=abc&zip=12345

Trong ví dụ trên, địa chỉ URL có thể được chuyển như là một tham số giống như

33

phương thức getViaHttpConnection() ở ví dụ trước.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

4.2.5. HTTP Request Header

HTTP request header phải được thiết lập ở trạng thái Thiết lập bằng phương thức

setRequestMethod() và setRequestProperty(). Phương thức setRequestMethod() dùng để

thiết lập các phương thức GET, POST, hoặc HEAD.

Phương thức setRequestProperty() dùng để thiết lập các trường trong request header.

Ví dụ có thể là “Accept-Language”, “If-Modified-Since”, “User-Agent”.

Phương thức getRequestMethod() và getRequestProperty() có thể được dùng để lấy

các thuộc tính trên.

4.3. Wireless Messaging API

J2ME chứa hầu hết các cấu hình và hiện trạng, kết hợp với nhau để định nghĩa môi trường thực thi Java hoàn chỉnh cho các thiết bị có tài nguyên giới hạn. Tuy nhiên, đôi khi, cần phải có gói giao diện lập trình ứng dụng (Application Programming Interface –

API), có thể chi xẻ bởi các ứng dụng chạy trên các hiện trạng khác nhau. J2ME định nghĩa API như vậy là các gói tùy chọn (optional package), là một tập các lớp và các tài nguyên khác có thể được dùng kết hợp với hiện trạng.

Cũng giống như các thành phần của J2ME, các gói tùy chọn được định nghĩa là yêu cầu đặc tả Java (Java Specification Request – JSR) thông qua Java Community Process. Một trong những gói tùy chọn đầu tiên cho J2ME là JSR 120, bộ API nhắn tin không dây (Wireless Messaging API – WMA), dùng để gởi và nhận các tin nhắn văn bản hoặc nhị phân ngắn trên kết nối không dây. WMA dựa trên khung kết nối mạng tổng quát (GCF).

Các tin nhắn được gởi và nhận với WMA được gởi trên các mạng không dây của điện thoại di động và các thiết bị tương tự khác, có thể là GSM hay CDMA. WMA hỗ trợ

Short Message Service (SMS) và Cell Broadcast Short Message Service (CBS). Mặc dù tin nhắn WMA tương tự như datagram, WMA không sử dụng giao diện datagram được

định nghĩa bởi GCF, giao diện này dùng cho kết nối UDP. Thay vào đó, WMA định nghĩa một tập giao diện mới trong gói java.wireless.messaging.

34

Để gởi hoặc nhận tin nhắn, ứng dụng trước hết phải tạo một instance của giao diện MessageConnection, sử dụng GCF connection factory. Địa chỉ URL chuyển cho phương

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

thức java.microedition.io.Connector.open() chỉ định giao thức sử dụng (SMS hoặc CBS),

và số điện thoại đích, cổng, hoặc cả hai. Ví dụ, đây là những URL hợp lệ:

sms://+417034967891 sms://+417034967891:5678 sms://:5678 cbs://:5678

URL trong hai dạng đầu tiên mở kết nối client, ứng dụng kết nối đến một server với

địa chỉ thiết bị và cổng chỉ định. Nếu cổng không chỉ định, sẽ dùng cổng nhắn tin mặc

định của ứng dụng. Dạng URL thứ ba mở một kết nối server trên thiết bị, cho phép ứng

dụng đợi và hồi đáp tin nhắn đến từ các thiết bị khác. Dạng cuối cùng cho phép ứng dụng lắng nghi tin nhắn broadcast từ người điều hành mạng.

Sau đây là một ví dụ đơn giản tạo một kết nối SMS client:

35

import java.microedition.io.*; import java.wireless.messaging.*; ..... MessageConnection conn = null; String url = "sms://+417034967891"; try { conn = (MessageConnection) Connector.open( url ); // thực hiện công việc gì đó } catch( Exception e ){ // xử lý lỗi } finally { if( conn != null ){ try { conn.close(); } catch( Exception e ){} } } Để gởi tin nhắn, sử dụng phương thức MessageConnection.newMessage() để tạo một tin nhắn rỗng, thiết lập payload của nó (dữ liệu văn bản hoặc nhị phân để gởi), và triệu gọi phương thức MessageConnection.send():

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

public void sendText( MessageConnection conn, String text ) throws IOException, InterruptedIOException { TextMessage msg = conn.newMessage( conn.TEXT_MESSAGE ); msg.setPayloadText( text ); conn.send( msg ); } Gởi dữ liệu nhị phân cũng hoàn toàn tương tự: public void sendBinary( MessageConnection conn, byte[] data ) throws IOException, InterruptedIOException { BinaryMessage msg = conn.newMessage( conn.BINARY_MESSAGE ); msg.setPayloadData( data ); conn.send( msg ); }

Dĩ nhiên, có giới hạn lượng dữ liệu có thể gởi trong một tin nhắn. Thông thường, tin

nhắn văn bản SMS bị giới hạn đến 160 hoặc 70 ký tự, tin nhắn nhị phân bị giới hạn đến 140 bytes.

Nhận tin nhắn thậm chí còn đơn giản hơn: Sau khi mở một kết nối server, ứng dụng gọi phương thức receive() của kết nối, phương thức này sẽ trả về tin nhắn có trong cổng đã xác định. Nếu không có tin nhắn, phương thức sẽ đứng (block) cho đến khi có tin nhắn, hoặc cho đến khi có một thread khác đóng kết nối:

36

import java.io.*; import java.microedition.io.*; import java.wireless.messaging.*; MessageConnection conn = null; String url = "sms://:5678"; // không có số điện thoại! try { conn = (MessageConnection) Connector.open( url ); while( true ){ Message msg = conn.receive(); // blocks if( msg instanceof BinaryMessage ){

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

byte[] data = ((BinaryMessage) msg).getPayloadData(); // thực hiện công việc gì đó } else { String text = ((TextMessage) msg).getPayloadText(); //thực hiện công việc gì đó } } } catch( Exception e ){ //xử lý lỗi } finally { if( conn != null ){ try { conn.close(); } catch( Exception e ){} } } Để bảo đảm tính ổn định của chương trình, việc gởi và nhận thông điệp nên giao cho một thread riêng đảm nhận. [ Nguồn [9] ].

37

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 5. Xây dựng ứng dụng thử nghiệm

5.1. Giới thiệu ứng dụng

5.1.1. Mục tiêu

Xây dựng một ứng dụng trên thiết bị di động nhằm trợ giúp người dùng cập nhật

các thông tin mà người dùng quan tâm thông qua các thông tin đã xuất bản trên Web

Services.

Bằng phương pháp này, người dùng sẽ có được các thông tin chọn lọc nhất mà họ

không phải tốn thời gian ngồi lướt web, thay vào đó, họ có thể đi đến bất cứ đâu chỉ với thiết bị di động nhỏ gọn trong tay là có thể cập nhật thông tin họ quan tâm.

5.1.2. Ứng dụng thử nghiệm

Chương trình ứng dụng được viết bằng ngôn ngữ J2ME phục vụ thiết bị di động của

người dùng có hỗ trợ dòng ngôn ngữ này.

Phía dịch vụ cung cấp nội dung được xây dựng trên ngôn ngữ PHP và cơ sở dữ

liệu mySQL.

Nội dung được web-services trả về theo chuẩn XML và được ứng dụng chạy trên

thiết bị di động phân tách, xử lý và hiển thị trên màn hình.

5.2. Các công nghệ sử dụng trong chương trình

5.2.1. Lightweight UI Toolkit (LWUIT)

LWUIT là một thư viện nhỏ dựa trên Swing nhưng được thiết kế cho các thiết bị

38

mang tính chất nhỏ gọn. LWUIT hỗ trợ giao diện một cách linh hoạt v à mạnh mẽ, với các thành phần và các lớp phân tầng riêng biệt.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 17: Các phân tầng lớp trong LWUIT.

Với bộ thư viện nhỏ gọn này, người lập trình sẽ có một phương thức riêng để tương

tác và làm việc với môi trường MIDP trên thiết bị di động.

Ví dụ hiển thị Hello world

39

import com.sun.lwuit.Display; import com.sun.lwuit.Form; import com.sun.lwuit.Label; import com.sun.lwuit.layouts.BorderLayout; import com.sun.lwuit.plaf.UIManager; import com.sun.lwuit.util.Resources; public class HelloMidlet extends javax.microedition.midlet.MIDlet { public void startApp() { Display.init(this); try { Resources r = Resources.open("/LWUIT.res"); UIManager.getInstance().setThemeProps(r.getTheme( r.getThemeResourceNames()[0]) ); } catch (java.io.IOException e) { } Form f = new Form(); f.setTitle("Hello World");

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

f.setLayout(new BorderLayout()); f.addComponent("Center", new Label("I am a Label")); f.show(); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

Sau khi biên dịch ta thu được kết quả như hình dưới

Hình 18 : Ứng dụng thử nghiệm với LWUIT.

Việc giới thiệu chi tiết và đầy đủ các lớp và phương thức của bộ thư viện LWUIT

https://lwuit.dev.java.net/

này nằm ngoài nội dung của tài liệu, người đọc có thể tìm hiểu chi tiết tại địachỉ:

5.2.2. XML

XML (Extensible Markup Language) là một tập các quy tắc để mã hóa tài liệu điện tử. Nó được định nghĩa trong XML 1.0 Specìication xuất bản bởi W3C và một số chi

40

tiết kỹ thuật khác liên quan tất cả là chuẩn mở.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Mục tiêu thiết kế XML của nhấn mạnh tính đơn giản, tổng quát, và khả năng sử

dụng trên Internet. Nó là một định dạng dữ liệu văn bản, với sự hỗ trợ mạnh mẽ

Unicode cho các ngôn ngữ trên thế giới. Mặc dù XML của thiết kế tập trung vào các tài

liệu, nó được sử dụng rộng rãi cho các đại diện của các cấu trúc dữ liệu tuỳ tiện, ví dụ như

trong các dịch vụ web.

Có rất nhiều phần mềm mà các nhà phát triển phần mềm có thể sử dụng để truy cập

dữ liệu XML, và các hệ thống giản đồ một số thiết kế để hỗ trợ trong các định nghĩa của

ngôn ngữ dựa trên XML

5.2.2.1. Phân tách XML

Khái niệm phân tích XML là biên dịch định nghĩa thẻ và thể hiện tài liệu để cho người dùng hoặc môi trường phát triển ứng dụng có thể hiểu dữ liệu được lưu trữ trong tài liệu. Nó yêu cầu một phần mềm đặc biệt gọi là bộ phân tích (parser).

Một bộ phân tích là một phần mềm phân tích tài liệu XML dựa trên cơ sở các thẻ

XML. Bộ phân tích nhận biết thẻ XML trên cơ sở các tham số (parameter) chuyển cho nó và lấy đoạn text đi với thẻ đó. Việc này được thực hiện bằng cách biên dịch và phiên dịch định nghĩa của các thẻ chứa trong DTD.

Có hai loại bộ phân tích:

o Bộ phân tích xác nhận hợp lệ (Validating parser). o Bộ phân tích không xác nhận hợp lệ (Nonvalidating parser).

Để hiểu được hai loại này, ta cần phải biết ý nghĩa của tài liệu hợp lệ (valid) và đúng ngữ pháp (well-formed). Một tài liệu XML hợp lệ là một tài liệu tuân thủ theo DTD gắn

với tài liệu XML. DTD có thể được viết trong cùng tài liệu XML (được nhúng) hay nó có thể được chỉ định bằng một liên kết. Một tài liệu hợp lệ thì phải đúng ngữ pháp. Khi ta

định nghĩa các thẻ trong một DTD, mối liên hệ giữa chúng cũng được định nghĩa. Một tài liệu đúng ngữ pháp là tài liệu mà tất cả các thẻ đều bám vào các mối liên hệ định nghĩa

trong DTD. Một số luật mà tài liệu đúng ngữ pháp phải theo là:

o Tất cả các thẻ dùng trong tài liệu phải được cân bằng bằng các thẻ bắt đầu và kết

41

thúc.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

o Tất các các thuộc tính bắt buộc định nghĩa trong DTD phải có mặt. o Giá trị thuộc tính phải nằm trong dấu nháy. o Các thẻ chứa và được chứa phải theo sát DTD, hay Schema. o Các ký tự markup như < hay & không được đứng một mình. Nếu cần, chúng phải

được dùng là <, &,…

o Tất cả các thẻ rỗng phải kết thúc bằng />

Chức năng của bộ phân tích là kiểm tra các luật trên.

Dựa vào các loại tài liệu XML mà ta đã đề cập ở trên, có hai loại bộ phân tích XML, một loại phân tích tài liệu XML kiểm tra hợp lệ và bộ kia phân tích tài liệu XML không kiểm tra hợp lệ.

Bộ phân tích không kiểm tra hợp lệ (Nonvalidating parser): Bộ phân tích này chỉ kiểm tra tài liệu có đúng ngữ pháp hay không; nói cách khác, bộ phân tích ch ỉ thực hiện kiểm tra cú pháp của DTD trong tài liệu, đó là lý do tại sao nó được gọi là bộ phân tích không kiểm tra hợp lệ.

Bộ phân tích kiểm tra hợp lệ (Validating parser): Các bộ phân tích này biên dịch DTD và theo các khai báo thẻ để phát sinh output ở dạng người dùng có thể đọc được. J2ME không thể hỗ trợ kiểm tra hợp lệ tài liệu XML.

Ngoài ra có thể phân loại theo cách tiếp cận. Có hai cách tiếp cận cho việc xử lý XML: SAX và DOM. SAX hay Simple API for XML là một khung (framework) hướng sự

kiện, bộ phân tích sẽ gọi các back function trong mã chương trình client khi xử lý tập tin XML. SAX nhẹ, và mô hình hướng sự kiện của nó làm giảm bộ nhớ cần thiết làm cho nó

thích hợp với các ứng dụng nhỏ. Tuy nhiên, nó chiếm một phần lớn trong mã chương trình client để theo dõi cây phân tích XML. Khác với SAX, DOM hay Document Object

Model đưa ra cách nhìn theo cây gần với mô hình đối tượng nhưng yêu cầu tiêu tốn nhiều bộ nhớ hơn. Một cây DOM có thể dễ dàng được “duyệt qua” sử dụng mối liên hệ cha-con.

5.2.2.2. Các bộ phân tích XML cho KVM

Có nhiều loại bộ phân tích cho KVM. Các bộ phân tích đưa ra ở đây làm việc với

42

KVM. Ta sẽ chỉ nói về tính năng chính của các bộ phân tích.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

o Pull parser: Ở các bộ phân tích này, đầu tiên dữ liệu được đọc và nó được phân tích từ định nghĩa. Việc phân tích có thể hoàn thành bằng các hàm đệ qui để dịch cấu trúc

cây của tài liệu.

o Push parser: Các bộ phân tích này xử lý định nghĩa dữ liệu trước khi xử lý tài liệu. Cấu trúc cây hoàn chỉnh được tạo trong bộ nhớ trước khi thật sự bắt đầu xử lý tài liệu

XML. Trong trường hợp này, toàn bộ cây DOM được sinh ra trong bộ nhớ ngay cả khi

không cần thiết phải như vậy.

5.2.2.2.1. kXML

Đây là bộ phân tích XML quan trọng và phổ biến nhất cho KVM. Nó là kết hợp của pull parser và XML Writer, được dùng để viết XML. Nó chứa một WAP Binary XML (WBXML) được dùng để chuyển tài liệu XML trên các kênh truyền thông vô tuyến. Do đó, nó hỗ trợ Wireless Markup Language. Nó chứa một kDOM đặc biệt, đó là Document Object Model thay cho kXML. Nó đơn giản hơn và quản lý không gian hiệu quả hơn Document Object Model. Nó biên dịch và làm việc với môi trường Thiết bị thông tin di động (Mobile Information Device-MID) mà không cần phải hiệu chỉnh. Nó nằm trong gói de.kxml. Chức năng của nó được định nghĩa trong lớp Parser.

5.2.2.2.2. Tiny XML

Đây là một push parser không kiểm tra hợp lệ, biên dịch toàn bộ cây DOM vào bộ nhớ và sau đó phân tích toàn bộ tài liệu XML. Nó cần phải hiệu chỉnh mã nguồn để chạy trên MID. Đặc điểm chính của TinyXML là nó chỉ theo một số bộ mã xác định: ASCII, UTF-16, UTF-16BE, và UTF-8. Kiểu bộ mã được xác định trong XML Prolog. Nếu kiểu

bộ mã XML Prolog không phải là bộ mã ASCII, UTF-16, UTF-16EB và UTF-8, thì TinyXML sẽ không phân tích tài liệu XML và sẽ ném ra một ngoại lệ.

5.2.2.2.3. Nano XML

Đây là một bộ phân tích khác cho KVM, nó hoạt động theo kiểu push-parsing. Nó có một tính năng riêng cho việc hiệu chỉnh tài liệu và viết tài liệu trở vào stream. Bởi vì tính năng này không có ích lắm cho MID, bộ phân tích này không được dùng nhiều. Tuy

43

nhiên, một khi tính năng này được chấp nhận trong đặc tả MID, nó sẽ là một bộ phân tích quan trọng cho truyền thông vô tuyến.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

5.2.2.3. Làm việc với kXML

Ta chọn sử dụng bộ phân tích kXML. Ta sẽ khảo sát cách làm việc với kXML.

Các lớp và gói trong bộ phân tích kXML:

 Lớp Attribute: Lớp này thể hiện thuộc tính của thẻ. Khi ta gọi phương thức

StartTag.getAttribute, nó sẽ trả về một đối tượng có kiểu là Attribute là thuộc tính của thẻ

đó. Lớp này có bốn phương thức. Phương thức getName() trả về tên của thuộc tính, ta

cũng có thể lấy giá trị của thuộc tính bằng cách gọi phương thức getValue() của nó.

Phương thức toString() sẽ trả về dạng biểu diễn chuỗi của đối tượng Attribute.

Lớp XML: Lớp này biểu diễn dữ liệu XML. Lớp này được dùng bởi bộ phân tích. Tất cả các phương thức trong lớp này đều là tĩnh (static). Nó có một số trường để bộ phân tích sử dụng, ví dụ như START-TAG, TEXT, END-TAG,...

Lớp PrefixMap: Lớp này biểu diễn PrefixMap của thẻ. Khi bạn gọi phương thức StartTag.getPrefixMap(), nó sẽ trả về một đối tượng PrefixMap. Lớp này có

ba phương thức: phương thức getNamespace(), trả về namespace của prefix này, phương thức getPrefix(), trả về chuỗi biểu diễn của prefix, và phương thức PrefixEnumeration().

5.2.2.4. Gói org.kxml

Gói này chứa các lớp liên quan đến việc phân tích dữ liệu XML.

AbstractXMLParser: Đây là một lớp trừu tượng (abstract class). Tất cả các lớp phân tích XML đều kế thừa lớp này. Để bắt đầu phân tích dữ liệu, ta phải gọi phương thức read() của lớp này. Phương thức này phát sinh một đối tượng của lớp ParseEvent. Tất cả các phương thức khác sẽ được bộ phân tích sử dụng.

 XmlParser: Lớp này kế thừa lớp AbstractXmlParser. Hàm tạo của lớp này

cần một đối tượng lớp reader, từ đó nó bắt đầu đọc dữ liệu XML và trong khi phân tích dữ liệu, đồng thời nó sẽ phát sinh các sự kiện phân tích (parse event). Lớp này kế thừa tất cả các phương thức của lớp AbstractXmlParser.

 Lớp ParseEvent: Đây là một lớp trừu tượng, thể hiện các sự kiện được

phát sinh bởi bộ phân tích trong lúc phân tích dữ liệu XML.

 Lớp StartTag: Lớp này kế thừa lớp ParseEvent. Đối tượng của lớp này

44

được phát sinh khi bộ phân tích tìm thấy bắt đầu của một thẻ – ví dụ:

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hello How are you

Trong khi phân tích tài liệu XML, bộ phân tích bắt gặp thẻ , nó sẽ phát sinh

một sự kiện StartTag, phương thức getName() của lớp này sẽ trả về Hello, là tên của thẻ.

 Lớp TextEvent: Lớp này cũng kế thừa lớp ParseEvent. Đối tượng của lớp

này được phát sinh khi bộ phân tích tìm thấy dữ liệu văn bản của thẻ. Ví dụ, khi bộ phân

tích bắt gặp Hello How are you, nó sẽ phát sinh một sự kiện text. Phương thức getText()

của lớp này sẽ trả về Hello How are you, là text của thẻ.

Lớp EndTag: Đây là lớp con của lớp ParseEvent. Đối tượng của lớp này được phát sinh khi bộ phân tích tìm thấy kết thúc của một thẻ. Ví dụ, khi bộ phân tích bắt gặp thẻ , nó sẽ phát sinh một sự kiện EndTag. Phương thức getName() của lớp này sẽ trả về Hello, tên của thẻ kết thúc.

 EndDocument: Đây cũng là một lớp con của lớp ParseEvent. Đối tượng

của lớp này được phát sinh khi bộ phân tích tìm thấy kết thúc của tài liệu – nghĩa là, kết thúc của tập tin XML.

5.2.2.5. Gói org.kxml.io

Gói này chứa các lớp để ghi dữ liệu XML.

AbstractXmlWriter: Lớp này là lớp cơ bản (base class) của lớp XmlWriter và cung cấp các chức năng cho lớp XmlWriter. Lớp này có các phương thức dùng để ghi tài liệu XML; các phương thức như attribute(), endTag(), và startTag() được dùng để tạo tài liệu XML.

 LookAheadReader: Lớp này giống như một lớp reader, nhưng có hàm

peek() để chỉ ký tự kế tiếp, lớp này cũng không ném ra ngoại lệ IOException.

45

XmlWriter: Lớp này lấy chức năng từ lớp AbstractXmlWriter. Lớp này có thêm các phương thức checkPending(), close(), và write(char c) ngoài các phương thức kế thừa từ lớp AbstractXmlWriter.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 6. Tổng quan về chương trình ứng dụng thử nghiệm Chương 6. Tổng quan về chương trình ứng dụng thử nghiệm Chương 6. Tổng quan về chương trình ứng dụng thử nghiệm

6.1. Web Services 6.1. Web Services 6.1. Web Services

Web Services là nơi cung cấp và quản lý nội dung của bên cung cấp dịch vụ, sau Web Services là nơi cung cấp và quản lý nội dung của bên cung cấp dịch vụ, sau Web Services là nơi cung cấp và quản lý nội dung của bên cung cấp dịch vụ, sau

đó nó được kết nối với thiết bị di động của người dùng. đó nó được kết nối với thiết bị di động của người dùng. đó nó được kết nối với thiết bị di động của người dùng.

6.1.1. Giới thiệu khung xử lý hệ thống 6.1.1. Giới thiệu khung xử lý hệ thống 6.1.1. Giới thiệu khung xử lý hệ thống

Lược đồ xử lý trên trang services: Lược đồ xử lý trên trang services: Lược đồ xử lý trên trang services:

46 46 46

Hình 19 : Quá trình xử lý trên web services. Hình 19 : Quá trình xử lý trên web services. Hình 19 : Quá trình xử lý trên web services.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Những module quan trọng của hệ thống được đặt trong một thư mục chính, dưới đây

là các module và thư mục chứa những module quan trọng trong việc xử lý logic của hệ

thống:

 index.php: đây là đầu vào khởi đầu, và duy nhất của ứng dụng. Ở đây, các

biến hệ thống, bảo mật được định nghĩa, cũng từ đây sẽ triệu gọi đến các gói hỗ trợ để cấu

hình biến cần thiết trong quá trình hệ thống xử lý.

 ajax: đây là thư mục chứa toàn bộ các module trong quá trình xử lý của hệ

thống với kiểu làm việc ajax, trong thư mục này, có chia làm hai phần tách biệt cho ứng

dụng với admin hoặc bên ngoài cho người dùng hoặc khách.

 route.php: đây là nơi điều hướng của ứng dụng, từ đây sẽ xác định xem khu

vực ứng dụng nào được triệu gọi, của admin hay bên ngoài trang.

admin.layout.php: giao diện chuẩn của ứng dụng cho admin.

   site.layout.php: giao diện bên ngoài trang. config.php: định nghĩa các thông số chung được dùng trong toàn bộ ứng

dụng.

 admin: thư mục xử lý riêng biệt nếu người dùng muốn truy xuất vào phần

ứng dụng dành cho admin thì phải qua bước kiểm tra hợp lệ với tài khoản admin.

 help: thư mục chứa các module để trợ giúp trong quá trình làm việc của hệ

thống.  languages: thư mục định nghĩa ngôn ngữ sử dụng trong hệ thống, và nếu là

hỗ trợ đa ngôn ngữ. Hoặc không sẽ sử dụng ngôn ngữ mặc định là Tiếng Anh.

 controller: thư mục điều hướng chính trong quá trình xử lý MVC, trong thư

mục này được tách biệt giữa hai trạng thái người sử dụng là admin và bên ngoài trang.

 model: thư mục chứa các truy vấn về cơ sở dữ liệu nói chung trong quá

trình hệ thống xử lý theo kiểu MVC.

class: định nghĩa các lớp hay dùng trong quá trình xử lý của hệ thống.

   js: thư mục chứa các file javascript được dùng trong hệ thống. template: thư mục chứa các file css để xây dựng giao diện dùng trong hệ

47

thống.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

6.1.2. Xây dựng cơ sở dữ liệu cho hệ thống

tbl_user

tbl_ content

tbl_user_ group

tbl_ layout

tbl_ language

tbl_ component

tbl_ category_ content

tbl_ componen t_ group

id name ordering status

id groupNa- me descriptio- n

id parent_id name link ordering seo_name wooden_leg publish

id name version createdTime description authorName authorEmail authorUrl authorOrg applied

id createdDa te ordering status title descriptio n content source cat_id

id name version createdTime description authorName authorEmail authorOrg authorUrl encoding metaTitle metaKeyword metaDescripti on applied

id name version createdTime description authorName authorEmail authorUrl authorOrg editable action task controller ordering status groupId

id username password email firstName lastName middleNa me gender dob joinTime lastLoginT ime lastLoginIp status groupId

Cơ sở dữ liệu dùng trong hệ thống gồm 8 bảng:

48

Và biểu đồ thực thể liên kết:

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 20 : Biểu đồ thực thể liên kết của hệ thống.

6.1.3. Quá trình hoạt động của hệ thống

6.1.3.1. Phần quản trị nội dung

Đây là phần tổng hợp dành cho người quản trị hệ thống, trong phần này người quản

trị nói chung có thể tạo, sửa, xóa nội dung cung cấp xuống thiết bị di động.

49

6.1.3.1.1. Khu vực người quản trị đăng nhập vào hệ thống

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 21: Người quản trị đăng nhập vào hệ thống.

6.1.3.1.2. Khu vực chung

Người quản trị có thể làm mới nội dung đưa xuống thiết bị di động, mỗi danh mục

sẽ được hệ thống lựa chọn 10 bản ghi mới nhất.

Hình 22: Khu vực mặc định của hệ thống

6.1.3.1.3. Khu vực thao tác với các danh mục tin

Người quản trị có thể tạo mới, sửa, xóa các danh mục tin. Các danh mục có thể tạo

50

đa cấp, cấp cao nhất thuộc cấp con của –root

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 23: Khu vực hiển thị danh mục của hệ thống.

6.1.3.1.4. Khu vực quản lý nội dung

Người quản trị có thể thao tác với các bản ghi của từng danh mục liên quan, các

quyền cơ bản như tạo, sửa, xóa, chuyển trạng thái (publish, unpublish) …

Hình 24: Khu vực hiển thị nội dung bản tin.

6.1.3.2. Phần dành cho người quản trị

Phần này dành cho người quản trị cấp cao nhất là super admin.

6.1.3.2.1. Phần menu bên trái

Đây là phần dùng để truy xuất đến tất cả các chức năng ở trong hệ thống, nhà quản

51

trị có thể tương tác với các chức năng liên quan như nhóm người dùng (users group), nhóm thực đơn (menus group), thành phần (components), ngôn ngữ (languages).

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình dưới minh họa phần tùy chọn bên trái:

Hình 25: Phần tùy chọn bên trái của hệ thống.

6.1.3.2.2. Phần quản lý nhóm người dùng

Người dùng root (super administrator) có thể tạo ra những người dùng khác với các nhóm như: administrator, moderator, member tùy vào từng ngữ cảnh của hệ thống và ứng dụng.

Hình 26: Phần quản lý nhóm người dùng.

6.1.3.2.3. Phần quản lý nhóm thực đơn

Super administrator có thể tạo ra các thực đơn với tên khác nhau dùng để gom nhóm

các thành phần với nhau. Ví dụ: Category và Content ở dưới thực đơn là Content Manager.

52

Hình 27: Phần quản lý nhóm thực đơn.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

6.1.3.2.4. Phần quản lý các nhóm Component

Supper administrator tạo ra các Component này là các thành phần trực tiếp trong hệ thống, các thành phần riêng biệt với các biến điều khiển trong hệ thống là $controller,

$action, $task.

Hình 28: Phần quản lý Component.

6.1.3.2.5. Phần quản lý ngôn ngữ hiển thị

Super administrator có thể chọn ngôn ngữ mặc định hiển thị trong hệ thống. Mặc định là English, file ngôn ngữ được tạo với định dạng english.php hoặc vietnammese.php tương ứng với tên ngôn ngữ đó trong khu vực quản trị. File này được đặt trong thư mục languages của hệ thống. Bên trong file được định nghĩa các biến ngôn ngữ.

Ví dụ: $aXYLang['ADD'] = 'Thêm'; $aXYLang['DELETE'] = 'Xóa'; $aXYLang['_SAVE'] = 'Lưu'; Hay $aXYLang['ADD'] = 'Add'; $aXYLang['DELETE'] = 'Delete'; $aXYLang['_SAVE'] = 'Save';

53

Hình 29: Khu vực quản lý ngôn ngữ hiển thị trong hệ thống.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

6.1.3.3. Phần xuất bản nội dung định dạng XML

6.1.3.3.1. Xuất bản nội dung các danh mục tin

Khi URL này được truy xuất, nội dung sẽ được xuất bản dưới định dạng XML:

http://localhost/services/xml/listCategories/

Hình 30: Kết quả thu được với trình duyệt Mozilla Firefox 3.5.

Khi URL này được truy xuất, nội dung sẽ được xuất bản dưới định dạng XML:

6.1.3.3.2. Xuất bản các bản tin trong cùng danh mục

54

http://localhost/services/xml/listNews/index.php?catId=85

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 31: Kết quả thu được với trình duyệt Mozilla Firefox 3.5.

6.2. Trên thiết bị di động

6.2.1. Quy trình hoạt động

Màn hình khởi động ứng dụng

55

Hình 32: Màn hình khởi động của ứng dụng

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Tiếp đó người dùng sẽ vào phần tùy chọn ứng dụng

Hình 33: Màn hình tùy chọn ứng dụng.

Câu hỏi yêu cầu cho phép kết nối với dịch vụ mạng?

56

Hình 34: Yêu cầu cho phép kết nối tới dịch vụ.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Sau đó là các thông tin chi tiết hơn

Hình 35: Các quá trình khi xem tin tức với ứng dụng.

6.3. Các module chính trong ứng dụng

6.3.1. Web Services

Có rất nhiều gói tin liên quan trong ứng dụng web services này, trong khuôn khổ tài

liệu chỉ giới thiệu các module điển hình:

Default component: đây là component mặc định của hệ thống khi các biến điều

khiển chưa được xác lập. Đây cũng là component bắt buộc phải được cài đặt để hệ thống có thể hoạt động. Khu vực điều khiển được đặt trong thư mục /controller/site/default:

default.index.php: file điều hướng chính của component.

57

template: thư mục chứa giao diện html.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

display.tpl.php: file chứa giao diện html.

view: thư mục chứa file xử lý dữ liệu và xuất bản nội dung.

view.php: file xử lý.

js: thư mục chứa file javascript của component.

default.site.js: file mặc định bắt buộc chứa mã javascipt của component.

Để tương tác với cơ sở dữ liệu, chức năng model của mô hình MVC trong component được đặt ở thư mục /model/site/default:

default

default.model.php: file tương tác với cơ sở dữ liệu.

default.index.php:

58

setTitle('Dang Dinh Hung J2ME Web services'); 6. switch($action) 7. { 8. default: 9. case 'show': 10. { 11. switch($task) 12. { 13. default: 14. case 'view': 15. $oController->show(); 16. break; 17. } 18. } 19. break; 20. } ?>

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

(3). Dòng lệnh dùng để tránh truy cập trực tiếp file php. (4). Thiết lập các biến cục bộ của hệ thống. (5). Gọi module xử lý logic của component. (6). Khởi tạo đối tượng. (7). Thiết lập Title của trang HTML trên trình duyệt. (8)÷(22). Xử lý điều hướng của component. view.php:

1. defined( "XY_SYS" ) or die( "Restricted access" ); 2. class CDefault 3. { 4. var $oUri; 5. function CDefault() 6. { 7. loadFile('help/CUri.class'); 8. $this->oUri = new CUri(); 9. } 10. function show( ) 11. { 12. eval(getGlobalVar()); 13. $oUri = $this->oUri; 14. $link = $aConfig["admin_pos"]; 15. $oXYTemp->assign ('link',$link); 16. loadFile(XY_CONT.'template/display.tpl'); 17. } 18. }

59

?> (2). Khởi tạo lớp CDefault (15). Truyền giá trị của biến xuống template. (16). Gọi module xử lý xuất bản html. display.tpl.php: 1.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

3. eval( getGlobalVar() ); 4. $link = $oXYTemp->get('link'); 5. ?> 6. 14.

WEB SERVICES
15.

Xin chào đã viếng thăm

WEB SERVICES,

16. để đăng nhập phần quản

trị

17. vui lòng nhấn 18. vào đây.

19.

 

20.

Trang web phục vụ khóa luận

tốt nghiệp,

21. chủ đề J2ME và 22. ứng dụng dịch vụ trực tuyến.

23.

 

24.

ĐẶNG ĐÌ 25. NH HÙNG giữ toàn quyền

26.

Hà Nội, 2010

60

(4). Lấy nội dung biến được truyền từ khu vực controller truyền xuống. (6)÷(13). Định nghĩa trực tiếp CSS trong template. (14)÷(26). Giao diện được xuất bản html. default.site.js:

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

default.model.php:

do logic của component này không yêu cầu nên hai file này không chứa nội dung xử lý.

6.3.2. Trên thiết bị di động

Thư mục /src chứa các module .java của chương trình:

src

com

sun

lwuit: thư mục chứa mã nguồn của thư viện lwuit ở dạng tập tin.

newsonline

news: thư mục chứa các gói .java để hoạt động chương trình.

util: thư mục chứa các gói thư viện hỗ trợ. NewsOnlineMIDlet.java: file gốc của chương trình.

Thư mục /res chứa các nguồn media:

res

images: chứa các ảnh .png.

Thư mục /lib chứa các gói thư viện hỗ trợ:

lib: chứa các gói hỗ trợ kxlm2.zip, LWUIT.jar.

Còn những thư mục khác là do trình biên dịch khi tạo project bên trong netbean.

61

NewsOnlineMIDlet.java: 1. package newsonline; 2. import com.sun.lwuit.Command; 3. import com.sun.lwuit.Display; 4. import com.sun.lwuit.Form; 5. import com.sun.lwuit.List; 6. import com.sun.lwuit.animations.CommonTransitions; 7. import com.sun.lwuit.animations.Transition; 8. import com.sun.lwuit.events.ActionEvent;

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

9. import com.sun.lwuit.events.ActionListener; 10. import com.sun.lwuit.layouts.BorderLayout; 11. import com.sun.lwuit.list.DefaultListCellRenderer; 12. import com.sun.lwuit.list.DefaultListModel; 13. import com.sun.lwuit.plaf.UIManager; 14. import com.sun.lwuit.util.Resources; 15. import java.io.IOException; 16. import javax.microedition.midlet.*; 17. import newsonline.news.ConfirmExit; 18. import newsonline.news.HelpContact; 19. import newsonline.news.News; 20. public class NewsOnlineMIDlet extends MIDlet implements ActionListener { 21. private static final Command selectCommand = new Command("Chọn", 0); 22. private static final Command exitCommand = new Command("Thoát", 1); 23. public static Form mainForm; 24. private static List listMemu; 25. public void startApp() { 26. // VKBImplementationFactory.init();// Tao ban phim ao cho cac dong may

cam ung

27. Display.init(this); 28. try { 29. Resources res = Resources.open("/newsonlineresources.res"); 30. UIManager.getInstance().setThemeProps(res.getTheme(res.getThemeResourceNa

mes()[0]));

62

31. mainForm = new Form("Tin Tức"); 32. mainForm.setLayout(new BorderLayout()); 33. //disable the scroll on the Form. 34. mainForm.setScrollable(false); 35. String[] menu = {"Tin Tức","Trợ Giúp", "Liên Hệ"}; 36. DefaultListModel dlModel = new DefaultListModel(menu); 37. listMemu = new List(dlModel); 38. //create a ListCellRenderer and install 39. DefaultListCellRenderer dlcr = new DefaultListCellRenderer(); 40. listMemu.setListCellRenderer(dlcr); 41. // dlcr.setShowNumbers(false);

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

42. listMemu.setFixedSelection(List.FIXED_NONE_CYCLIC);// Cho phep select

vong tron

43. listMemu.setSmoothScrolling(false); 44. listMemu.getStyle().setBgTransparency(0); 45. listMemu.addActionListener(new ActionListener() { 46. public void actionPerformed(ActionEvent ae) { 47. Transition out; 48. out =

CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, false, 500);

49. setTransition(null, out); 50. switch (listMemu.getSelectedIndex()) { 51. case 0: 52. if (News.listNewsCategory != null) { 53. News.newsForm.show(); 54. } else { 55. new News(mainForm); 56. } 57. break; 58. case 1: 59. new HelpContact(mainForm, "Trợ Giúp", "Dùng phím lên, xuống và OK để

chọn\nhoặc có thể dùng phím select và cancel\n");//

63

60. break; 61. case 2: 62. new HelpContact(mainForm, "Liên Hệ", "Liên hệ 19001234 để được giải đáp"); 63. break; 64. } 65. } 66. }); 67. mainForm.addComponent(BorderLayout.CENTER, listMemu); 68. mainForm.addCommand(selectCommand); 69. mainForm.addCommand(exitCommand); 70. mainForm.setCommandListener(this); 71. mainForm.show(); 72. } catch (IOException ioex) {

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

73. ioex.printStackTrace(); 74. } 75. } 76. public static void setTransition(Transition in, Transition out) { 77. mainForm.setTransitionInAnimator(in); 78. mainForm.setTransitionOutAnimator(out); 79. } 80. public static Resources getResource(String name) throws IOException { 81. return Resources.open("/" + name + ".res"); 82. } 83. public void pauseApp() { 84. } 85. public void destroyApp(boolean unconditional) { 86. notifyDestroyed(); 87. } 88. public void actionPerformed(ActionEvent ae) { 89. Command cmd = ae.getCommand(); 90. switch (cmd.getId()) { 91. case 0: 92. Transition out; 93. out =

CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, false, 500);

94. setTransition(null, out); 95. switch (listMemu.getSelectedIndex()) { 96. case 0: 97. if (News.listNewsCategory != null) { 98. News.newsForm.show(); 99. } else { 100. 101. 102. 103. 104. new News(mainForm); } break; case 1: new HelpContact(mainForm, "Trợ Giúp","Dùng phím lên, xuống và OK để

64

chọn\nhoặc có thể dùng phím select và cancel\n");//

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

break; case 2: new HelpContact(mainForm, "Liên Hệ", "Liên hệ 19001234 để được giải 105. 106. 107.

đáp");//

108. 109. 110. 111. 112. 113. 114. 115. 116. 117. break; } break; case 1: setTransition(null, null); new ConfirmExit(mainForm, this, "Tin Tức"); break; } } }

(1)÷(19): gọi các gói, thư viện, các lớp trong module. (20) ÷(117): xử lý logic trong ứng dụng thông qua các module.

6.4. Mã nguồn tham khảo

6.4.1. kxml2

Đây là gói hỗ trợ phân tách dữ liểu định dạng XML, gói này được lấy tại địa chỉ:

http://kxml.sourceforge.net/kxml2/

6.4.2. Convert UTF-8

http://java.sun.com/docs/books/tutorial/i18n/text/charintro.html

Đây là module hỗ trợ định dạng utf8, được tham khảo tại địa chỉ:

6.4.3. LWUIT

Đây là bộ thư viện chính được dùng trong ứng dụng chương trình, nó hỗ trợ xây

https://lwuit.dev.java.net/

65

dựng giao diện mạnh mẽ, được lấy tại địa chỉ:

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Chương 7. Cài đặt ứng dụng thử nghiệm

7.1. Web Services

7.1.1. Cài đặt phần giả lập máy chủ Web trên máy tính cá nhân

Để giả lập máy chủ web trên PC có rất nhiều phần mềm, tính năng tổng hợp

được chú ý cao nhất cho các phần mềm cài đặt đủ cả 3 bộ tiện ích là php, mySql và

phpmyAdmin. Wamp là một phần mềm với giao diện đơn giản, dễ sử dụng và hội tụ đủ

các điều kiện trên. Tiến hành cài đặt gói Wamp 1.5 đính kèm trong đĩa chương trình, cài

đặt theo thông số mặc định của phần mềm.

Cuối cùng thu được các cấu hình cơ bản:

Hosting url: localhost

User name: root

Password:

7.1.2. Cấu hình gói ứng dụng Web Services

Sau khi cài đặt chương trình giả lập, tiến hành cài đặt cơ sở dữ liệu, truy cập vào địa

chỉ: http://localhost/phpmyadmin/

Hình 36: Tạo cơ sở dữ liệu trong phpmyadmin.

Nhập tên cơ sở dữ liệu và tạo.

Tiếp đó tiến hành import cơ sở dữ liệu có sẵn được đính kèm trong đĩa chương trình

66

Hình 37: Quá trình nhập cơ sở dữ liệu.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Sau đó copy toàn bộ thư mục /services được đính kèm trong đĩa chương trình vào

thư mục /www của chương trình wamp.

Trong thư mục /services, mở file config.php ở chế độ edit (đơn giản có thể dùng

notepad để sửa), thay vào các tham số phù hợp theo thứ tự: dbHost, dbUser, dbPass,

dbName:

$ar = array( "localhost", "root", "", "services" );

http://localhost/services

Như vậy là hoàn tất quá trình cài đặt, truy cập ứng dụng web services tại địa chỉ:

Tài khoản administrator mặc định ban đầu là admin/abc123.

7.2. Trên thiết bị di động

7.2.1. Cài đặt phần mềm mô phỏng

o netbeans-6.7.1: đây là IDE để xây dựng ứng dụng J2ME ở mức cơ bản. o sun_java_wireless_toolkit-2.5.2_01: đây là trình biên dịch mã java và tạo mô hình

mô phỏng thiết bị di động trên máy tính.

Hai gói này đều được đính kèm theo đĩa chương trình.

7.2.2 . Cấu hình ứng dụng thử nghiệm

Trong netbean IDE tạo New Project hoặc nhấn Ctrl+Shift+N.

Hình 38: Bước đầu tạo Project mới.

67

Chọn Mobile Application, rồi Next.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Hình 39: Cấu hình ban đầu.

Project Name: lựa chọn một tên bất kỳ, bỏ chọn Create Hello MIDlet, rồi Next.

Hình 40: Cấu hình chi tiết.

Ở tùy chọn Emulator Platform chọn Sun Java( TM ) Wireless Toolkit 2.5.2_01 for

CLDC rồi Finish.

Copy toàn bộ thư mục /News đính kèm theo đĩa chương trình vào thư mục tạo

project của netbean, /My Documents/NetBeansProjects/News.

Như vậy việc cấu hình ứng dụng đã hoàn tất, tiếp theo tiến hành Clean & Build và

68

chạy chương trình mô phỏng.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Kết luận

Khóa luận được chia làm bảy chương mục và tập trung vào hai điều chính, thứ nhất,

làm rõ lý thuyết, tiếp cận công nghệ J2ME và các công nghệ hỗ trợ một cách tổng quát,

đồng bộ nhất. Thứ hai, nghiên cứu và thử nghiệm ứng dụng viết trên J2ME và tương tác

với Web Services dùng giao thức XML.

Chương một, cung cấp một cái nhìn sơ bộ nhất về công nghệ lập trình trên di động

nói chung, và các công nghệ phổ biến nhất hiện nay nói riêng. Cũng trong chương này, ta

có cái nhìn mang tính xu hướng và tương lai của ngành công nghiệp lập trình trên di động.

Chương hai, giới thiệu công nghệ lập trình trên thiết bị di động với ngôn ngữ J2ME. Một cách tổng quát nhất về ngôn ngữ J2ME, các đặc điểm của ngôn ngữ này và sự so sánh một số đặc điểm của ngôn ngữ J2ME và anh em của nó là J2SE.

Chương ba, cung cấp cho người đọc cái nhìn rõ hơn về bản chất của công nghệ lập trình với ngôn ngữ J2ME. Tuy vậy, đây là kiến thức mang bản chất công nghệ, nó không phục vụ trong việc lập trình nhiều lắm mà nó giúp những người phát triển hiểu được bản chất một cách cặn kẽ nhất về những việc họ làm khi thực hiện các project trong triển khai ứng dụng.

Chương bốn, đi sâu vào một số công nghệ trong lập trình với ngôn ngữ J2ME. Đây là những công nghệ cụ thể và chi tiết trong ngôn ngữ J2ME. Chương này giúp đỡ người

lập trình một cách trực tiếp và mạnh mẽ nhất.

Chương năm, sau khi có cái nhìn và hiểu biết tương đối về công nghệ lập trình trên

thiết bị di động với ngôn ngữ lập trình J2ME, chương này sẽ dẫn dắt người đọc về ứng dụng thử nghiệm cụ thể. Ngoài ra, nó còn giới thiệu các công nghệ liên quan dùng trong

chương trình ứng dụng thử nghiệm. Đây là những công nghệ phổ biến bên ngoài, hiện đang được cộng đồng sử dụng và hỗ trợ mạnh mẽ.

Chương 6, giới thiệu ứng dụng thử nghiệm. Ứng dụng được chia thành hai phần chính nếu xét về phương diện chức năng và phân chia đối tượng sử dụng. Thứ nhất, đó là

69

phần Web Services, phần này dùng riêng cho những người quản trị nội dung. Nó cung cấp

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

các chức năng để người quản trị thao tác quản lý nội dung để đưa xuống thiết bị di động

của người dùng…

Chương bảy, đây là chương cuối cùng, chương này giúp người đọc cài đặt và cấu

hình thành công ứng dụng thử nghiệm.

Như vậy, khóa luận đã tập trung làm rõ được công nghệ lập trình J2ME và xây dựng

được ứng dụng thử nghiệm. Đó là thành quả của một quá trình nỗ lực cố gắng trong việc

nghiên cứu lý thuyết cũng như lập trình ứng dụng thử nghiệm, nó là kết quả của một quá

trình vừa học vừa làm và vừa làm vừa học. Tuy thành tựu đạt được là không nhỏ nhưng

do khuôn khổ thời gian cũng như khả năng còn hạn chế nên vẫn có những thiếu sót chưa được khắc phục… Nếu có thuận lợi về thời gian và nhân lực thì ứng dụng demo này hoàn toàn có thể đem ra phục vụ thực tế. Ít nhất phần Web Services cần được bổ xung chức năng Web Crawler để giải phóng sức người trong việc quản lý và xuất bản nội dung, bên

cạnh đó cũng cần bổ sung các chức năng cao cấp hơn trong phần quản trị của super administrator.

70

Để hoàn thành nội dung của khóa luận này đặc biệt chương ba, chương bốn thì có phần đóng góp không nhỏ của những blogger về J2ME [9], [10] ngoài những cá nhân đã nêu ở phần đầu. Một lần nữa xin chân thành cảm ơn những người vì sự phát triển chung của công nghệ, vì tình yêu đối với khoa học, họ đã đóng góp rất lớn cho những người đi sau trong việc tiếp cận tri thức một cách nhanh chóng và có hệ thống. Việc kế thừa và phát triển tiếp kiến thức hàn lâm làm nên một thế giới mang tính cộng đồng rất cao. Tất cả bắt nguồn từ tình yêu đối với Tổ quốc, tình yêu , sự chia sẻ và mong muốn cùng tiến bộ trong khoa học kỹ thuật.

ứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động

Tài liệu tham khảo

Tài liệu tiếng Anh:

[1] Andi Gutmans, Stig Sæther Bakken, and Derick Rethans, PHP 5 Power

Programming, 2004

[2] Anura Guruge, Corporate Portals Empowered with XML and Web Services,

Publisher Digital Press, October 15, 2002

[3] Biswajit Sarkar, Packt - LWUIT 1.1 for Java ME Developers, 2009

[4] BrianPfaffenberger, StevenM.Schafer, CharlesWhite, BillKarow, HTML,

[5] Ethan Cerami, Web Services Essentials, 2/2002

XHTML, & CSS Bible, 3rd Edition, 2004

[7] Robert Hablutzel, Developing Web Services with Java APIs for XML, 2005

[6] Kim Topley, J2ME in a Nutshell, Edition March 2002

Tài liệu tiếng Việt:

[8] Lập trình J2ME cơ bản, Nguyễn Ngọc Minh, javavietnam.org

Website tham khảo:

[9] http://khanhlnq-blog.posterous.com/bai-1-khai-quat-cac-lop-j2me

71

[10] http://www.javavietnam.org/