Lập trình trên thiết bị di động
1. Giới thiệu java và ứng dụng lập trình trên thiết bị di động
2. MIDlet
3. Đồ họa trong J2ME
4. Lập trình Bluetooth
5. Phát triển ứng dụng MIDlet
6. Kết luận
20 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2910 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Lập trình trên thiết bị di động, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1/ҰP TRÌNH TRÊN THIӂT BI DI ĈӜNG
1. Giӟi thiӋu Java và ӭng dөng lұp trình trên thiӃt bӏ di ÿӝng
1.1 Giӟi thiӋu vӅ Java
Vào nhӳng năm 1990, Java ÿѭӧc ra ÿӡi tӯ dӵ án xanh và ban ÿҫu ÿѭӧc xây dӵng ÿӇ kiiӇm
sóat các thí bӏ dân dөng và mӝt sӕ thiӃt bӏ cҫm tay. Java ÿѭӧc xây dӵng chӫ yӃu dӵa trong bӝ
công cө phát triӇn (Java Development Kit – JDK) nhѭ là thѭ viӋn chuҭn trong ÿó chӭa trình
biên dӏch, trình thông dӏch,… Ĉây chính là nӅn tҧng cho viӋc phát triӇn ӭng dөng Java. HiӋn
nay các nhà phát triӇn ÿã xây dӵng nhiӅu nhánh mӟi cho Java nhѭ:
J2EE ( Java 2 Platform Enterprise Edition): Phiên bҧn dành cho máy chӫ lӟn vӟi sӭc
Pҥnh xӱ lý và dung lѭӧng bӝ nhӟ lӟn.
J2SE ( Java 2 Platform Standard Edition): Phiên bҧn chuҭn chҥy trên các máy PC và
laptop.
J2ME ( Java 2 Platform Micro Edition): là phiên bҧn rút gӑn cӫa Java cho các thiӃt di
ÿӝng giӟi hҥn vӅ bӝ nhӟ và bӝ xӱ lý.
1.2 Ӭng dөng lұp trình trên thiӃt bӏ di ÿӝng bҵng J2ME
0өc tiêu cӫa cӫa J2ME là cho phép ngѭӡi lұp trình viӃt các chѭѫng trình ӭng dөng ÿӝng lұp
Yӟi thiӃt bӏ di ÿӝng, không cҫn quan tâm ÿӃn phҫn cӭng. J2ME ÿѭӧc xây dӵng bҵng các tҫng
khác nhau ÿӇ giҩu ÿi viӋc thӵc hiӋn phҫn cӭng khӓi nhà phát triӇn. Sau ÿây là các tҫng cӫa
j2ME ÿѭӧc xây dӵng trên CLDC:
7ҫng phҫn cӭng thiӃt bӏ: Ĉây là thiӃt bӏ di ÿӝng vӟi cҩu hình phҫn cӭng cӫa nó nhѭ bӝ nhӟ,
Wӕc ÿӝ xӱ lý. Các thiӃt bӏ di ÿӝng khác nhau có thӇ có các bӝ xӱ lý khác nhau vӟi các mã lӋnh khác
nhau. Mөc tiêu cӫa J2ME là cung cҩp mӝt chuҭn cho tҩt cҧ các lӑai thiӃt bӏ di ÿӝng khác nhau.
7ҫng máy ҧo Java: Khi mã nguӗn Java ÿѭӧc biên dӏch nó ÿѭӧc chuyӇn ÿәi thành mã
bytecode. Mã bytecode 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 này cung
Fҩ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Ӈ hӑat
ÿӝng trên bҩt kǤ thiӃt bӏ di ÿӝng nào có J2ME KVM.
Phҫn cӭng thiӃt bӏ
Máy ҧo Java
&ҩu hình
CLCD-( Connected Limited Device Configuration)
HiӋn trҥng
MIDP- Mobile
Information
DeviceProfile
Các API khác
27ҫng cҩu hình : 7ҫng cҩu hình cӫa CLDC ÿӏnh nghƭa giao diӋn ngôn ngӳ Java 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 . Ngѭӡi lұp trình có thӇ sӱ dөng các lӟp và phѭѫng thӭc cӫa các API này tuy nhiên
các API hӳu dөng hѫn ÿѭӧc chӭa trong tҫng hiӋn trҥng.
7ҫng hiӋn trҥng: Tҫng này cung cҩp các API hӳu dөng hѫn cho ngѭӡi lұp trình. Mөc ÿích
Fӫa hiӋn trҥng là xây 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. CNJng có thӇ có các hiӋn trҥng và các API khác ngòai MIDP
ÿѭӧc dùng cho ӭng dөng, cNJng có thӇ có mӝt hiӋn trҥng ÿӏnh nghƭa các API cho viӋc tҥo các ӭng
Gөng Bluetooth.
HiӋn nay, MIDP có hai phiên bҧn là MIDP 1.0 và MIDP 2.0 và cung cҩp:
- Các lӟp và các kiӇu dӳ liӋu
- +ӛ trӧÿӕi tѭӧng Display
- +ӛ trӧ Form và giao diӋn ngѭӡi dùng
- +ӛ trӧ Timer và Alert
- +ӛ trӧ Record Management System( RMS) cho viӋc lѭu trӳ dӳ liӋu.
Các tính năng nәi bұt cӫa MIDP 2.0 so vӟi MIDP 1.0:
- Nâng cҩp tính năng bҧo mұt, hӛ trӧ giao thӭc HTTPS, kiӇm sóat viӋc kӃt nӕi máy di ÿӝng
Yӟi server.
- Thêm các API hӛ trӧ Multimedia.
- 0ӣ rӝng các tính năng cӫa Form
2. MIDlet
Các ӭng dөng J2ME ÿѭӧc gӑi là MIDlet ( Mobile Information Device Applet). MIDlet là mӝt
Oӟp java mӣ rӝng cӫa lӟp trӯu tѭӧng javax.microedition.midlet.MIDlet và thӵc thi các phѭѫng thӭc
startApp(), pauseApp(), và destroyApp().
Ĉӑan chѭѫng trình tӕi thiӇu cӫa MIDlet:
import javax.microedition.midlet.*;
public class exMIDlet extend MIDlet {
public exMIDlet( ) { }
public void startApp( ) { }
public void pauseApp( ) { }
public void destroyApp( boolean unconditional ) { }
}
Trong ÿó :
o Phѭѫng thӭc exMIDlet là hàm constructor .
o Phѭѫng thӭc startApp( ) : ÿѭӧc gӑi bӣi bӝ quҧn lý ӭng dөng khi MIDlet ÿѭӧc
khӣi tҥo hay khi MIDlet trӣ vӅ trҥng thái tҥm dӯng.
o Phѭѫng thӭc pauseApp( ) : ÿѭӧc gӑi bӣi bӝ quҧn lý ӭng dөng mӛi khi ӭng dөng
Fҫn ÿѭӧc tҥm dӯng.
o Phѭѫng thӭc destroyApp( ): ÿѭӧc gӑi khi thoat khӓi MIDlet.
3. Ĉӗ hӑa trong J2ME
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 games.
33.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.
3.1.1 TextBox
/ӟp Textbox cho phép ngѭӡi dùng nhұp và sӑan thҧo văn bҧn. Ngѭӡi lұp trình có thӇ
ÿӏnh nghƭa sӕ ký tӵ tӕi ÿa, giӟi hҥn dӳ liӋu nhұp ( sӕ, mұt khҭu, imail,…) và hiӋu chӍnh
Qӝi dung cӫa textbox.
package Edu.TextBox;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import
javax.microedition.midlet.MIDletStateChangeException;
public class TextBoxMIDlet extends MIDlet implements
CommandListener {
private Display display;
private TextBox textBox;
private Command quitCommand;
public TextBoxMIDlet() {
}
public void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
protected void startApp() throws
MIDletStateChangeException {
display = Display.getDisplay(this);
quitCommand = new
Command("Thóat",Command.SCREEN,1);
textBox=new TextBox("Soan Thao:","",100,0);
textBox.addCommand(quitCommand);
textBox.setCommandListener(this);
display.setCurrent(textBox);
}
public void commandAction(Command choice, Displayable
displayable) {
if(choice==quitCommand){
destroyApp(false);
notifyDestroyed();
}
}
}
3.1.2 Form
Form là lӟp hӳu dөng nhҩt cӫa các lӟp Sreen 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à datafield, TextField, ImageItem.
4package Edu.Form;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import
javax.microedition.midlet.MIDletStateChangeExceptio
n;
public class FormMIDlet extends MIDlet implements
CommandListener {
private Display display;
private Form fr;
private Command themCommand;
private Command quitCommand;
public FormMIDlet() {
}
public void destroyApp(boolean unconditional)
{
}
protected void pauseApp() {
}
protected void startApp() throws
MIDletStateChangeException {
display = Display.getDisplay(this);
quitCommand = new
Command("Thóat",Command.SCREEN,1);
themCommand = new
Command("Thêm",Command.BACK,1);
fr=new Form("Form: ");
fr.append("Muc 1");
fr.addCommand(quitCommand);
fr.addCommand(themCommand);
fr.setCommandListener(this);
display.setCurrent(fr);
}
public void commandAction(Command choice,
Displayable displayable) {
if(choice==quitCommand){
destroyApp(false);
notifyDestroyed();
}
if(choice==themCommand){
fr.append("\nMuc moi");
}
}
}
3.1.3 List
/ӟp List là mӝt Screen chӭa danh sách các lӵa chӑn, ngѭӡi sӱ dөng có thӇ tѭѫng tác vӟi List
và chӑn mӝt hay nhiӅu item.
5package Edu.listbox;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import
javax.microedition.midlet.MIDletStateChangeExcepti
on;
public class listbox extends MIDlet implements
CommandListener {
private Display display;
private List ls;
private Command chonCommand;
private Command quitCommand;
public listbox() {
}
public void destroyApp(boolean
unconditional) {
}
protected void pauseApp() {
}
protected void startApp() throws
MIDletStateChangeException {
display = Display.getDisplay(this);
quitCommand = new
Command("Thóat",Command.SCREEN,1);
chonCommand = new
Command("Chon",Command.BACK,1);
ls=new List(null, Choice.IMPLICIT, new
String[]{ "Muc chon 1", "Muc chon 2", "Muc chon 3"
}, new Image[]{null, null, null });
ls.addCommand(quitCommand);
ls.addCommand(chonCommand);
ls.setCommandListener(this);
display.setCurrent(ls);
}
public void commandAction(Command choice,
Displayable displayable) {
if(choice==quitCommand){
destroyApp(false);
notifyDestroyed();
}
if(displayable == ls){
if( choice ==ls.SELECT_COMMAND)
{
switch( ls.getSelectedIndex()){
case 0:
/////..........
break;
case 1:
//////.........
break;
case 2:
//////.........
break;
}
}
}
}
}
63.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 ÿӋm hình cùng vӟi các phѭѫng thӭc xӱ lý sӵ kiӋn bàn
phím. Lӟp này dùng cho các ӭng dөng trò chѫi cҫn ÿLӅu khiӇn vӅ màn hình.
Canvas và Graphics là hai lӟp chӫ yӃu cӫa các hàm API cҩp thҩp. Canvas là mӝt khung cho
phép ngѭӡi lұp trình có thӇ vӁ lên thiӃt bӏ trình bày cNJng nhѭ viӋc xӱ lý sӵ kiӋn. Còn lӟp Graphics
cung cҩp các ÿӕi tѭӧng ÿӇ vӁ.
3.2.1 Lӟp Canvas
/ӟp Canvas là mӝt lӟp trӯu tѭӧng, ta phҧi tҥo các canvas cӫa riêng ÿӇ vӁ trên lӟp mӣ rӝng
này và lӟp Canvas cung cҩp phѭѫng thӭc:
- paint (Graphics g) ÿӇ thӵc hiӋn vӁ lên canvas.
- repaint() ÿӇ thӵc hiӋn vӁ lҥi các hình ÿã hiӋn thӏ trên màn hình.
Mӛi lӟp canvas tӵÿӝng nhұn sӵ kiӋn cӫa phím bҵng cách sӱ dөng các phѭѫng thӭc:
- void keyPressed (int keyCode): Ĉѭӧc gӑi khi mӝt phím ÿѭӧc nhҩn
- void keyReleased( int keyCode): Ĉѭӧc gӑi khi mӝt phím ÿѭӧc thҧ.
- void keyRepeated( int keyCode): Ĉѭӧc gӑi khi mӝt phím bӏ giӳ.
- int getKeyCode(int gameAction): Lҩy mӝt mã phím phҧn hӗi lҥi hành ÿӝng game xác ÿӏnh
trên thiӃt bӏ
- String getKeyName (int keyCode): Lҩy tên cӫa phím có giá trӏ mã phím là keyCode
- int getGameAction(int keyCode): Lҩy mӝt hành ÿӝng game liên quan ÿӃn mã phím ÿѭӧc
nhҩn.
- void pointerDragged( int x, int y): Ĉѭӧc gӑi khi rê chuӝt ÿӃn tӑa ÿӝ x, y mӟi.
- void pointerPressed ( int x, int y) : Ĉѭӧc gӑi khi nhҩn chuӝt tҥi tӑa ÿӝ x, y
- void pointerReleased ( int x, int y): Ĉѭӧc gӑi khi thҧ chuӝt tҥi tӑa ÿӝ x, y.
3.2.2 Lӟp Graphics
Ĉӕi tѭӧng Graphics có thӇÿѭӧc sӱ dөng ÿӇ vӁ: hình vuông, hình chӳ nhұt, cung tròn,
ÿѭӡng thҷng, ký tӵ, ҧnh, văn bҧn trên ÿӕi tѭӧng Canvas.
Các phѭѫng thӭc:
- void setColor(int red, int green, int blue)
- void drawArc(…): vӁ cung tròn.
- void drawRect(…): vӁ hình chӳ nhұt
- void drawString(…): VӁ chuӛi.
- void drawImage(…): vӁҧnh.
7package Edu.KeyCodes;
import
javax.microedition.lcdui.*;
import
javax.microedition.midlet.*;
import
javax.microedition.midlet.
MIDletStateChangeException;
public class KeyCodes extends
MIDlet {
private Display display;
private KeyCodeCanvas
canvas;
public KeyCodes() {
display=
Display.getDisplay(this);
canvas = new
KeyCodeCanvas(this);
}
public void
destroyApp(boolean
unconditional) {
}
protected void pauseApp() {
}
protected void startApp() throws
MIDletStateChangeException {
display.setCurrent(canvas);
}
public void exitMIDlet(){
destroyApp(false);
notifyDestroyed();
}
}
class KeyCodeCanvas extends Canvas implements
CommandListener{
private Command quitCommand;
private KeyCodes midlet;
private int x=getWidth()/2,
y=getHeight()/2;
public KeyCodeCanvas(KeyCodes midlet)
{
this.midlet= midlet;
quitCommand = new
Command("Thóat", Command.SCREEN, 1);
addCommand(quitCommand);
setCommandListener(this);
}
protected void paint (Graphics g){
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(),
getHeight());
g.setColor(0, 0, 0);
g.drawArc(x, y,30, 30, 0, 360);
}
public void commandAction (Command c,
Displayable d) {
if (c== quitCommand){
midlet.exitMIDlet();
}
}
protected void keyPressed(int
keyCode) {
if (keyCode ==
getKeyCode(RIGHT)){
x=x+10;
}
if (keyCode ==
getKeyCode(LEFT)){
x=x-10;
}
if (keyCode == getKeyCode(UP)){
y=y-10;
}
if (keyCode ==
getKeyCode(DOWN)){
y=y+10;
}
repaint();
}
}
84. /ұp trình Bluetooth
.ӻ thuұt bluetooth ÿѭӧc dùng ÿӇ truyӅn thông giӳa ÿLӋn thӑai di ÿӝng vӟi ÿLӋn thӑai di ÿông,
hoһc giӳa ÿLӋn thӑai di ÿӝng và mán tính.
Có 3 phѭѫng thӭc truyӅn thông ÿѭӧc cài ÿһt trong kӻ thuұt bluetooth:
- OBEX - Object Exchange: dùng ÿӇ chuyӇn dӳ liӋu dҥng file, hình ҧnh.
- L2CAP- Logical Link Control and Adaptation Protocol: Dùng chuyӇn các gói dӳ liӋu
giӳa client và server.
- RFCOMM- Radio Frequency COMMunication: Dùng ÿӇ chuyӇn các luӗng dӳ liӋu ÿѫn
giҧn.
Sun Java cung cҩp thѭ viӋn hàm API bluetooth: Bluetooth JSR82 API package và bao gӗm tҩt cҧ
các phѭѫng thӭc truyӅn thông nói trên.
0ӝt ӭng dөng bluetooth bao gӗm hai phҫn: server dùng ÿӇ tҥo dӏch vө bluetooth và phҫn client
NӃt nӕi ÿӃn server và thӵc hiӋn truyӅn thông.
Phҫn server:
Mӝi mӝt thiӃt bӏ bluetooth bao gӗm mӝt ÿӕi tѭӧng thiӃt bӏ cөc bӝ mà nó giúp cho viӋc truyӅn
thông giӳa các thiӃt bӏ. Trong JSR82 phѭѫng thӭc LocalDevice.getLocalDevice() trҧ vӅÿӕi tѭӧng
này.
ĈӇ mӣÿѭӧc kӃt nӕi bluetooth phҧi sӱ dөng chuӛi URL bҵng phѭѫng thӭc Connector.open(URL)
và phѭѫng thӭc này trҧ vӅ luӗng chuyӇn dӳ liӋu StreamConnectionNotifier.
6ӱ dөng hai phѭѫng thӭc openOutputStream() hoһc openInputStream() ÿӇ gӣi hoһc nhұn dӳ
liӋu.
URL ÿѬӥc xác ÿӍnh: URL = "btspp://localhost:" + UUID +
";name=rfcommtest;authorize=true";
Trong ÿó UUID có thӇ là : OBEX, L2CAP, RFCOMM
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();
}
catch (BluetoothStateException e)
{
System.err.println( "BluetoothStateException: " + e.getMessage() );
}
9Phҫn Client:
ĈӇ tҥo ÿѭӧc client sӱ dөng các phѭѫng thӭc sau ÿӇ tìm thiӃt bӏ bluetooth và tìm dӏch vөÿѭӧc
Pӣ trên nó:
void deviceDiscovered(RemoteDevice btDevice, DeviceClass od)
void servicesDiscovered(int transID, ServiceRecord[] records)
Sau khi kӃt nӕi ÿѭӧc thiӃt bӏ bluetooth sӱ dөng các phѭѫng thӭc write () và read() ÿӇ gӣi và
nhұn dӳ liӋu.
catch (BluetoothStateException e)
{
System.err.println( "BluetoothStateException: " + e.getMessage() );
}
catch (IOException ex)
{
ex.printStackTrace();
}
catch(Exception e)
{
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();
}
}
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
{
try
{
// Device information
System.out.println("Major Device Class and information : " +
cod.getMajorDeviceClass() +
" Minor Device Class: " +
cod.getMinorDeviceClass());
System.out.println("Bluetooth Address of the device: " +
btDevice.getBluetoothAddress());
System.out.println("Friendly Name: " +
btDevice.getFriendlyName(true));
// Now its our responsibility to search its services
UUID uuidSet[] = new UUID[1];
uuidSet[0] = RFCOMM_UUID;
10
5. Phát triӇn ӭng dөng MIDlet
5.1 Chuҭn bӏ các phҫn mӅm
Eclipse 3.1
Sun Wireless Toolkit
EclipseME Plugin for Eclipse
5.2 Cài ÿһt
%ѭӟc 1: Cài các phҫn mӅm Eclipse và Wireless Toolkit
%ѭӟc 2: Cài ÿһt EclipseME plugin
int searchID = m_DscrAgent.searchServices(null,uuidSet,
btDevice,this);
}
catch (Exception e)
{
System.out.println("Device Discovered Error: " + e);
}
}
public void servicesDiscovered(int transID, ServiceRecord[] records)
{
for (int i = 0; i < records.length; i++)
{
m_strUrl = records[i].getConnectionURL(ServiceRecord.
AUTHENTICATE_ENCRYPT, false);
System.out.println(m_strUrl);
//we have found our service protocol
if(m_strUrl.startsWith("btspp"))
{
m_bServerFound = true;
m_bInitClient=true;
break;
}
}
11
%ѭӟc 3:
%ѭӟc 4:
%ѭӟc 5:
12
%ѭӟc 5:
%ѭӟc 6:
13
%ѭӟc 7:
%ѭӟc 8:
14
%ѭӟc 9:
%ѭӟc 10:
15
%ѭӟc 11:
%ѭӟc 12:
%ѭӟc 13:
16
%ѭӟc 14:
%ѭӟc 15:
17
%ѭӟc 16:
%ѭӟc 17:
18
%ѭӟc 18:
%ѭӟc 19:
19
5.3 Ĉóng gói chѭѫng trình
20
5.4 Cài ÿһt chѭѫng trình lên ÿLӋn thӑai di ÿӝng
Sau khi ÿóng gói chѭѫng trình sӱ dөng trình PC Suite ÿӇ cài ÿһt chѭѫng trình lên ÿLӋn thӑai
di ÿӝng
6. .Ӄt luұn
- %ѭӟc ÿҫu ÿã tìm hiӇu kiӃn trúc tә chӭc lұp trình J2ME trên thiӃt bӏ di ÿӝng.
- Ӭng vӟi mӛi kӻ thuұt lұp trình trên thiӃt bӏ di ÿӝng xây dӵng ÿѭӧc các ÿӑan mã J2ME
Wѭѫng ӭng.
Tài liӋu tham khҧo:
1.
2.
3.
4. Bluetooth – Link manager and J2ME programming, Kjell Jorgen Hole
Các file đính kèm theo tài liệu này:
- Lập trình trên thiết bị di động.pdf