5

BlueCove を使用してカスタム Bluetooth デバイスに接続しようとしています。デバイスをペアリングできますが、サービスを検索しようとすると、常に serviceSearchCompleted() で SERVICE_SEARCH_DEVICE_NOT_REACHABLE が返され、サービスが検出されません。Java の外部 (Windows) で同じことを試みると、PC の Bluetooth デバイスが検出され、(COM21、COM22 などを使用して) デバイスの SPP サービスに接続できます。

私は何を間違っていますか?デバイスの検出が終了した後、サービス検索も実行しようとしました。同じ問題。私のコードの下に見つけてください。

これを解決する方法についてのアイデアを事前に感謝します。

エイドリアン。

public class Test {
        private static Logger LOG = Logger.getLogger(Test.class.getName());

        private static final String NAME = "XXXX";
        private static final String PIN = "1234";
        private static final UUID[] UUIDS = new UUID[] {new UUID(0x0003), new UUID(0x1101)};

        private LocalDevice localDevice;
        private DiscoveryAgent discoveryAgent;
        private DiscoveryListener discoveryListener = new GDiscoveryListener();
        private Map<Integer, RemoteDevice> searchForServices = new HashMap<Integer, RemoteDevice>();
        private Collection<ServiceRecord> servicesDiscovered = new HashSet<ServiceRecord>();
        private Object lock = new Object();
        private CountDownLatch waitForDevices;

        protected void connect() {
                try {
                        localDevice = LocalDevice.getLocalDevice();
                        localDevice.setDiscoverable(DiscoveryAgent.GIAC);
                        LOG.info("Local Device: " + localDevice.getFriendlyName()
                                        + "(" + localDevice.getBluetoothAddress() + ")");
                        discoveryAgent = localDevice.getDiscoveryAgent();
                        LOG.finest("Start discovering devices");
                        discoveryAgent.startInquiry(DiscoveryAgent.GIAC, discoveryListener);
                try {
                    synchronized(lock) {
                        lock.wait();
                    }
                                if (searchForServices.size() > 0) {
                                        waitForDevices = new CountDownLatch(searchForServices.size());
                                waitForDevices.await();
                                }
                }
                catch (InterruptedException e) {
                                LOG.log(Level.WARNING, "Error waiting to terminate discovery", e);
                }
                LOG.finest(servicesDiscovered.size() + " services discovered");
                LOG.finest("Device discovery completed");
                } catch (BluetoothStateException e) {
                        LOG.log(Level.WARNING, "Error initializing Bluetooth", e);
                }

        }

        private class GDiscoveryListener implements DiscoveryListener {

                public void deviceDiscovered(RemoteDevice rd, DeviceClass dc) {
                        try {
                                String name = rd.getFriendlyName(false);
                                boolean isMine = NAME.equals(name);
                                LOG.info("Discovered: " + name + "(" + rd.getBluetoothAddress() + ")"
                                                + (isMine ? "" : " - ignoring"));
                                if (!isMine)
                                        return;
                                if (!rd.isAuthenticated()) {
                                        LOG.finest("Try to pair with " + name
+ " PIN: " + PIN);
                                        boolean paired = RemoteDeviceHelper.authenticate(rd, PIN);
                                        LOG.info("Pair with " + name + (paired ? " succesfull" : " failed"));
                                }
                                int transID = discoveryAgent.searchServices(null, UUIDS, rd, discoveryListener);
                                searchForServices.put(transID, rd);
                                LOG.finest("Searching for services for " + name + " with transaction " + transID);
                        } catch (BluetoothStateException e) {
                                LOG.log(Level.WARNING, "Cannot search services for "
                                                + rd.getBluetoothAddress(), e);
                        } catch (IOException e) {
                                LOG.log(Level.WARNING, "Error connecting ", e);
                        } catch (Throwable t) {
                                LOG.log(Level.WARNING, "Cannot search services for "
                                                + rd.getBluetoothAddress(), t);
                        }
                }

                public void inquiryCompleted(int respCode) {
                        synchronized(lock) {
                    lock.notify();
                }

                switch (respCode) {
                    case DiscoveryListener.INQUIRY_COMPLETED :
                        LOG.fine("INQUIRY_COMPLETED");
                        break;
                    case DiscoveryListener.INQUIRY_TERMINATED :
                        LOG.fine("INQUIRY_TERMINATED");
                        break;
                    case DiscoveryListener.INQUIRY_ERROR :
                        LOG.fine("INQUIRY_ERROR");
                        break;
                    default :
                        LOG.fine("Unknown Response Code - " + respCode);
                        break;
                }
                }

                public void serviceSearchCompleted(int transID, int respCode) {
                        String rd = searchForServices.get(transID).getBluetoothAddress();
                        //searchForServices.remove(transID);
                switch (respCode) {
                        case DiscoveryListener.SERVICE_SEARCH_COMPLETED:
                                LOG.fine(rd + ": The service search completed normally");
                        break;
                        case DiscoveryListener.SERVICE_SEARCH_TERMINATED:
                                LOG.fine(rd + ": The service search request was cancelled by a call to DiscoveryAgent.cancelServiceSearch(int)");
                        break;
                        case DiscoveryListener.SERVICE_SEARCH_ERROR:
                                LOG.warning(rd + ": An error occurred while processing the request");
                        break;
                        case DiscoveryListener.SERVICE_SEARCH_NO_RECORDS:
                                LOG.info(rd + ": No records were found during the service search");
                        break;
                        case DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE:
                                LOG.warning(rd + ": The device specified in the search request could not be reached or the local device could not establish a connection to the remote device");
                        break;
                    default:
                        LOG.warning(rd + ": Unknown Response Code - " + respCode);
                        break;
                }
                        if (waitForDevices != null)
                                waitForDevices.countDown();
                }

                public void servicesDiscovered(int transID, ServiceRecord[] srs) {
                        LOG.info("Services discovered in transaction " + transID + " : " + srs.length);
                        for (ServiceRecord sr : srs) {

LOG.info(sr.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false));
                                servicesDiscovered.add(sr);
                        }
                }

        }

        public static void main(String[] args) {
                new Test().connect();
        }

}
4

1 に答える 1