2014-02-05 3 views
0

Привет всем, кто знает, как отправлять данные с телефона Android на удаленное устройство Bluetooth (через OutputStream), не дожидаясь, чтобы необходимое количество байтов считывалось с помощью InputStream?Отправка данных на удаленное устройство Bluetooth

Я попытался реализовать код, как показано ниже, для отправки данных на удаленное устройство Bluetooth, но ничего не отправлялось.

EDIT: Добавлен в connectedThread кодов:

ConnectedThread.java:

public class ConnectedThread extends Thread{ 
     public final BluetoothSocket mmSocket; 
     public final InputStream mmInStream; 
     public final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket){ 
      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      try{ 
       tmpIn = socket.getInputStream(); 
       tmpOut=socket.getOutputStream(); 
      }catch(IOException e){ 
      } 
      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

    public void run() { 
      byte[] buffer = new byte[1024]; // buffer store for the stream 
      int bytes; // bytes returned from read() 

      // Keep listening to the InputStream until an exception occurs 
      while (true) { 
       try { 
        // Read from the InputStream 
        bytes = mmInStream.read(buffer); 
       } catch (IOException e) { 
        break; 
       } 
      } 
     } 


     /* Call this from the main activity to send data to the remote device */ 
     public void write(byte[] bytes) { 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { } 
     } 

public void sendData() throws IOException{ 
      write("1"); 
     } 

ConnectThread.java:

public class ConnectThread extends Thread{ 
     public final BluetoothSocket mmSocket; 
     public final BluetoothDevice mmDevice; 
     public final BluetoothAdapter mmAdapter; 

     BluetoothConnection mConnectedThread = new BluetoothConnection(); 

     public ConnectThread(BluetoothDevice device, BluetoothAdapter mAdapter) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
      mmAdapter = mAdapter; 
      mmDevice = device = mmAdapter.getRemoteDevice("00:06:66:4F:90:F8"); 
      BluetoothSocket tmp = null; 

     try{ 
      tmp = mmDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); 
      }catch(IOException e){ 
       System.out.println("Failed to create Rfcomm and connect to remote device"); 
      } 
      mmSocket = tmp; 
     } 

     public void run(){ 
      mmAdapter.cancelDiscovery(); 

      //sleep to allow time for bluetooth device to get ready 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e5) { 
       e5.printStackTrace(); 
      } 

      //handler get message from arduino: that bluetooth device is ready 

      //Get BluetoothDevice object 
      try{ 
       //Connect to device 
       mmSocket.connect(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     }catch(IOException e){ 
      try{ 
       //Connect to device 
       mmSocket.connect(); 
      }catch(IOException e1){ 
       } 
       return; 
     } 
      return; 
     } 

      mConnectedThread.ConnectedThread(mmSocket); 
     } 

    } 

BluetoothConnection.java:

public class BluetoothConnection extends Service { 

public final BluetoothAdapter mAdapter = null; 
public ConnectThread mConnectThread; 
    public ConnectedThread mConnectedThread; 

private final IBinder mBinder = new BluetoothService(); 

public class BluetoothService extends Binder{  
    BluetoothConnection getService(){ 
      return BluetoothConnection.this; 
    } 
} 

@Override 
public IBinder onBind (Intent intent){ 
    Log.d("Blueooth Connection", "Intent Binder"); 
    return mBinder; 
} 

public synchronized void connect(BluetoothDevice device, BluetoothAdapter mAdapter)  throws NoSuchMethodException, IllegalAccessException, InvocationTargetException{ 

    try{ 
     mConnectThread = new ConnectThread(device, mAdapter); 
     mConnectThread.start(); 

    }catch(SecurityException e){ 
     System.out.println("SecurityException at connect()"); 
    } catch(IllegalArgumentException e){ 
     System.out.println("IllegalArgumentException at connect()"); 
    }catch(NullPointerException e) 
{System.out.println("Null Pointer Exception at connect()"); 
    } 
} 

public synchronized void ConnectedThread(BluetoothSocket socket){ 
    mConnectedThread = new ConnectedThread(socket); 
    mConnectedThread.start(); 
} 

public void write(String out){ 
    //create temporary object 
    ConnectedThread r; 
    synchronized(this){ 
     r = mConnectedThread; 
    }   
    r.write(out); 
}  

@Override 
public void onDestroy() { 
} 
} 

В ано ther Активность: Я вызвал sendData(); написать «1» Ардуино.

+0

Как называется ваше устройство Android (с его номером версии для Android) и точное имя вашего устройства Bluetooth? –

+0

Это скорее всего проблема совместимости. Bluetooth в Android на самом деле довольно фрагментирован. И это только улучшается, когда вы поднимаете номера версий. Извините, у меня нет ответа для вас. Этот вопрос требует слишком много исследований для меня. –

+0

Пожалуйста, покажите свой код, связанный с подключением. – Heeryu

ответ

0

Edit:

Может быть, это не то, что вызывает у вас проблемы, но вы не должны делать что-то вроде этого:

//Get BluetoothDevice object 
    try{ 
     //Connect to device 
     mmSocket.connect(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    }catch(IOException e){ 
     try{ 
      //Connect to device 
      mmSocket.connect(); 
     }catch(IOException e1){ 
     } 
     return; 
    } 

Вы можете закончить с несвязным mmSocket, потому что вы просто игнорируя IOException и пытается еще раз. Попробуйте e.printStackTrace() в первом блоке try/catch, чтобы узнать, есть ли у вас проблемы с подключением.

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

Edit 2:

Пожалуйста, измените

public void write(byte[] bytes) { 
    try { 
     mmOutStream.write(bytes); 
    } catch (IOException e) { } 
} 

в

public void write(byte[] bytes) { 
    try { 
     mmOutStream.write(bytes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

и посмотреть на выходе LogCat, чтобы увидеть, если он показывает что-то не так.

+0

Пробовал, но он не работает. Соединение остается активным, связывая службу с активностью. – shannon

+0

Спасибо за ваше предложение! Однако мне удалось установить соединение между телефоном и удаленным устройством Bluetooth, но не удалось отправить что-либо на устройство с помощью функции write(). Программа застревает внутри цикла while (true). – shannon

+0

Привет, я добавил в e.printStackTrace(); но ничего не было напечатано. write() вообще не вызывалась. – shannon

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