j2me блютуз клиент. Функция startInquiry ничего не нашла - PullRequest
0 голосов
/ 10 марта 2010

Я разрабатываю простой j2me bluetooth клиент и у меня проблема с поиском устройства bluetooth. Функция startInquiry ничего не нашла.

Клиент: Nokia 5220 Сервер: мой компьютер с адаптером Bluetooth

Все устройства Bluetooth включены.

/ * * Чтобы изменить этот шаблон, выберите Инструменты | Шаблоны * и откройте шаблон в редакторе. * /

import javax.microedition.midlet.*;
import javax.bluetooth.*;
import java.util.Vector;
import javax.microedition.lcdui.*;

/**
 * @author Администратор
 */
public class Midlet extends MIDlet implements DiscoveryListener
{
    private static Vector vecDevices=new Vector();
    private static String connectionURL=null;
    private LocalDevice localDevice;
    private DiscoveryAgent agent;
    private RemoteDevice remoteDevice;
    private RemoteDevice[] devList;
    private Display display;
    private Form form;

    public void startApp() {
        display = Display.getDisplay(this);
        form = new Form( "Client" );
        try {
            localDevice = LocalDevice.getLocalDevice();
        } catch( BluetoothStateException e ) {
            e.printStackTrace();
        }

        form.append("Address: "+localDevice.getBluetoothAddress()+"\n\n");
        form.append("Name: "+localDevice.getFriendlyName()+"\n\n");

        try {
            agent = localDevice.getLocalDevice().getDiscoveryAgent();

            form.append("Starting device inquiry... \n\n");

            boolean si = agent.startInquiry(DiscoveryAgent.GIAC,  this);
            if ( si ) {
                form.append("true");
            } else {
                form.append("false");
            }
        } catch( BluetoothStateException e ) {
        }

        int deviceCount = vecDevices.size();
        if(deviceCount <= 0){
            form.append("No Devices Found .");
        }
        else{
            //print bluetooth device addresses and names in the format [ No. address (name) ]
            form.append("Bluetooth Devices: ");
            for (int i = 0; i < deviceCount; i++) {
                remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
                form.append( remoteDevice.getBluetoothAddress() );
            }
        }

            display.setCurrent(form);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

        public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
              //add the device to the vector
              if(!vecDevices.contains(btDevice)){
                  vecDevices.addElement(btDevice);
              }
        }
        public void inquiryCompleted(int discType)
        {
        }


          //implement this method since services are not being discovered
          public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
              if(servRecord!=null && servRecord.length>0){
                  connectionURL=servRecord[0].getConnectionURL(0,false);
              }
          }
          //implement this method since services are not being discovered
          public void serviceSearchCompleted(int transID, int respCode) {
          }
}

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Вы, похоже, неправильно поняли, как работает Bluetooth API. Только метод startInquiry запускает процесс обнаружения устройства и сразу после этого возвращается, оставляя обнаружение запущенным в фоновом режиме. Когда устройства обнаруживаются, вы получаете обратный вызов метода deviceDiscovered для каждого из них, а после завершения процесса обнаружения вы получаете обратный вызов метода inquiryCompleted. Поэтому вам нужно переместить доступ к элементу vecDevices и манипуляции с формой с startApp на inquiryCompleted, чтобы иметь возможность фактически отображать обнаруженную информацию.

1 голос
/ 10 марта 2010

Не уверен, в чем именно заключается проблема, но вы определенно не хотите делать это в методе startApp() вашего мидлета. Это метод жизненного цикла системы, и он должен быстро вернуться, но сканирование устройств Bluetooth заблокирует его на долгое время. Ваш startApp() метод связывает ресурсы устройства, которые могут понадобиться для фактического сканирования!

Рефакторинг, поэтому сканирование вашего устройства выполняется в новом потоке, а затем посмотрите, что произойдет.

0 голосов
/ 03 апреля 2010

Вы говорите, что все устройства на - но также проверьте, все ли устройства обнаружимы .

Я сделал эту ошибку перед собой!

Поиск метода LocalDevice.setDiscoverable (), если вы хотите переключаться между режимами программно.

...