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

📄 btimageclient.java

📁 手机蓝牙通信程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * * Copyright (c) 2007, Sun Microsystems, Inc. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * *  * Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. *  * Neither the name of Sun Microsystems nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */package example.bluetooth.demo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;import java.util.Hashtable;import java.util.Vector;// jsr082 APIimport javax.bluetooth.BluetoothStateException;import javax.bluetooth.DataElement;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;// midp/cldc APIimport javax.microedition.io.Connector;import javax.microedition.io.StreamConnection;import javax.microedition.lcdui.Image;/** * Initialize BT device, search for BT services, * presents them to user and picks his/her choice, * finally download the choosen image and present * it to user. * * @version , */final class BTImageClient implements Runnable, DiscoveryListener {    /** Describes this server */    private static final UUID PICTURES_SERVER_UUID =        new UUID("F0E0D0C0B0A000908070605040302010", false);    /** The attribute id of the record item with images names. */    private static final int IMAGES_NAMES_ATTRIBUTE_ID = 0x4321;    /** Shows the engine is ready to work. */    private static final int READY = 0;    /** Shows the engine is searching bluetooth devices. */    private static final int DEVICE_SEARCH = 1;    /** Shows the engine is searching bluetooth services. */    private static final int SERVICE_SEARCH = 2;    /** Keeps the current state of engine. */    private int state = READY;    /** Keeps the discovery agent reference. */    private DiscoveryAgent discoveryAgent;    /** Keeps the parent reference to process specific actions. */    private GUIImageClient parent;    /** Becomes 'true' when this component is finalized. */    private boolean isClosed;    /** Process the search/download requests. */    private Thread processorThread;    /** Collects the remote devices found during a search. */    private Vector /* RemoteDevice */ devices = new Vector();    /** Collects the services found during a search. */    private Vector /* ServiceRecord */ records = new Vector();    /** Keeps the device discovery return code. */    private int discType;    /** Keeps the services search IDs (just to be able to cancel them). */    private int[] searchIDs;    /** Keeps the image name to be load. */    private String imageNameToLoad;    /** Keeps the table of {name, Service} to process the user choice. */    private Hashtable base = new Hashtable();    /** Informs the thread the download should be canceled. */    private boolean isDownloadCanceled;    /** Optimization: keeps service search pattern. */    private UUID[] uuidSet;    /** Optimization: keeps attributes list to be retrieved. */    private int[] attrSet;    /**     * Constructs the bluetooth server, but it is initialized     * in the different thread to "avoid dead lock".     */    BTImageClient(GUIImageClient parent) {        this.parent = parent;        // we have to initialize a system in different thread...        processorThread = new Thread(this);        processorThread.start();    }    /**     * Process the search/download requests.     */    public void run() {        // initialize bluetooth first        boolean isBTReady = false;        try {            // create/get a local device and discovery agent            LocalDevice localDevice = LocalDevice.getLocalDevice();            discoveryAgent = localDevice.getDiscoveryAgent();            // remember we've reached this point.            isBTReady = true;        } catch (Exception e) {            System.err.println("Can't initialize bluetooth: " + e);        }        parent.completeInitialization(isBTReady);        // nothing to do if no bluetooth available        if (!isBTReady) {            return;        }        // initialize some optimization variables        uuidSet = new UUID[2];        // ok, we are interesting in btspp services only        uuidSet[0] = new UUID(0x1101);        // and only known ones, that allows pictures        uuidSet[1] = PICTURES_SERVER_UUID;        // we need an only service attribute actually        attrSet = new int[1];        // it's "images names" one        attrSet[0] = IMAGES_NAMES_ATTRIBUTE_ID;        // start processing the images search/download        processImagesSearchDownload();    }    /**     * Invoked by system when a new remote device is found -     * remember the found device.     */    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {        // same device may found several times during single search        if (devices.indexOf(btDevice) == -1) {            devices.addElement(btDevice);        }    }    /**     * Invoked by system when device discovery is done.     * <p>     * Remember the discType     * and process its evaluation in another thread.     */    public void inquiryCompleted(int discType) {        this.discType = 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) {        // first, find the service search transaction index        int index = -1;        for (int i = 0; i < searchIDs.length; i++) {            if (searchIDs[i] == transID) {                index = i;                break;            }        }        // error - unexpected transaction index        if (index == -1) {            System.err.println("Unexpected transaction index: " + transID);            // process the error case here        } else {            searchIDs[index] = -1;        }        /*         * Actually, we do not care about the response code -         * if device is not reachable or no records, etc.         */        // make sure it was the last transaction        for (int i = 0; i < searchIDs.length; i++) {            if (searchIDs[i] != -1) {                return;            }        }        // ok, all of the transactions are completed        synchronized (this) {            notify();        }    }    /** Sets the request to search the devices/services. */    void requestSearch() {        synchronized (this) {            notify();        }    }    /** Cancel's the devices/services search. */    void cancelSearch() {        synchronized (this) {            if (state == DEVICE_SEARCH) {                discoveryAgent.cancelInquiry(this);            } else if (state == SERVICE_SEARCH) {                for (int i = 0; i < searchIDs.length; i++) {                    discoveryAgent.cancelServiceSearch(searchIDs[i]);                }            }        }    }    /** Sets the request to load the specified image. */    void requestLoad(String name) {        synchronized (this) {            imageNameToLoad = name;            notify();        }    }    /** Cancel's the image download. */    void cancelLoad() {        /*         * The image download process is done by         * this class's thread (not by a system one),         * so no need to wake up the current thread -         * it's running already.         */        isDownloadCanceled = true;    }    /**     * Destroy a work with bluetooth - exits the accepting     * thread and close notifier.     */    void destroy() {        synchronized (this) {            isClosed = true;            isDownloadCanceled = true;            notify();        }        // wait for acceptor thread is done        try {            processorThread.join();        } catch (InterruptedException e) {        } // ignore    }    /**     * Processes images search/download until component is closed     * or system error has happen.     */    private synchronized void processImagesSearchDownload() {        while (!isClosed) {            // wait for new search request from user            state = READY;            try {                wait();            } catch (InterruptedException e) {                System.err.println("Unexpected interruption: " + e);                return;            }            // check the component is destroyed            if (isClosed) {                return;            }            // search for devices            if (!searchDevices()) {                return;            } else if (devices.size() == 0) {                continue;            }            // search for services now            if (!searchServices()) {                return;            } else if (records.size() == 0) {                continue;            }            // ok, something was found - present the result to user now            if (!presentUserSearchResults()) {                // services are found, but no names there                continue;            }            // the several download requests may be processed            while (true) {                // this download is not canceled, right?                isDownloadCanceled = false;

⌨️ 快捷键说明

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