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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bluetooth клиент-сервер 
:(
    Опции темы
YuraDoc
Дата 27.2.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 1.4.2006
Где: Zhytomir, Ukraine

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



Пытаюсь все же въехать в Блютуз АПИ.
Привожу пример недописанного клиента:
Код

public class Main {
    private static DiscoveryAgent agent;
    private static LocalDevice local;
    private static DiscoveryListener listener;
    private static ServiceRecord serviceRecord;
    private static final String myServiceUUID = "2d26618601fb47c28d9f10b8ec891363";
    public static final Vector/*<RemoteDevice>*/ devicesDiscovered = new Vector();
    
    public static void main(String[] args) {
        try {

            final Object inquiryCompletedEvent = new Object();
            devicesDiscovered.clear();

            local = LocalDevice.getLocalDevice();
            agent = local.getDiscoveryAgent();

            listener = new DiscoveryListener() {

               public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
                    System.out.println("Device " + btDevice.getBluetoothAddress() + " found");
                    devicesDiscovered.addElement(btDevice);
                    try {
                        System.out.println("     name " + btDevice.getFriendlyName(false));
                    } catch (IOException cantGetDeviceName) {
                    }
                }

                public void inquiryCompleted(int discType) {
                    System.out.println("Device Inquiry completed!");
                    synchronized (inquiryCompletedEvent) {
                        inquiryCompletedEvent.notifyAll();
                    }
                }

                public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
                    if (serviceRecord != null) return; 
                    serviceRecord = servRecord[0];
                    
                    System.out.println("     service name " + serviceRecord.toString());
                    //throw new UnsupportedOperationException("Not supported yet.");
                }

                public void serviceSearchCompleted(int arg0, int arg1) {
                    
                }
            };

            synchronized (inquiryCompletedEvent) {
                try {
                    boolean started = agent.startInquiry(DiscoveryAgent.GIAC, listener);
                    if (started) {
                        System.out.println("wait for device inquiry to complete...");
                        inquiryCompletedEvent.wait();
                        RemoteDevice[] rds = new RemoteDevice[devicesDiscovered.size()];
                        
                        devicesDiscovered.toArray(rds);
                        searchServices(rds);
                        System.out.println(devicesDiscovered.size() + " device(s) found");
                    }
                } catch (InterruptedException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (BluetoothStateException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (BluetoothStateException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private static void searchServices(RemoteDevice[] devList) { 
 
                UUID[] searchList = new UUID[2]; 
                searchList[0] = new UUID(0x0100); 
                searchList[1] = new UUID(myServiceUUID, false);
                // Ищем список устройств, поддерживающих интересующий нас сервис.
                for (int i = 0; i < devList.length; i++) { 
                    try {

                        int trans;
                        trans = agent.searchServices(null, searchList, devList[i], listener);
                    } catch (BluetoothStateException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } 
    } 

}


Пример сервера:
Код

public class Main extends MIDlet{// implements DiscoveryListener{
    //private ServiceRecord[] servicesFound;
    //private Vector devicesFound;
    //private DiscoveryAgent agent;
    //private LocalDevice local;
    
    // Bluetooth Service name
    private static final String myServiceName = "MyBtService";
    // Bluetooth Service UUID of interest
    private static final String myServiceUUID = "2d26618601fb47c28d9f10b8ec891363";
    private UUID MYSERVICEUUID_UUID = new UUID(myServiceUUID, false);

    //private StreamConnectionNotifier service;
    //private StreamConnection connection;

    private Display display;
    private Form form;

    
    protected void startApp(){


            form = new Form("Display text from Server");
            form.append("Wait...");
            display = Display.getDisplay(this);
            display.setCurrent(form);
        
        try {
            
            StreamConnection sc = waitServer();
            form.append(readFromServer(sc));
            //doDeviceDiscovery();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
    }

    protected void pauseApp() {
        
    }

    protected void destroyApp(boolean arg){
        form = null;
        notifyDestroyed();
    }

    private StreamConnection waitServer() throws IOException{
            LocalDevice local = LocalDevice.getLocalDevice();
            local.setDiscoverable(DiscoveryAgent.GIAC);

            String connURL = "btspp://localhost:"+MYSERVICEUUID_UUID.toString()+";name="+myServiceName;
            StreamConnectionNotifier scn = (StreamConnectionNotifier) Connector.open(connURL);
            return scn.acceptAndOpen();
    }

    private String readFromServer(StreamConnection sc) throws IOException{
        //RemoteDevice rd = RemoteDevice.getRemoteDevice(sc);
        DataInputStream dataIn = sc.openDataInputStream();
        String output = dataIn.readUTF();
        dataIn.close();
        sc.close();
        return output;
    }
}


Поймите, я вообще ничего не могу понять.
У меня клиент находит сервер, но сервис, необходимый мне не находит.
Подскажите что не так, и не обижайтесь за ламерский подход к Java, т.к. не имею опыта работы большого в ней.

Это сообщение отредактировал(а) YuraDoc - 27.2.2008, 18:53
PM MAIL WWW ICQ Skype   Вверх
eugine_s
Дата 28.2.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



часть по j2se - не смотрел
по j2me тоже особо не всматривался, но 2 ошибки бросаются в глаза:
1) В startApp нельзя делать тяжелых вещей, тем БОЛЕЕ вещей которые усыпляют поток (то что делает acceptAndOpen())
2) Все методы, которые могут привести к дедлокам нужно делать НЕ В ОСНОВНОМ ПОТОКЕ, а опять же acceptAndOpen() - приостанавливает поток.

Поэтому в startApp() нужно просто запустить новый поток. acceptAndOpen выполнять в другом потоке.

Кстати, вот этот код :

Код

        try {
            
            StreamConnection sc = waitServer();
            form.append(readFromServer(sc));
            //doDeviceDiscovery();
        } catch (IOException ex) {
            ex.printStackTrace();
        }


Тут эксепшин не бросает? Или программа не зависает?

Это сообщение отредактировал(а) eugine_s - 28.2.2008, 00:10
PM MAIL   Вверх
YuraDoc
Дата 28.2.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 1.4.2006
Где: Zhytomir, Ukraine

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



Программа сервер немного подвисает (я догадывался об отдельном потоке).
Но меня больше интересует клиент. Да действительно он написан на J2SE, но библиотеки имеют абсолютно идентичный интерфейс с J2ME. И меня интересует именно эта программа, т.к. у меня она не находит нужный сервис. И вообще я не могу понять ф-я agent.searchServices нигде толком не описана, даже в javadoc.
Заранее спасибо. Никак не стартану с блютузом.
PM MAIL WWW ICQ Skype   Вверх
eugine_s
Дата 28.2.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну так если программа сервер у тебя подвисает, то свой сервис не регистрируется, соответственно по этому сервису тебя никто не найдет...

Да, кстати, чтобы БТ работал в j2me, нужно через меню телефона БТ был включен (j2mе само не включает БТ, оно только может изменить статут - виден для всех/не виден)... поэтому твой клиент и находит твой телефон, а сервис - нет. 
PM MAIL   Вверх
YuraDoc
Дата 28.2.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 1.4.2006
Где: Zhytomir, Ukraine

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



Цитата

Да, кстати, чтобы БТ работал в j2me, нужно через меню телефона БТ был включен (j2mе само не включает БТ, оно только может изменить статут - виден для всех/не виден)... поэтому твой клиент и находит твой телефон, а сервис - нет.  

У меня он включен.

Скорее всего из-за этого:
Цитата

Ну так если программа сервер у тебя подвисает, то свой сервис не регистрируется, соответственно по этому сервису тебя никто не найдет...

PM MAIL WWW ICQ Skype   Вверх
i_SweP
Дата 2.3.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно ничего не находит из-за этого:
Код

String connURL = "btspp://localhost:"+MYSERVICEUUID_UUID.toString()+";name="+myServiceName;

а в клиенте:
Код

UUID[] searchList = new UUID[2]; 
searchList[0] = new UUID(0x0100); 
searchList[1] = new UUID(myServiceUUID, false);

UUID, равный 0x0100, предписывает искать сервисы, работающие по протоколу L2CAP, а сервер-то RFCOMM

Это сообщение отредактировал(а) i_SweP - 2.3.2008, 16:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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