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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при создании bluetooth сервера 
V
    Опции темы
yezh
Дата 19.11.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! Начал ковырять блютуф и не могу создать сервер для игры. 
Вот код.
Код

import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import java.io.IOException;


public class srvBattle implements Runnable {
    UUID id;
    StreamConnection connection;
    StreamConnectionNotifier service;
    Thread th;
    public srvBattle(UUID id, StreamConnectionNotifier srv, StreamConnection conn){
        this.id = id;
        connection = conn;
        service = srv;
        th = new Thread(this);
        th.start();
    }
    public void run() {
        try {
            LocalDevice local;

            local = LocalDevice.getLocalDevice();

            StringBuffer sb = new StringBuffer("btspp://localhost:");
            sb.append(id.toString());
            sb.append(";name=seabattle");
            sb.append(";authorize=false");
            String url = sb.toString();
            ServiceRecord rs;
            local.setDiscoverable(DiscoveryAgent.GIAC);
            service = (StreamConnectionNotifier) Connector.open(url);
            rs = local.getRecord(service);

            connection = (StreamConnection) service.acceptAndOpen();


        } catch (BluetoothStateException e) {

        } catch (IOException e) {

        }
    }

}

Проблема в том, что после connection = (StreamConnection) service.acceptAndOpen();
 приложение дальше не работает (деббагер прерывается и пишет что application is running), хотя мидлет реагирует. И второй запущенный эмулятор (то же приложение, только в режиме клиента)  не находит удаленное устройство... Как это можно исправить?
PM MAIL ICQ   Вверх
Antropoid
Дата 20.11.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(yezh @  19.11.2006,  22:23 Найти цитируемый пост)
Проблема в том, что после connection = (StreamConnection) service.acceptAndOpen(); приложение дальше не работает

это правильно, так и должно быть - выполнение потока srvBattle продолжится только после того, как 2-ой запущенный эмулятор (в режиме клиента) разрешит передачу данных.

Цитата(yezh @  19.11.2006,  22:23 Найти цитируемый пост)
 И второй запущенный эмулятор (то же приложение, только в режиме клиента)  не находит удаленное устройство... 

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

P.S. можно вместо 
connection = (StreamConnection) service.acceptAndOpen();
делать сразу
connection = service.acceptAndOpen();


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
yezh
Дата 20.11.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нате класс. Писал ориентируясь на примеры.
Код
                    
import javax.bluetooth.*;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.lcdui.*;
import java.io.IOException;
import java.util.Vector;

public class newGame implements CommandListener {
    Vector/*RemoteDevice[] */srd = new Vector();
    ServiceRecord[] srs;
    int state;

    static final UUID id = new UUID("2d26618601fb47c28d9f10b8ec891363",false);
    int []attSet;


    class disListener implements DiscoveryListener{

        public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
            if(srd.indexOf(remoteDevice)!=0){
                return;
            }
            srd.addElement(remoteDevice);
        }

        public void servicesDiscovered(int i, ServiceRecord[] serviceRecords) {
            for (int k = 0; k < serviceRecords.length; k++)
                srs[i] = serviceRecords[i];

        }

        public void serviceSearchCompleted(int i, int i1) {
            
        }

        public void inquiryCompleted(int i) {
            state = i;
            notify();
        }
    }


    
    private Display dpy;
    private Displayable prev;
    private main m;
    String []choice = {"Создать сервер","Подключиться к игре", "Назад"};
    List c;
    StreamConnectionNotifier service;
    StreamConnection connection;
    public newGame(main ma){
        m = ma;
        dpy = m.display;
        prev = dpy.getCurrent();
        c = new List("Новая игра", Choice.IMPLICIT,choice,null);
        c.setCommandListener(this);
        dpy.setCurrent(c);
    }

    public void commandAction(Command command, Displayable displayable) {
        if(command == List.SELECT_COMMAND){
            int sel = c.getSelectedIndex();
            switch(sel){
                case 0:{
                    srvBattle btl = new srvBattle(id,service,connection);
                    break;
                }
                case 1:{
                        try {
                            LocalDevice local;
                            local = LocalDevice.getLocalDevice();
                            DiscoveryAgent agent = local.getDiscoveryAgent();
                            boolean complete = agent.startInquiry(DiscoveryAgent.GIAC,new disListener());
                            if(complete){
                                switch(state){
                                    case DiscoveryListener.INQUIRY_COMPLETED:{
                                        if(srd.isEmpty()){
                                            System.out.print("NO DEVICES FOUND!");
                                            return;
                                        }
                                        String [] d = new String[srd.size()];
                                        for(int i = 0; i < srd.size(); i++){
                                            RemoteDevice rd = (RemoteDevice)srd.elementAt(i);
                                            d[i++] = rd.getFriendlyName(true);
                                        }
                                        List devs = new List("Список устройств", Choice.IMPLICIT,d,null);
                                        dpy.setCurrent(devs);
                                        break;
                                    }
                                    case DiscoveryListener.INQUIRY_ERROR: {
                                        break;
                                    }
                                }
                            }
                        }catch (BluetoothStateException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    break;
                }
                case 2:{
                    dpy.setCurrent(prev);
                    break;
                }
            }
        }
    }
}


PM MAIL ICQ   Вверх
Antropoid
Дата 20.11.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Так поиск все-таки проходит? Выводится "NO DEVICES FOUND!"?
Код

public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
        if(srd.indexOf(remoteDevice)!=0) {//ЗАЧЕМ ЭТА ПРОВЕРКА?
            return;//В srd НИЧЕГО НЕ ДОБАВЛЯЕТСЯ!
        }
        srd.addElement(remoteDevice);
}



--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
yezh
Дата 21.11.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, именно это он и выводит.
Теперь - проверка нужна для того что бы не добавлять в список одно и тоже устройство несколько раз.  Доки с сайта:
Код

deviceDiscovered
void deviceDiscovered(RemoteDevice btDevice,
                      DeviceClass cod)
Called when a device is found during an inquiry. An inquiry searches for devices that are discoverable. The same device may be returned multiple times.

Так что в srd устройства добавляются после проверки что их нет в этом векторе!

Вот идиот... совсем забыл что метод indexOf() возвращает -1! Лана, исправил и все равно появляется сообщение NO DEVICES FOUND!
А еще сразу же ошибка 
Код

java.lang.IllegalMonitorStateException
    at newGame$disListener.inquiryCompleted(+12)
    at com.sun.kvem.jsr082.impl.bluetooth.BTDeviceDiscoverer.notifyDone(+15)
    at com.sun.kvem.jsr082.impl.bluetooth.BTDeviceDiscoverer.run(+281)


Это сообщение отредактировал(а) yezh - 21.11.2006, 08:52
PM MAIL ICQ   Вверх
Antropoid
Дата 21.11.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Само собой появляется, потому что notify нужно помещать в synchronized блок, а так программа не понимает, какой объект ты нотифаешь. Функция  public void inquiryCompleted(int i) нормально не отрабатыавет. Сначал наведи порядок с потоками, а потом посмотрим, что там он тебе выдаст...


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
yezh
Дата 21.11.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, я уже разобрался с этим. Забыл отписаться )
PM MAIL ICQ   Вверх
yezh
Дата 21.11.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще вопрос: почему у меня список устройств появляется только когда я дебажу код? То есть если поставить точку остановки и потом прогонять по шагам код, то список устройств появляется, а если просто запускать то нет. Может у меня что то не обновляется? Код тот же
Код

case DiscoveryListener.INQUIRY_COMPLETED: {
                        if (srd.isEmpty()) {
                            System.out.print("NO DEVICES FOUND!");
                            return;
                        }
                        String[] d = new String[srd.size()];
                        for (int i = 0; i < srd.size(); i++) {
                            RemoteDevice rd = (RemoteDevice) srd.elementAt(i);
                            d[i++] = rd.getFriendlyName(true);
                        }
                        devs = new List("Список устройств", Choice.IMPLICIT, d, null);
                        devs.setCommandListener(this);
                        devs.addCommand(new Command("Назад", Command.BACK, 1));
                        dpy.setCurrent(devs);
                        break;
                    }


Еще не понимаю как определить есть ли на найденном/выбранном устройстве то приложение которое необходимо клиенту. Т.е. метод servicesDiscovered интерфейса DiscoveryListener находит все сервисы на удаленном устройстве. А какой из них мой?

Это сообщение отредактировал(а) yezh - 21.11.2006, 10:55
PM MAIL ICQ   Вверх
yezh
Дата 21.11.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вроде разобрался в чем ошибка. Программа должна дождаться окончания поиска доступных устройств, т.е. надо останавливать основной поток. переписал класс однако опять выскакивает та же java.lang.IllegalMonitorStateException. В чем ошибка? Подскажите плииз, а то уже совсем ничего не понимаю.... smile 
Код

import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.*;
import java.io.IOException;
import java.util.Vector;

public class clientBattle implements CommandListener, DiscoveryListener, Runnable {
    List devs;
    Display dpy;
    Vector srd = new Vector();
    Vector srs = new Vector();
    int state;
    Thread th;

    int count = 0;
    boolean complete = false;

    public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
        if (srd.indexOf(remoteDevice) != -1) {
            return;
        }
        srd.addElement(remoteDevice);
        count++;
    }

    public void servicesDiscovered(int i, ServiceRecord[] serviceRecords) {
        for (int k = 0; k < serviceRecords.length; k++)
            srs.addElement(serviceRecords[k]);

    }

    public void serviceSearchCompleted(int i, int i1) {

    }

    public void inquiryCompleted(int i) {
        state = i;
        synchronized (this) {
            notify();
        }

    }

    UUID id;
    Displayable prev;
    newGame parent;
    LocalDevice local;
    DiscoveryAgent agent;

    public clientBattle(UUID id, newGame g) {
        parent = g;
        dpy = parent.dpy;
        prev = dpy.getCurrent();
        this.id = id;
        th = new Thread(this);
        th.start();

    }

    public void commandAction(Command command, Displayable displayable) {
        if (command == List.SELECT_COMMAND) {
            
        } else dpy.setCurrent(prev);
    }



    public void run() {
        try {
            local = LocalDevice.getLocalDevice();
            agent = local.getDiscoveryAgent();
            System.out.println("befor");
            complete = agent.startInquiry(DiscoveryAgent.GIAC, this);
            try {
                wait();
            } catch (InterruptedException e) {
            }
            if (complete) {
                switch (state) {
                    case DiscoveryListener.INQUIRY_COMPLETED: {
                        if (srd.isEmpty()) {
                            System.out.println("NO DEVICES FOUND!");
                            return;
                        }

                        String[] d = new String[srd.size()];
                        for (int i = 0; i < srd.size(); i++) {
                            RemoteDevice rd = (RemoteDevice) srd.elementAt(i);
                            d[i++] = rd.getFriendlyName(true);
                        }
                        devs = new List("Список устройств", Choice.IMPLICIT, d, null);
                        devs.setCommandListener(this);
                        devs.addCommand(new Command("Назад", Command.BACK, 1));
                        dpy.setCurrent(devs);
                        break;
                    }
                    case DiscoveryListener.INQUIRY_ERROR: {
                        break;
                    }
                }
            }
        } catch (BluetoothStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


Кстати, вопрос с поиском необходимого мне сервиса остается открытым smile
PM MAIL ICQ   Вверх
Antropoid
Дата 21.11.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(yezh @  21.11.2006,  10:31 Найти цитируемый пост)
если поставить точку остановки и потом прогонять по шагам код, то список устройств появляется, а если просто запускать то нет.

неизвестно почему (может как-то связано с полнолунием...)
Цитата(yezh @  21.11.2006,  16:34 Найти цитируемый пост)
переписал класс однако опять выскакивает та же java.lang.IllegalMonitorStateException. В чем ошибка?

Код

...
complete = agent.startInquiry(DiscoveryAgent.GIAC, this);
            try {
                wait();//<----------------------------!!!
            } catch (InterruptedException e) {
            }
            if (complete) {
...

wait() тоже надо в synchronized блок помещать.
Цитата(yezh @  21.11.2006,  10:31 Найти цитируемый пост)
метод servicesDiscovered интерфейса DiscoveryListener находит все сервисы на удаленном устройстве. А какой из них мой?

Это уже тебе решать... можно, например, отфильтровывать их по конкретному протоколу
Код

 private ServiceRecord record;
 private boolean foundService;
 public void servicesDiscovered(int i, ServiceRecord[] serviceRecords) {
        for (int k = 0; k < serviceRecords.length; k++)  {
            String conURL = serviceRecords[i].getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT , false );
            int index = conURL.indexOf(':');
            String protocol = conURL.substring(0, index);
            if (protocol.equals("btspp")) {                         
               record = servRecord[i];
             foundService = true;
            break;
//            srs.addElement(serviceRecords[k]);
        }
}

и дальше уже работаешь с необходимым тебе сервисом record.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
yezh
Дата 21.11.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

неизвестно почему (может как-то связано с полнолунием...)

не, я так понял, пока он останавливается, пока проходят некоторые строки и т.д. и т.п. запрос уже завершается и нормально выдается )). Спасибо за подсказку все заработало.
Цитата


Это уже тебе решать... можно, например, отфильтровывать их по конкретному протоколу
Код

 private ServiceRecord record;
 private boolean foundService;
 public void servicesDiscovered(int i, ServiceRecord[] serviceRecords) {
        for (int k = 0; k < serviceRecords.length; k++)  {
            String conURL = serviceRecords[i].getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT , false );
            int index = conURL.indexOf(':');
            String protocol = conURL.substring(0, index);
            if (protocol.equals("btspp")) {                         
               record = servRecord[i];
             foundService = true;
            break;
//            srs.addElement(serviceRecords[k]);
        }
}

и дальше уже работаешь с необходимым тебе сервисом record.

А  я думал надо что-то мутить с agent.searchServices(), ставить там определенные параметры и т.п... 
Спасибо, попробуем.
PM MAIL ICQ   Вверх
Antropoid
Дата 21.11.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(yezh @  21.11.2006,  18:59 Найти цитируемый пост)
А  я думал надо что-то мутить с agent.searchServices(), ставить там определенные параметры и т.п... 

ну, вообщем, это тоже...
если тебе нужен сервис работающий по RFCOMM (stream data), то делаешь так:
Код

UUID[] searchList = {    new UUID(0x0003)   };
discoveryAgent.searchServices(null, searchList, remoteDevice, this);

L2CAP (packet data)  так:
Код

UUID[] searchList = {    new UUID(0x0100)   };
discoveryAgent.searchServices(null, searchList, remoteDevice, this);

и т.д.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
yezh
Дата 21.11.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а где то есть описание этих ууидов?И еще - надо ли определять/менять набор параметров сервиса... В принципе я нашел запущенный на удаленном эмуляторе (хорошо звучит smile) сервис.. но просто тупо взял первый из них.
PM MAIL ICQ   Вверх
Antropoid
Дата 21.11.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Цитата(yezh @  21.11.2006,  20:43 Найти цитируемый пост)
а где то есть описание этих ууидов?

http://java.sun.com/javame/reference/apis/jsr082/
класс UUID
Цитата(yezh @  21.11.2006,  20:43 Найти цитируемый пост)
надо ли определять/менять набор параметров сервиса...

что ты называешь параметрами сервиса?
Если протокол передачи данных, то
определять - нужно, иначе не найдешь своего;
менять - никак... если девайс предоставляет определенный набор протоколов, по которым возможно Bluetooth-взаимодействие с ним, то это его индивидуальная особенность, определенная производителем, и повлиять на это никак нельзя.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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