亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2ME藍牙實戰入門

2019-11-18 12:45:46
字體:
來源:轉載
供稿:網友

  目前,很多手機已經具備了藍牙功能。雖然MIDP2.0沒有包括藍牙API,但是JCP定義了JSR82, java APIs for Bluetooth Wireless Technology (JABWT).這是一個可選API,很多支持MIDP2.0的手機已經實現了,比如Nokia 6600, Nokia 6670,Nokia7610等等。對于一個開發者來說,假如目標平臺支持JSR82的話,在制作聯網對戰類型游戲或者應用的時候,藍牙是一個相當不錯的選擇。本文給出了一個最簡單的藍牙應用的J2ME程序,用以幫助開發者快速的把握JSR82。該程序分別在2臺藍牙設備上安裝后,一臺設備作為服務端先運行,一臺設備作為客戶端后運行。在服務端上我們發布了一個服務,該服務的功能是把客戶端發過來的字符串轉變為大寫字符串??蛻舳似饎硬⑺阉鞯椒斩说姆蘸?,我們就可以從客戶端的輸入框里輸入任意的字符串,發送到服務端去,同時觀察服務端的反饋結果。

  本文并不具體講述藍牙的運行機制和JSR82的API結構,關于這些知識點,請參考本文的參考資料一節,這些參考資料會給你一個權威的精確的解釋

  實例代碼

  該程序包括3個java文件。一個是MIDlet,另外2個為服務端GUI和客戶端GUI。該程序已經在wtk22模擬器和Nokia 6600,Nokia 6670兩款手機上測試通過。



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("傻瓜藍牙入門", 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 {
               //每次都生成新的客戶端實例
               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("結果:", "");

   private DiscoveryAgent discoveryAgent;

   
   private UUID[] uuidSet;

   //響應服務的UUID
   private static final UUID ECHO_SERVER_UUID = new UUID(
           "F0E0D0C0B0A000908070605040302010", false);

   //設備集合
   Vector devices = new Vector();
   //服務集合
   Vector records = new Vector();
   
   //服務搜索的事務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{
           //匿名內部Thread,訪問遠程服務。
           Thread fetchThread=new Thread(){
               public void run(){
                   for(int i=0;i<records.size();i++){
                       ServiceRecord sr=(ServiceRecord)records.elementAt(i);
                       if(accessService(sr)){
                           //訪問到一個可用的服務即可
                           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("反饋結果是:"+echo);
           result=true;
           
       } catch (IOException e) {
           
       }
       return result;
   }

   public synchronized void run() {
       //發現設備和服務的過程中,給用戶以Gauge
       Gauge g=new Gauge(null,false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
       this.append(g);
       showInfo("藍牙初始化...");
       boolean isBTReady = false;

       try {

           LocalDevice localDevice = LocalDevice.getLocalDevice();
           discoveryAgent = localDevice.getDiscoveryAgent();

           isBTReady = true;
       } catch (Exception e) {
           e.printStackTrace();
       }

       if (!isBTReady) {
           showInfo("藍牙不可用");
           //刪除Gauge
           this.delete(1);
           return;
       }

       uuidSet = new UUID[2];

       //標志我們的響應服務的UUID集合
       uuidSet[0] = new UUID(0x1101);
       uuidSet[1] = ECHO_SERVER_UUID;


       
       try {
           discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
       } catch (BluetoothStateException e) {

       }

       try {
           //阻塞,由inquiryCompleted()回調方法喚醒
           wait();
       } catch (InterruptedException e1) {
           
           e1.printStackTrace();
       }
       showInfo("設備搜索完畢,共找到"+devices.size()+"個設備,開始搜索服務");
       transIDs = new int[devices.size()];
       for (int i = 0; i < devices.size(); i++) {
           RemoteDevice rd = (RemoteDevice) devices.elementAt(i);
           try {
               //記錄每一次服務搜索的事務id
               transIDs[i] = discoveryAgent.searchServices(null, uuidSet,
                       rd, this);
           } catch (BluetoothStateException e) {
               continue;
           }

       }
       
       try {
           //阻塞,由serviceSearchCompleted()回調方法在所有設備都搜索完的情況下喚醒
           wait();
       } catch (InterruptedException e1) {
           e1.printStackTrace();
       }
       
       showInfo("服務搜索完畢,共找到"+records.size()+"個服務,預備發送請求");
       if(records.size()>0){
           this.append(input);
           this.addCommand(new Command("發送",Command.OK,0));
       }
       
       //刪除Gauge
       this.delete(1);
       
   }
   
   /**
    * debug
    * @param s
    */
   
   private void showInfo(String s){
       StringBuffer sb=new StringBuffer(result.getText());
       if(sb.length()>0){
           sb.append("/n");
       }
       sb.append(s);
       result.setText(sb.toString());

   }
   
   /**
    * 回調方法
    */

   public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {

       if (devices.indexOf(btDevice) == -1) {
           devices.addElement(btDevice);
       }
   }

   /**
    * 回調方法,喚醒初始化線程
    */
   public void inquiryCompleted(int discType) {

       synchronized (this) {
           notify();
       }
   }
   /**
    * 回調方法
    */
   public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
       for (int i = 0; i < servRecord.length; i++) {
           records.addElement(servRecord[i]);
       }
   }
   
   /**
    * 回調方法,喚醒初始化線程
    */

   public void serviceSearchCompleted(int transID, int respCode) {
       
       for (int i = 0; i < transIDs.length; i++) {
           if (transIDs[i] == transID) {
               transIDs[i] = -1;
               break;
           }
       }
       
       //假如所有的設備都已經搜索服務完畢,則喚醒初始化線程。

       boolean finished = true;
       for (int i = 0; i < transIDs.length; i++) {
           if (transIDs[i] != -1) {
               finished = false;
               break;
           }
       }

       if (finished) {
           synchronized (this) {
               notify();
           }
       }

   }

}

photoshop教程 數據結構 五筆輸入法專題 QQ病毒專題 共享上網專題 Google工具和服務專題



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费中文字幕| 中文字幕精品影院| 国产精品福利片| www.国产精品一二区| 成人久久久久爱| 欧美日韩另类在线| 成人免费在线视频网址| 这里只有精品视频| 亚洲天堂网站在线观看视频| 奇米一区二区三区四区久久| 97超级碰碰人国产在线观看| 亚洲欧美日韩天堂一区二区| 久久99国产综合精品女同| 一区三区二区视频| 中文字幕久热精品视频在线| 欧美伦理91i| 成人精品一区二区三区| 亚洲欧美日本伦理| 欧美在线影院在线视频| 欧美日韩国产一区中文午夜| 国产欧美在线视频| 国产大片精品免费永久看nba| 久久久成人的性感天堂| 亚洲色在线视频| 国产精品白嫩美女在线观看| 久久免费福利视频| 日韩在线观看高清| 日韩av成人在线| 亚洲理论片在线观看| 欧美性猛交xxxx免费看久久久| 日韩女在线观看| 大量国产精品视频| 久久精品视频在线观看| 欧美最近摘花xxxx摘花| 欧美日韩国产精品一区二区不卡中文| 国产aⅴ夜夜欢一区二区三区| 欧美日韩在线免费观看| 欧美裸身视频免费观看| 亚洲精选一区二区| 欧美巨乳在线观看| 国产精品久久婷婷六月丁香| 中文字幕国产精品| 亚洲第一偷拍网| 91精品久久久久久久久青青| 久久精品视频免费播放| 欧美日韩国产精品| 亚洲午夜精品久久久久久性色| 亚洲国产精品99| 欧美片一区二区三区| 亚洲精品国产电影| 一区二区国产精品视频| 欧美精品一区三区| 伊人伊成久久人综合网小说| 国产精品久久久久久亚洲调教| 亚洲精品国产精品乱码不99按摩| 亚洲精品av在线播放| 国产精品久久久一区| 国产精品18久久久久久首页狼| 国产精品成人av在线| 性金发美女69hd大尺寸| 亚洲精品aⅴ中文字幕乱码| 午夜精品99久久免费| 日韩三级成人av网| 中文.日本.精品| 欧美视频在线看| 精品美女久久久久久免费| 亚洲在线一区二区| 欧美一区二区色| 日韩精品亚洲精品| 久久久久久久久久国产精品| 伊人一区二区三区久久精品| 精品久久香蕉国产线看观看亚洲| 成人在线小视频| 精品视频中文字幕| 国产精品日日做人人爱| 久久久女人电视剧免费播放下载| 九九热在线精品视频| 青青草原一区二区| 久久精品国产清自在天天线| 日本成人在线视频网址| 亚洲黄一区二区| 久久综合九色九九| 动漫精品一区二区| 久久久精品国产一区二区| 欧美精品免费看| 久久国产精品影片| 国产99视频精品免视看7| 久久久久久久久久久网站| 国产精品美女在线| 亚洲国产欧美一区二区三区久久| 久国内精品在线| 久久91超碰青草是什么| 亚洲电影第1页| 欧美性videos高清精品| 久久久日本电影| 国产精品男人爽免费视频1| 欧美激情亚洲精品| 国产精品激情av在线播放| 欧美区二区三区| 久久免费精品视频| 亚洲欧洲日产国产网站| 欧美做受高潮1| 久久综合国产精品台湾中文娱乐网| 欧美大码xxxx| 国产精品r级在线| 欧美激情国产高清| 懂色av影视一区二区三区| 亚洲激情第一页| 久久久av网站| 国产精品网站视频| 日韩欧美在线视频日韩欧美在线视频| 久久中文字幕视频| 久久久国产成人精品| 国产精品igao视频| 午夜剧场成人观在线视频免费观看| 亚洲天堂视频在线观看| 国产精品旅馆在线| 日本不卡高字幕在线2019| 亚洲成人中文字幕| 亚洲国产99精品国自产| 欧美日韩在线视频观看| 欧美精品免费在线观看| 一本色道久久88综合日韩精品| 欧美最猛黑人xxxx黑人猛叫黄| 日韩精品福利网站| 精品一区二区三区电影| 狠狠躁夜夜躁人人爽超碰91| 色综合天天狠天天透天天伊人| 日韩欧美aaa| 日韩在线观看免费高清完整版| 欧美在线激情视频| 日韩精品高清在线| 国产一区二区三区视频| 日韩中文在线观看| 亚洲丝袜在线视频| 日韩欧美999| 欧美裸身视频免费观看| 精品视频在线导航| 成人黄色片在线| 国产成人拍精品视频午夜网站| 欧美日韩国产精品| 亚洲欧美日韩第一区| 91黑丝在线观看| 欧美中文在线字幕| 正在播放欧美一区| 久久久精品一区二区| 国产日韩在线视频| 精品福利视频导航| 2019亚洲男人天堂| 日韩成人在线播放| 日韩中文字幕在线播放| 国产69精品99久久久久久宅男| 亚洲精品国产精品乱码不99按摩| 欧美视频专区一二在线观看| 国产精品专区一| 欧美性xxxxxxx| 亚洲自拍小视频免费观看| 日韩国产中文字幕| 国产精品久久久久久影视| 日韩视频―中文字幕| 亚洲国产精久久久久久久| 欧美成人午夜剧场免费观看| 久久久久国产精品www| 亚洲精品第一国产综合精品|