国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

J2ME藍(lán)牙手機(jī)應(yīng)用程序開發(fā)實(shí)戰(zhàn)入門

2019-11-18 15:54:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  目前,很多手機(jī)已經(jīng)具備了藍(lán)牙功能。雖然MIDP2.0沒(méi)有包括藍(lán)牙API,但是JCP定義了JSR82, java APIs for Bluetooth Wireless Technology (JABWT).這是一個(gè)可選API,很多支持MIDP2.0的手機(jī)已經(jīng)實(shí)現(xiàn)了,比如Nokia 6600, Nokia 6670,Nokia7610等等。對(duì)于一個(gè)開發(fā)者來(lái)說(shuō),假如目標(biāo)平臺(tái)支持JSR82的話,在制作聯(lián)網(wǎng)對(duì)戰(zhàn)類型游戲或者應(yīng)用的時(shí)候,藍(lán)牙是一個(gè)相當(dāng)不錯(cuò)的選擇。
  
  本文給出了一個(gè)最簡(jiǎn)單的藍(lán)牙應(yīng)用的J2ME程序,用以幫助開發(fā)者快速的把握J(rèn)SR82。該程序分別在2臺(tái)藍(lán)牙設(shè)備上安裝后,一臺(tái)設(shè)備作為服務(wù)端先運(yùn)行,一臺(tái)設(shè)備作為客戶端后運(yùn)行。在服務(wù)端上我們發(fā)布了一個(gè)服務(wù),該服務(wù)的功能是把客戶端發(fā)過(guò)來(lái)的字符串轉(zhuǎn)變?yōu)榇髮懽址?蛻舳似饎?dòng)并搜索到服務(wù)端的服務(wù)后,我們就可以從客戶端的輸入框里輸入任意的字符串,發(fā)送到服務(wù)端去,同時(shí)觀察服務(wù)端的反饋結(jié)果。
  
  實(shí)例代碼
  
  該程序包括3個(gè)java文件。一個(gè)是MIDlet,另外2個(gè)為服務(wù)端GUI和客戶端GUI。該程序已經(jīng)在wtk22模擬器和Nokia 6600,Nokia 6670兩款手機(jī)上測(cè)試通過(guò)。
  
  StupidBTMIDlet.java
  import javax.microedition.lcdui.Alert;
  import javax.microedition.lcdui.AlertType;
  import javax.microedition.lcdui.Command;
  import javax.microedition.lcdui.CommandListener;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.List;
  import javax.microedition.midlet.MIDlet;
  import javax.microedition.midlet.
  MIDletStateChangeException;
  
  /**
  * @author Jagie
  *
  * MIDlet
  */
  public class StupidBTMIDlet extends
  MIDlet implements CommandListener
  {
  List list;
  
  ServerBox sb;
  
  ClientBox cb;
  
  /*
  * (non-Javadoc)
  *
  * @see javax.microedition.
  midlet.MIDlet#startApp()
  */
  PRotected void startApp()
  throws MIDletStateChangeException
  {
  list = new List
  ("藍(lán)牙入門", List.IMPLICIT);
  list.append("Client", null);
  list.append("Server", null);
  list.setCommandListener(this);
  Display.getDisplay(this).setCurrent(list);
  
  }
  
  /**
  * debug方法
  * @param s 要顯示的字串
  */
  
  public void showString(String s)
  {
  Displayable dp =
  Display.getDisplay(this).getCurrent();
  Alert al = new Alert(null, s,
  null, AlertType.INFO);
  al.setTimeout(2000);
  Display.getDisplay(this).setCurrent(al, dp);
  }
  
  /**
  * 顯示主菜單
  *
  */
  
  public void showMainMenu()
  {
  Display.getDisplay(this).
  setCurrent(list);
  }
  
  
  protected void pauseApp()
  {
  // TODO Auto-generated method stub
  
  }
  
  public void commandAction
  (Command com, Displayable disp)
  {
  if (com == List.SELECT_COMMAND)
  {
  List list = (List) disp;
  int index = list.getSelectedIndex();
  if (index == 1)
  {
  if (sb == null)
  {
  sb = new ServerBox(this);
  }
  sb.setString(null);
  Display.getDisplay(this)
  .setCurrent(sb);
  } else {
  //每次都生成新的客戶端實(shí)例
  cb = null;
  System.gc();
  cb = new ClientBox(this);
  
  Display.getDisplay(this)
  .setCurrent(cb);
  }
  }
  }
  
  protected void destroyApp(boolean arg0)
  throws MIDletStateChangeException
  {
  // TODO Auto-generated method stub
  
  }
  
  }
  
  ClientBox.java
  
  import java.io.DataInputStream;
  import java.io.DataOutputStream;
  import java.io.IOException;
  
  import java.util.Vector;
  
  import javax.microedition.io.Connector;
  import javax.microedition.io.StreamConnection;
  import javax.microedition.lcdui.Command;
  import javax.microedition.lcdui.CommandListener;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.Form;
  import javax.microedition.lcdui.Gauge;
  import javax.microedition.lcdui.StringItem;
  import javax.microedition.lcdui.TextField;
  
  //jsr082 API
  import javax.bluetooth.BluetoothStateException;
  
  import javax.bluetooth.DeviceClass;
  import javax.bluetooth.DiscoveryAgent;
  import javax.bluetooth.DiscoveryListener;
  import javax.bluetooth.LocalDevice;
  import javax.bluetooth.RemoteDevice;
  import javax.bluetooth.ServiceRecord;
  import javax.bluetooth.UUID;
  
  /**
  * 客戶端GUI
  * @author Jagie
  *
  * TODO To change the template for
  this generated type comment go to
  * Window - Preferences -
  Java - Code Style - Code Templates
  */
  public class ClientBox extends
  Form implements Runnable, CommandListener,
  DiscoveryListener
  {
  
  //字串輸入框
  TextField input =
  new TextField(null, "", 50, TextField.ANY);
  //loger
  StringItem result =
  new StringItem("結(jié)果:", "");
  
  private DiscoveryAgent discoveryAgent;
  
  private UUID[] uuidSet;
  
  //響應(yīng)服務(wù)的UUID
  private static final UUID
  ECHO_SERVER_UUID = new UUID(
  "F0E0D0C0B0A000908070605040302010", false);
  
  //設(shè)備集合
  Vector devices = new Vector();
  //服務(wù)集合
  Vector records = new Vector();
  
  //服務(wù)搜索的事務(wù)id集合
  int[] transIDs;
  StupidBTMIDlet midlet;
  
  public ClientBox(StupidBTMIDlet midlet)
  {
  super("");
  this.midlet=midlet;
  
  this.append(result);
  
  this.addCommand(new Command
  ("取消",Command.CANCEL,1));
  this.setCommandListener(this);
  
  new Thread(this).start();
  }
  
  public void commandAction
  (Command arg0, Displayable arg1)
  {
  if(arg0.getCommandType
  ()==Command.CANCEL){
  midlet.showMainMenu();
  }else{
  //匿名內(nèi)部Thread,訪問(wèn)遠(yuǎn)程服務(wù)。
  Thread fetchThread=new Thread()
  {
  public void run()
  {
  for(int i=0;i<records.size();i++)
  {
  
  ServiceRecord sr=(ServiceRecord)
  records.elementAt(i);
  
  if(accessService(sr))
  {
  
  //訪問(wèn)到一個(gè)可用的服務(wù)即可
  
  break;
  }
  }
  }
  };
  fetchThread.start();
  }
  
  }
  
  private boolean accessService
  (ServiceRecord sr)
  {
  boolean result=false;
  try {
  String url = sr.getConnectionURL(
  ServiceRecord.
  NOAUTHENTICATE_NOENCRYPT, false);
  StreamConnection
  conn = (StreamConnection)
  Connector.open(url);
  
  DataOutputStream dos=
  conn.openDataOutputStream();
  dos.writeUTF(input.getString());
  dos.close();
  DataInputStream dis=conn.openDataInputStream();
  String echo=dis.readUTF();
  dis.close();
  showInfo("反饋結(jié)果是:"+echo);
  result=true;
  
  } catch (IOException e)
  {
  
  }
  return result;
  }
  
  public synchronized void run()
  {
  //發(fā)現(xiàn)設(shè)備和服務(wù)的過(guò)程中,
  給用戶以Gauge
  Gauge g=new Gauge(null,false,Gauge.INDEFINITE,
  Gauge.CONTINUOUS_RUNNING);
  this.append(g);
  showInfo("藍(lán)牙初始化...");
  boolean isBTReady = false;
  
  try
  {
  
  LocalDevice localDevice
  = LocalDevice.getLocalDevice();
  discoveryAgent
  = localDevice.getDiscoveryAgent();
  
  isBTReady = true;
  } catch (Exception e)
  {
  e.printStackTrace();
  }
  
  if (!isBTReady)
  {
  showInfo("藍(lán)牙不可用");
  //刪除Gauge
  this.delete(1);
  return;
  }
  
  uuidSet = new UUID[2];

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥阳县| 玛多县| 隆化县| 攀枝花市| 阳山县| 察隅县| 桐梓县| 报价| 邹平县| 太康县| 大关县| 安乡县| 温州市| 拜城县| 肇庆市| 宜兰县| 开原市| 讷河市| 七台河市| 丰城市| 苍南县| 农安县| 浦江县| 蛟河市| 正阳县| 伊金霍洛旗| 龙里县| 梁山县| 双流县| 丰台区| 印江| 游戏| 土默特左旗| 海南省| 黔南| 德阳市| 塔城市| 建瓯市| 织金县| 多伦县| 西华县|