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

pdf20 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2848 | Lượt tải: 1download
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:

  • pdfLập trình trên thiết bị di động.pdf