J2ME được phát triển từ kiến trúc
JavaCard, EmbededJava và PersonalJava
của phiên bản Java 1.1.
Khi phiên bản Java 2 ra đời, Sun thay thế
PersonalJava bằng phiên bản Java 2 Micro
Edition, viết tắt là J2ME.
J2ME được sử dụng cho các thiết bị nhỏ
gọn với dung lượng bộ nhớ bé và khả
năng xử lý thấp.
162 trang |
Chia sẻ: Mr Hưng | Lượt xem: 857 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Công nghệ J2ME, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ạng thái này, nó không đủ
thông tin để yêu cầu tất cả tài nguyên cần để hoạt động.
Trạng thái REALIZED
Gọi phương thức realize() sẽ chuyển từ trạng thái
UNREALIZED sang trạng thái REALIZED và khởi tạo
thông tin mà Player cần để có tài nguyên media
Lập trình trên thiết bị di động 116
Trạng thái
Trạng thái PREFETCHED
Khi ở trạng thái REALIZED, Player vẫn
cần thực hiện một số công việc tiêu tốn
thời gian trước khi nó được bắt đầu
Một Player ở trạng thái PREFETCHED ,
nếu nó đã được khởi động. Prefetching
làm giảm sự khởi động ngầm của Player
đến giá trị nhỏ nhất có thể
Lập trình trên thiết bị di động 117
Trạng thái
Trạng thái STARTED
Việc gọi phương thức start() sẽ làm cho Player
chuyển từ trạng thái PREFETCHED sang trạng
thái STARTED. Khi Player đang ở trạng thái
STARTED, có nghĩa là nó đang chạy và xử lý
dữ liệu.
Khi Player chuyển từ trạng thái PREFETCHED
sang STARTED, nó gửi một sự kiện
STARTED, và ngược lại gửi sự kiện STOPPED,
END_OF_MEDIA hay STOP_AT_TIME phụ
thuộc vào lý do mà nó dừng.
Lập trình trên thiết bị di động 118
Trạng thái
Ở trạng thái CLOSED, Player giải phóng
tất cả tài nguyên của nó và đối tượng
Player lúc này cũng không thể được sử
dụng lại.
Việc gọi phương thức close() sẽ làm cho
Player chuyển từ trạng thái
UNREALIZED, REALIZED,
PREFETCHED và STARTED sang trạng
thái CLOSED.
Lập trình trên thiết bị di động 119
Duration
Để biết thời gian file nhạc đã chạy, sử
dụng phương thức:
play.getDuration()
Thời điểm nó dừng là lúc duration của nó
đã hết, hoặc khi nó chuyển từ
state STARTED state PREFETCHED.
Lập trình trên thiết bị di động 120
VolumeControl
VolumeControl là một giao diện để thao
tác điều chỉnh âm thanh của một Player.
Giao diện này sẽ cho âm lượng của âm
thanh sử dụng một giá trị số nguyên thay
đổi từ 0 đến 100 (0 là mức thấp nhất, 100
là mức cao nhất).
Lập trình trên thiết bị di động 121
Các phương thức của giao diện
getLevel() Lấy âm lượng ở mức hiện
tại, giátrị trả về là kiểu int.
getMuted() Lấy trạng thái mute của tín
hiêu liên quan đến VolumeControl này,
giá trị trả về là kiểu boolean.
setLevel(int level) Đặt âm lượng sử
dụng các giá trị từ 0 đến100;
setMute(boolean mute)Thiết lập trạng
thái mute hoặc unmute.
Lập trình trên thiết bị di động 122
Playing audio
InputStream inputStream =
getClass().getResourceAsStream(“/music.mid”);
Player player = Manager. createPlayer
(inputStream, "audio/mpeg");
player.setLoopCount(-1);
player.realize();
player.prefetch();
player.addPlayerListener(this);
player.start();
Lập trình trên thiết bị di động 123
Playing video
Thực hiện tương tự như audio cho đến khi
thiết lập một listener cho player và nhận
đối tượng điều khiển video mà video có
thể được hiển thị trên form như là một
item.
Lập trình trên thiết bị di động 124
Playing video
VideoControl videoControl = (VideoControl)
Player.getControl("VideoControl");
if (videoControl != null)
{ Item videoItem = (Item)
videoControl .initDisplayMode
(VideoControl.USE_GUI_PRIMITIVE,null);
append(videoItem);
}
player.start();
Lập trình trên thiết bị di động 125
Lập trình trên thiết bị di động 126
Giao tiếp Bluetooth với JME
Bluetooth
Bluetooth là một công nghệ cho phép
truyền thông giữa các thiết bị với nhau mà
không cần cáp và dây dẫn. Nói cách khác,
nó là một chuẩn điện tử.
Lập trình trên thiết bị di động 128
Bluetooth
Bluetooth được xây dựng bởi Bluetooth
Special Interest Group (SIG).
Bluetooth được đặt theo tên thân mật của
một vị vua Thụy Điển: Harald Bluetooth.
Lập trình trên thiết bị di động 129
Bluetooth
Bluetooth là chuẩn kết nối không dây tầm
ngắn, thiết kế cho các kết nối thiết bị cá
nhân hay mạng cục bộ nhỏ, trong phạm vi
băng tần từ 2.4 đến 2.485 GHz.
Hoạt động trên 79 tần số đơn lẻ.
Được thiết kế kết nối tầm thấp với 3 lớp
khác nhau nhằm có thể cơ động truyền sóng
đi xa nhất đến mức có thể. Thông thường,
các loại di động hiện tại dùng Bluetooth ở
lớp thứ 2, với cường độ 2.5 miliWatt (mW)
và phạm vi chỉ có 12m trở lại.
Lập trình trên thiết bị di động 130
Các thế hệ Bluetooth
Lập trình trên thiết bị di động
Bluetooth 1.0
Bluetooth 1.1
Bluetooth 1.2
Bluetooth 2.0+ERD
Bluetooth 2.1+ERD
Bluetooth 3.0+HS
131
Ưu nhược điểm của Bluetooth
Ưu điểm:
-Truyền dữ liệu miễn phí.
-Thiết lập kết nối dễ dàng mà không cần
Ascess Point.
-Sử dụng được bất cứ ở đâu.
-Sử dụng cùng một chuẩn giao thức nên
mọi thiết bị bluetooth có thể kết nối với
nhau.
Lập trình trên thiết bị di động 132
Ưu nhược điểm của Bluetooth
Nhược điểm:
-Khoảng cách kết nối ngắn.
-Bảo mật thấp.
-Tốc độ truyền không cao.
-Bị nhiễu bởi một số thiết bị sử dụng
sóng Radio khác.
Lập trình trên thiết bị di động 133
Bluetooth với J2ME
Lập trình trên thiết bị di động 134
Bluetooth với J2ME
Có 3 loại giao tiếp trong công nghệ Bluetooth:
-OBEX: Viết tắt bởi “Object Exchange” giao
thức giao tiếp được sử dụng để trao đổi dữ liệu
vật lý như các tập tin, hình ảnh, và kể cả các
định dạng nhị phân.
-L2CAP: Viết tắt bởi “Logical Link Control and
Adaptation Protocol” được sử dụng để gửi các
gói dữ liệu giữa máy chủ và máy khách.
-RFCOMM: Viết tắt bởi ” Radio Frequency
Communication” được sử dụng cho luồng dữ
liệu đơn giản.
Lập trình trên thiết bị di động 135
Mô hình hoạt động của ứng dụng Client và Server trong J2ME
Bluetooth
Bước Server Client
1 Quản lý thiết bị, thiết
lập chế độ nhận biết
Quản lý thiết bị, thiết lập chế
độ nhận biết
2 Mở kết nối Bluetooth,
kết nối dịch vụ
Nhận biết các thiết bị
Bluetooth xung quanh
3 Chờ Client kết nối Nhận biết dịch vụ thiết bị
Bluetooth đã nhận biết ở trên
4 Nếu tìm thấy dịch vụ cần
thiết, tiến hành kết nối tới
dịch vụ đó
5 Mở các dòng nhập xuất
dữ liệu để trao đổi
thông tin
Mở các dòng nhập xuất dữ
liệu để trao đổi thông tin
Lập trình trên thiết bị di động 136
Tạo Server
-Tìm kiếm các thiết bị khác:
Sử dụng 2 hàm:
+LocalDevice.getLocalDevice ()
+setDiscoverable(DiscoveryAgent.GIAC)
-Mở kết nối Bluetooth
Xây dựng một chuỗi URL Bluetooth:
URL = “btspp://localhost:” + UUID +
“;name=rfcommtest;authorize=true”;
Lập trình trên thiết bị di động 137
StreamConnectionNotifier
Hàm acceptAndOpen()
Chuỗi URL Bluetooth
Hàm Connector.open (URL)
StreamConnection
Hàm openOutputStream() hoặc openInputStream()
Lập trình trên thiết bị di động 138
m_strUrl= "btspp://localhost:" + RFCOMM_UUID + ";
name=rfcommtest;authorize=true";
// m_StrmConn = BTFACADE.waitForClient(SERVICE_NBR);
Try
{
m_LclDevice = LocalDevice.getLocalDevice();
m_LclDevice.setDiscoverable(DiscoveryAgent.GIAC);
m_StrmNotf = (StreamConnectionNotifier)Connector.open(m_strUrl);
//Now it will start waiting for the client connection
m_StrmConn = m_StrmNotf.acceptAndOpen();
m_bInitServer = true;
m_Output = m_StrmConn.openOutputStream();
m_Input = m_StrmConn.openInputStream();
}
Lập trình trên thiết bị di động 139
Tạo Client
Trước tiên, ta cần tìm kiếm các thiết bị Bluetooth xung quanh.
public void SearchAvailDevices()
{
try
{
//First, get the local device and obtain the discovery agent.
m_LclDevice = LocalDevice.getLocalDevice();
m_DscrAgent= m_LclDevice.getDiscoveryAgent();
m_DscrAgent.startInquiry(DiscoveryAgent.GIAC,this);
}
catch (BluetoothStateException ex)
{
System.out.println("Problem in searching the Bluetooth devices");
ex.printStackTrace();
} }
Lập trình trên thiết bị di động 140
Tạo Client
Để tạo một Client, ta cần thực thi một giao
diện DiscoveryListener.
Giao diện này có các hàm chính sau:
void deviceDiscovered(RemoteDevice
btDevice, DeviceClass cod)
void servicesDiscovered(int transID,
ServiceRecord[] records)
void serviceSearchCompleted(int transID,
int respCode)
Connector.open(m_strUrl)
Lập trình trên thiết bị di động 141
Gửi và nhận dữ liệu
Khi client và server bắt đầu làm việc, quá trình giao tiếp được
thực hiện thông qua 2 hàm: sendMessages() và
receiveMessages().
public void sendMessages(String v_strData) {
if((m_bInitClient) || (m_bInitServer) )
{
try
{
m_Output.write(v_strData.length());
m_Output.write(v_strData.getBytes());
}
catch (IOException ex)
{
ex.printStackTrace();
} } }
Lập trình trên thiết bị di động 142
public String recieveMessages()
{
byte[] data = null;
try
{
int length = m_Input.read();
data = new byte[length];
length = 0;
while (length != data.length)
{
int ch = m_Input.read(data,
length, data.length - length);
if (ch == -1)
{
throw new
IOException("Can't read
data");
}
length += ch;
}
}
catch (IOException e)
{
System.err.println(e);
}
return new String(data);
}
Lập trình trên thiết bị di động 143
Kết nối mạng với J2ME
Nội dung:
◦ Generic Connection Framework
◦ Kết nối HTTP
◦ Kết nối Socket
◦ Kết nối Datagram
Lập trình trên thiết bị di động 144
Generic Connection Framework
- GCF là một tập hợp các lớp và giao diện
được thiết kế nhằm tạo thuận tiện cho việc
truy xuất đến các hệ thống lưu trữ và kết
nối mạng.
- Mục tiêu của GCF không phải là tạo ra
một tập các lớp mới hoàn toàn mà nó cung
cấp một tập con của J2SE một cách có
chọn lọc. Tập con này được giới hạn và
tối ưu để phù hợp với những ràng buộc và
khác biệt của những thiết bị di động.
Lập trình trên thiết bị di động 145
Cây phân cấp connection
Lập trình trên thiết bị di động 146
Giao diện GCF Chú thích
Connection Là kiểu kết nối cơ bản trong GCF. Và là cha của các kiểu kết
nối còn lại
ContentConnection Quản lý một kết nối (http,..) Cung cấp các phương thức cơ
bản: độ dài nội dung, mã hóa và kiểu của nội dung
DatagramConnection Quản lý kết nối Datagram
InputConnection Quản lý kết nối vào
OutputConnection Quản lý kết nối ra
StreamConnection Quản lý một dòng. Là sự tổng hợp của InputConnection và
OutputConnection
StreamConnectionNotifier Lắng nghe trên một cổng và tạo ra một StreamConnection
ngay sau khi nhận thấy có hoạt động trên cổng.
Lập trình trên thiết bị di động 147
- Trong GCF thì URLs có vai trò quan trọng, nó được
dùng trong Internet. URLs đưa ra vị trí , cách thức truy
cập đến nguồn tài nguyên
- Dạng của một URLs trong GCF
protocol://host:port/url-path
Trong đó
protocol: Là phương thức xử lý hay giao thức
(http, ftp)
host: Là tên hoặc địa chỉ IP của máy tính nơi
đặt tài nguyên
port: Cổng hoạt động của giao thức(tùy chọn), phụ
thuộc vào scheme
url-path: Là đường dẫn đến tài nguyên
Lập trình trên thiết bị di động 148
Một số protocol và loại connection
Lập trình trên thiết bị di động
Protocol Kết nối Kiểu kết nối GCF Định nghĩa
bởi
bt12cap Bluetooth L2CAPConnection JSR82
datagram Datagram DatagramConnection Mọi CLDC ,
CDC, MIDP
File File Access FileConnection,
InputConnection
JSR75
149
http HyperText
TransferProtocol
HttpConnection MIDP 1.0, MIDP
2.0, Foundation
Profile, J2SE (JSR
197). Support is
required
https Secure HTTP HttpsConnection MIDP 2.0
comm Serial I/O ComConnection MIDP 2.0
Lập trình trên thiết bị di động 150
sms
mms
cbs
Short messaging
service
Multimedia
Messaging Service
Cell Broadcast SMS
MessageConnection JSR 120, JSR 205
comm Serial I/O ComConnection MIDP 2.0
Socket
ServerSocket
Socket SocketConnection,
ServerSocketConn
ection
JSR118 (MIDP
2.0)
datagram UDP Datagram UDPDatagramCon
nection
JSR118 (MIDP
2.0)
Lập trình trên thiết bị di động 151
Kết nối HTTP
HTTP là giao thức duy nhất chắc chắn
được hỗ trợ bởi MIDP 1.0. Chúng ta có
thể giao tiếp với máy chủ hay bất kỳ thiết
bị từ xa nào có hỗ trợ giao thức này nhờ
vào lớp HttpConnection. Lớp Connector
cung cấp cho người dùng bảy phương
thức để tạo kết nối tới máy chủ .
Lập trình trên thiết bị di động 152
Phương thức Mô tả
static Connection open(String name) Tạo một kết nối có chế độ
READ_WRITE
static Connection open(String name,
int mode)
Tạo một kết nối với chế độ được chỉ
định
static Connection open(String name,
int mode, boolean timeouts)
Tạo một kết nối với chế độ được chỉ
định, thêm ngoại lệ time out
Lập trình trên thiết bị di động 153
static InputStream
openInputStream(String name)
Tạo kết nối luồng nhập
static OutputStream
openOutputStream(String
name)
Tạo kết nối luồng xuất
static DataInputStream
openDataInputStream(String
name)
Tạo kết nối luồng nhập
kiểu DataInputStream
static DataOutputStream
openDataOutputStream(String
name)
Tạo kết nối luồng xuất
kiểu DataOutputStream
Lập trình trên thiết bị di động 154
Tìm hiểu kết nối qua Socket
- Socket có thể thực thi giao tiếp giữa hai hệ thống và cho phép
kết nối mạng được coi như là một dòng (stream).
- Một socket tạo thành một dòng có thể đọc hoặc ghi.
- GCF cung cấp hai giao diện để làm việc với dòng:
* StreamConnectionNotifier
* StreamConnection
- StreamConnectionNotifier được dùng cho máy chủ quản lý
cổng mà máy khách kết nối đến.
Generic Connection Framework
Lập trình trên thiết bị di động 155
Hoạt động của Socket:
Máy chủ lắng nghe các kết nối từ máy
khách
Máy khách tạo kết nối đến máy chủ
Khi đã kết nối thành công thì trao đổi dữ
liệu
Generic Connection Framework
Lập trình trên thiết bị di động 156
Hành động có thể làm trên Socket
a. Viết từ Socket: Khi đã kết nối tốt, một dòng ra được
sinh ra từ StreamConnection dùng phương thức
openOutputStream() hoặc openDataOutputStream() và
dùng một vài phương thức của OutputStream để viết dữ
liệu . Lớp liên quan: OutputStream, DataOutput,
DataOutputStream
b. Đọc từ Socket: API dùng để đọc từ socket cũng
tương tự như các APIs output nhưng dùng để đọc. Khi
đã có dòng vào có một số lớp có thể giúp lấy dữ liệu từ
một dòng. Các lớp liên quan: InputStream, DataInput,
DataInputStream, Reader, InputStreamReader.
Generic Connection Framework
Lập trình trên thiết bị di động 157
Khi nào dùng Socket
- Khi yếu tố tốc độ được đặt lên hàng đầu
Generic Connection Framework
Lập trình trên thiết bị di động 158
Tìm hiểu Datagram
- Datagram được thiết kế để gửi gói dữ liệu trên một
mạng.
- Datagram cho phép gửi dữ liệu cho dù máy phục
vụ có lắng nghe hay không.
- Datagram là cách gửi dữ liệu không chắc chắn.
- Datagram gói dữ liệu theo gói và gửi không cần
biết thứ tự
Generic Connection Framework
Lập trình trên thiết bị di động 159
Datagram trong J2ME
- Trong GCF Datagram tồn tại trong hai lớp là
DatagramConnection và Datagram.
- Datagram không giống như một dòng.
- Để gửi dữ liệu sử dụng J2ME API bạn cần ba thứ:
địa chỉ gửi gói dữ liệu, cổng nơi hệ thống nhận dữ
liệu và dữ liệu.
- Dữ liệu trong Datagram ở dạng byte
Generic Connection Framework
Lập trình trên thiết bị di động 160
Ví dụ
- Máy khách kết nối
DatagramConnection conn=
(DatagramConnection)Connector.open(“datagram://127.0.0.1:88”,
Connector.READ_WRITE);
- Tạo đối tượng Datagram để gửi thông báo
Datagram datagr= conn.newDatagram(100);
- Chuyển dữ liệu sang dạng byte
byte [] data=“Message from client”.getBytes();
- Đặt dữ liệu vào Datagram
datagr.setData(data,0,data.length);
- Gửi dữ liệu
conn.send(datagr);
Lập trình trên thiết bị di động 161
Q/A
Lập trình trên thiết bị di động 162
Các file đính kèm theo tài liệu này:
- ltttbd_chuong2_p2_9731.pdf