⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btclient.java

📁 J2ME程序设计实例教程的源码
💻 JAVA
字号:
import javax.bluetooth.*;
import java.util.*;
import javax.microedition.io.*;
import java.io.*;

/**
 * 该类用于客户端查找蓝牙设备,搜索蓝牙服务,建立到蓝牙服务器的连接。
 */
public class BTClient implements Runnable, DiscoveryListener {
    private static final String uuidString = "00112233445566778899AABBCCDDEEFF";
    private GobangMIDlet midlet;
    private DiscoveryAgent agent;   //搜索代理对象
    private Vector deviceList;      //蓝牙设备列表
    private ServiceRecord record;   //搜索到的服务
    private int transID;
    
    //构造方法,创建蓝牙客户端
    public BTClient(GobangMIDlet midlet) throws BluetoothStateException {
        this.midlet = midlet;
        deviceList = new Vector();
        
        //获取蓝牙设备实例
        LocalDevice localDevice = LocalDevice.getLocalDevice(); 
        
        //获取搜索代理,该代理对象负责搜索附件的蓝牙设备和蓝牙设备上的服务。
        agent = localDevice.getDiscoveryAgent();
    }
    
    //开始搜索
    public void startDiscover() {
        Thread t = new Thread(this);
        t.start();
    }
    
    //搜索线程的执行体
    public void run() {
        try {
            //开始查找附近的蓝牙设备,该方法不会阻塞当前线程。
            agent.startInquiry(DiscoveryAgent.GIAC, this);
            synchronized(this) {
                try {
                    //阻塞当前线程,等待查询蓝牙设备结束。
                    this.wait();
                }
                catch(InterruptedException ie) {
                    //
                }
            }
            
            //开始搜索服务
            int n = deviceList.size();  
            UUID[] uuids = {new UUID(uuidString, false)};
            int i = 0;
            while(i<n && record == null) {
                RemoteDevice rDevice = (RemoteDevice)deviceList.elementAt(i);
                
                //搜索rDevice设备上的服务,该方法不会阻塞当前线程。
                transID = agent.searchServices(null, uuids, rDevice, this);
                synchronized(this) {
                    try {
                        //阻塞当前线程,等待查询服务结果
                        this.wait();
                    }
                    catch(InterruptedException ie) {
                        //
                    }
                }
                i++;
            }
            
            //创建连接
            if(record != null) {
                String url = record.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
                StreamConnection sconn = (StreamConnection)Connector.open(url);
                midlet.startPlay(new BTConnection(midlet, sconn));
            }
        }
        catch(BluetoothStateException bse) {
            //bse.printStackTrace();
        }
        catch(IOException ioe) {
            //ioe.printStackTrace();
        }
    }
    
    public void stopDiscover() {
        if(record == null) {
            agent.cancelServiceSearch(transID);
        }
    }
    
    //DiscoveryListener接口中的方法。
    //在远程蓝牙设备中搜索到蓝牙服务时,底层实现自动调用该方法,该方法可以被多次调用。
    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
        if(record == null) {
            record = servRecord[0];
        }
    }
    
    //DiscoveryListener接口中的方法。
    //在远程蓝牙设备中搜索蓝牙服务结束时,底层实现自动调用该方法。
    public void serviceSearchCompleted(int transID, int respCode) {
        synchronized(this) {
            this.notifyAll();
        }
    }
    
    //DiscoveryListener接口中的方法。
    //查找到蓝牙设备时,底层实现自动调用该方法,该方法可以被多次回调。
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
        if(cod.getMajorDeviceClass() == 0x200) {
            deviceList.addElement(btDevice);
        }
    }
    
    //DiscoveryListener接口中的方法
    //蓝牙设备查找结束时,底层实现自动调用该方法。
    public void inquiryCompleted(int discType) {
        synchronized(this) {
            notifyAll();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -