Bluecove: SERVICE_SEARCH_DEVICE_NOT_REACHABLE проблема - PullRequest
5 голосов
/ 28 апреля 2011

Я пытаюсь подключиться к пользовательскому устройству Bluetooth, используя BlueCove. Я могу выполнить сопряжение устройства, но когда я пытаюсь найти сервисы, я всегда получаю SERVICE_SEARCH_DEVICE_NOT_REACHABLE в serviceSearchCompleted () и сервисы не обнаруживаются. Если я попробую то же самое за пределами Java (в Windows), устройство 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();
        }

}

1 Ответ

0 голосов
/ 08 февраля 2018

У меня была такая же проблема при подключении к наушнику Bluetooth. Как и вы, я также искал более одного сервиса за раз, и он всегда возвращал SERVICE_SEARCH_DEVICE_NOT_REACHABLE. Итак, я попытался найти только один сервис, и это сработало. Итак, попробуйте изменить код как:

...
private static final UUID[] UUIDS = new UUID[] {new UUID(0x0003)}
...