2014-01-16 3 views
1

У меня возникли проблемы с подключением к WML-C46 AH Bluetooth Chip с использованием небезопасного соединения RFCOMM. Я написал приложение для Android с соответствующим кодом, чтобы показать вам мою проблему.Android-соединение с неактивным/нестабильным подключением

Приложение

Приложение имеет только одну кнопку. Если вы нажмете на эту кнопку, начнется обнаружение устройства Bluetooth. По завершении открытия приложение подключается к устройству bluetooth (я использую только одно устройство Bluetooth для тестирования, поэтому он не может найти никаких других устройств). Затем он открывает входной поток для чтения данных этого устройства. Если соединение ломается (сбрасывается ioexception) или кнопка снова нажата, соединение отключается (закрытие всех потоков, сокетов и потоков). Если нажать на кнопку еще раз новое открытие устройства запускается и так далее ...

Проблема

соединение не работает должным образом. Входной поток данных, по-видимому, немного отсталый, и иногда соединение прерывается без какой-либо видимой причины (IOException: программное обеспечение вызвало прерывание соединения или IOException: попробуйте еще раз). Это довольно упрощенная версия примера чата Bluetooth для Android, которая использует обнаружение устройств вместо сопряженных устройств и всего лишь одно действие.

Кодекс

public class MainActivity extends Activity implements View.OnClickListener { 

    BluetoothDevice btDevice; 
    BluetoothSocket btSocket; 
    InputStream inStream; 
    OutputStream outStream; 
    Object lock = new Object(); 
    boolean connected = false; 
    boolean canceled = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(this); 

     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     getApplicationContext().registerReceiver(btReceiver, filter); 
     filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     getApplicationContext().registerReceiver(btReceiver, filter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onClick(View arg0) { 
     if (!connected) { 
      connected = true; 
      canceled = false; 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        BluetoothAdapter btAdapter = BluetoothAdapter 
          .getDefaultAdapter(); 

        try { 
         if (btAdapter.isDiscovering()) 
          btAdapter.cancelDiscovery(); 
         btAdapter.startDiscovery(); 

         // block until device discovery has finished 
         synchronized (lock) { 
          try { 
           lock.wait(); 
          } catch (InterruptedException e) { 
           Log.d("EXCEPTION", "", e); 
          } 
         } 

         btSocket = btDevice.createInsecureRfcommSocketToServiceRecord(UUID 
           .fromString("00001101-0000-1000-8000-00805F9B34FB")); 
         btSocket.connect(); 

         inStream = btSocket.getInputStream(); 
         outStream = btSocket.getOutputStream(); 

         new Thread(new Runnable() { 
          @Override 
          public void run() { 
           while (!canceled) { 
            try { 
             int in; 
             while ((in = inStream.read()) != -1) { 
              Log.d("Received new byte: ", in 
                + ""); 
             } 
            } catch (IOException e) { 
             Log.d("EXCEPTION IN LISTENER", "", e); 
             disconnect(); 
            } 
           } 
          } 
         }).start(); 
        } catch (IOException e) { 
         Log.d("", "", e); 
        } 
       } 
      }).start(); 
     } else { 
      disconnect(); 
     } 
    } 

    private void disconnect() { 
     connected = false; 
     canceled = true; 

     try { 
      btSocket.close(); 
     } catch (Exception e) { 
      Log.d("EXCEPTION DISCONNECTING", "", e); 
     } 
     try { 
      inStream.close(); 
     } catch (Exception e) { 
      Log.d("EXCEPTION DISCONNECTING", "", e); 
     } 
     try { 
      outStream.close(); 
     } catch (Exception e) { 
      Log.d("EXCEPTION DISCONNECTING", "", e); 
     } 

     btDevice = null; 
     btSocket = null; 
     inStream = null; 
     outStream = null; 
    } 

    private final BroadcastReceiver btReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      try { 
       if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
        btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
        synchronized (lock) { 
         lock.notifyAll(); 
        } 
       } 
      } catch (Exception e) { 
       Log.d(this.getClass().getName(), "", e); 
      } 
     } 
    }; 
} 

Я только с использованием методов блокировки или сделать блокировку самостоятельно. Таким образом, создание соединения работает довольно процедурно. Я, вероятно, потерял поток соединений в примере андроида, когда я его адаптировал, но я не могу найти проблему.

Выход

Установление соединения:

01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): initSocketNative 
01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): ...fd 47 created (RFCOMM, lm = 0) 
01-16 16:52:46.234: V/BluetoothSocket.cpp(6961): initSocketFromFdNative 
01-16 16:52:46.257: D/BluetoothUtils(6961): isSocketAllowedBySecurityPolicy start : device null 
01-16 16:52:47.171: V/BluetoothSocket.cpp(6961): connectNative 
01-16 16:52:47.570: V/BluetoothSocket.cpp(6961): ...connect(47, RFCOMM) = 0 (errno 115) 

разрывы соединения:

01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): java.io.IOException: Software caused connection abort 
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothSocket.readNative(Native Method) 
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:388) 
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:60) 
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at com.example.bttest.MainActivity$2$1.run(MainActivity.java:100) 
01-16 16:53:38.539: D/EXCEPTION IN LISTENER(6961): at java.lang.Thread.run(Thread.java:856) 

Спасибо!

ответ

0

Обнаружена проблема. Устройство Bluetooth не работает должным образом, и через несколько секунд отключите соединение. Однако код работает отлично.

+0

Что такое Android-версия вашего устройства? Вы нашли решение? – Bomberlatinos9

+0

Это было фактическое устройство bluetooth, которое вызвало проблемы, а не андроид или класс BluetoothDevice;) – Horrorente

Смежные вопросы