Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bluetooth. Поиск сервисов на устройстве. Статус: SERVICE_SEARCH_NO_RECORDS 
V
    Опции темы
Norby89
Дата 16.7.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



Пишу мидлет, который должен соединяться с таким же мидлетом на другом телефоне. Вот код:
Код

package numexchange;

import java.io.IOException;
import java.util.Vector;
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;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
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.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;


public class NumExchangeMidlet extends MIDlet implements CommandListener, DiscoveryListener {

    private NumCanvas canvas;
    private static final Command exit = new Command("Exit", Command.EXIT, 0);
    private final Command host = new Command("Host", Command.ITEM, 0);
    private final Command join = new Command("Join", Command.ITEM, 0);
    private final Command connect = new Command("Connect", Command.ITEM, 0);
    private List deviceList = null;
    private static final String uuidString = "00112233445566778899AABBCCDDEEFF";
    private static NumExchangeMidlet midlet;
    private ServiceRecord record = null;
    private boolean deviceSearchEnded = false;
    private boolean serviceSearchEnded = false;
    private Vector devices = new Vector();
    private final Object lock = new Object();
    private String connectionURL = null;

    public void startApp() {
        midlet = this;
        canvas = new NumCanvas(true);
        Display.getDisplay(this).setCurrent(canvas);
        canvas.addCommand(host);
        canvas.addCommand(join);
        canvas.addCommand(exit);
        canvas.setCommandListener(this);
        canvas.start();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable d) {
        if (c == exit) {
            canvas.stop();
            destroyApp(true);
            notifyDestroyed();
        }

        if (c == host) {
            try {
                Thread t = new Thread(new Runnable() {

                    private UUID uuid = new UUID(uuidString, false);
                    private LocalDevice ldev = LocalDevice.getLocalDevice();

                    public void run() {
                        StreamConnection conn = null;
                        try {
                            ldev.setDiscoverable(DiscoveryAgent.GIAC);
                            StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + uuid.toString() + ";name=NumExchange;authorize=false;authenticate=false;encrypt=false");
                            conn = service.acceptAndOpen();
                        } catch (IOException ex) {
                            NumExchangeMidlet.showErrMessage(ex);
                        }
                        canvas.setConnection(conn);
                        canvas.start();
                        canvas.removeCommand(host);
                        canvas.removeCommand(join);
                    }
                });
                t.setPriority(Thread.NORM_PRIORITY);
                t.start();
            } catch (Exception ex) {
                NumExchangeMidlet.showErrMessage(ex);
            }
        }

        if (c == join) {
            try {
                deviceList = new List("Devices", List.EXCLUSIVE);
                LocalDevice ldev = LocalDevice.getLocalDevice();
                DiscoveryAgent dAgent = ldev.getDiscoveryAgent();
                dAgent.startInquiry(DiscoveryAgent.GIAC, this);

                synchronized (lock) {
                    try {
                        lock.wait();
                    } catch (InterruptedException ex) {
                        showErrMessage(ex);
                    }
                }

                if (devices.isEmpty()) {
                    showErrMessage(new Exception("No devices found"));
                } else {
                    for (int i = 0; i < devices.size(); i++) {
                        try {
                            deviceList.append(((RemoteDevice) devices.elementAt(i)).getFriendlyName(true), null);
                        } catch (IOException ex) {
                            showErrMessage(ex);
                        }
                    }
                    deviceList.addCommand(exit);
                    deviceList.addCommand(connect);
                    deviceList.setCommandListener(this);
                    Display.getDisplay(this).setCurrent(deviceList);
                }
            } catch (BluetoothStateException ex) {
                showErrMessage(ex);
            }
        }

        if (c == connect) {
            try {
                RemoteDevice rdev = (RemoteDevice) devices.elementAt(deviceList.getSelectedIndex());
                LocalDevice ldev = LocalDevice.getLocalDevice();
                DiscoveryAgent dAgent = ldev.getDiscoveryAgent();
                UUID[] uuidSet = {new UUID(0x1101), new UUID(uuidString, false)};
                dAgent.searchServices(null, uuidSet, rdev, this);
                Thread t = new Thread(new Runnable() {

                    public void run() {
                        synchronized (lock) {
                            try {
                                lock.wait();
                            } catch (InterruptedException ex) {
                                showErrMessage(ex);
                            }
                        }

                        if (connectionURL == null) {
                            showErrMessage(new Exception("No service found"));
                        } else {
                            try {
                                StreamConnection conn = (StreamConnection) Connector.open(connectionURL);
                                canvas.setConnection(conn);
                                Display.getDisplay(midlet).setCurrent(canvas);
                                canvas.start();
                            } catch (IOException ex) {
                                showErrMessage(ex);
                            }
                        }
                    }
                });
                t.setPriority(Thread.NORM_PRIORITY);
                t.start();
            } catch (BluetoothStateException ex) {
                showErrMessage(ex);
            }
        }
    }

    static void showErrMessage(Exception ex) {
        TextBox errMsg = new TextBox("Exception", ex.toString(), 1024, TextField.ANY);
        errMsg.addCommand(exit);
        errMsg.setCommandListener(midlet);
        Display.getDisplay(midlet).setCurrent(errMsg);
    }

    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
        devices.addElement(btDevice);
    }

    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
        if (servRecord != null && servRecord.length > 0) {
            connectionURL = servRecord[0].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
        }
    }

    public void serviceSearchCompleted(int transID, int respCode) {
        
        if (respCode == DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE) {
            showErrMessage(new Exception("DEVICE_NOT_REACHABLE"));
        } else if(respCode == DiscoveryListener.SERVICE_SEARCH_ERROR){
            showErrMessage(new Exception("ERROR"));
        } else if(respCode == DiscoveryListener.SERVICE_SEARCH_NO_RECORDS){
            showErrMessage(new Exception("NO_RECORDS"));
        } else if(respCode == DiscoveryListener.SERVICE_SEARCH_TERMINATED){
            showErrMessage(new Exception("TERMINATED"));
        }
        synchronized (lock) {
            lock.notify();
        }
        
    }

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



Устройства находит, после чего я выбираю одно из них и в нем ищется сервис. По окончании поиска сервисов получаю в методе serviceSearchCompleted статус SERVICE_SEARCH_NO_RECORDS. Проблема появляется только на реальных устройствах. В WTK эмуляторе все работает.
PM MAIL   Вверх
Norby89
Дата 18.7.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



Обнаружил, что если убрать из списка искомых сервисов мой UUID (00112233445566778899AABBCCDDEEFF), то поиск и подключение происходит нормально. Причину понять не удалось. Есть идеи?
PM MAIL   Вверх
Norby89
Дата 18.7.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 16.2.2010

Репутация: нет
Всего: нет



Решил проблему изменив
Код

StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + uuid.toString() + ";name=NumExchange;authorize=false;authenticate=false;encrypt=false");


на
Код

StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + uuidString + ";name=NumExchange;authorize=false;authenticate=false;encrypt=false");


Так сервисы находятся и соединение происходит. Как и почему понятия не имею, решение нашлось методом научного тыка. Единственное что UUID.toString() возвращает строку в нижнем регистре, может в этом причина.
PM MAIL   Вверх
ivanovpv
Дата 19.7.2011, 08:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 10
Всего: 28



Тихо сам с собою Norby89 медитирует уже неделю...

В общем можно констатировать смерть J2ME, а также собственно и самого форума



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.