2015-06-13 2 views
0

Я пишу приложение для Android, которое может взаимодействовать с ардуино. Мое приложение имеет 2 кнопки 1. Подключите 2. Dis-Connect, чтобы запустить и остановить обслуживание Bluetooth. У меня есть тестовый эскиз на arduino, который, когда получает «1», отправит «404» (просто проверить!) Обратно на мой телефон.Android-Bluetooth: Служба Bluetooth работает неожиданно

Вот мой Bluetooth класс

public class BluetoothService extends Service { 
     private BluetoothManager bluetoothManager; 
     private ServiceHandler mSHandler; 

     public BluetoothService(){} 

     private final class ServiceHandler extends Handler { 
      public ServiceHandler(Looper looper) { 
       super(looper); 
      } 

      @Override 
      public void handleMessage(Message msg) { 
      } 
     } 

     @Override 
     public void onCreate() { 
      super.onCreate(); 
      HandlerThread thread = new HandlerThread("ServiceStartArguments", android.os.Process.THREAD_PRIORITY_BACKGROUND); 
      thread.start(); 
      Looper mSLoop = thread.getLooper(); 
      mSHandler = new ServiceHandler(mSLoop); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Message msg = mSHandler.obtainMessage(); 
      msg.arg1 = startId; 
      mSHandler.sendMessage(msg); 
      bluetoothManager=new BluetoothManager(); 
      bluetoothManager.writeData("1", getApplicationContext()); //sending "1" to arduino 
      String str= bluetoothManager.readData(getApplicationContext()); //reading "404" from arduino 
      Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show(); 
      return START_STICKY; 
     } 


     @Override 
     public void onDestroy(){ 
      bluetoothManager.turnBluetoothOff(); 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
     return null; 
     } 
    } 

обслуживание Теперь вот мой BluetoothManager класс:

public class BluetoothManager { 
    private BluetoothAdapter bluetoothAdapter; 
    private BluetoothDevice bluetoothDevice; 
    private BluetoothSocket bluetoothSocket; 
    private ConnectedThread connectedThread; 
    private byte[] buffer; 

    public BluetoothManager(){ 
     buffer=new byte[256]; 
     bluetoothSocket=null; 
     bluetoothAdapter=null; 
     bluetoothDevice=null; 
     connectedThread=null; 
     getBluetoothAdapter(); 
     if(!isBluetoothAvailable()){ 
      turnBluetoothOn(); 
     } 
     scanToConnect(); 
    } 
    public void turnBluetoothOff(){ 
     try { 
      bluetoothSocket.close(); 
      bluetoothSocket=null; 
      bluetoothAdapter.cancelDiscovery(); 
      bluetoothAdapter.disable(); 
      bluetoothAdapter=null; 
      bluetoothDevice=null; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    private boolean isBluetoothAvailable(){ 
     return bluetoothAdapter.isEnabled(); 
    } 
    private void turnBluetoothOn(){ 
     bluetoothAdapter.enable(); 
    } 
    public String readData(Context context){ 
     String outputString=null; 
     if(isBluetoothAvailable()) { 
      outputString = connectedThread.read(buffer); 
     }else{ 
      Toast.makeText(context, "Error: Not Connected", Toast.LENGTH_LONG).show(); 
     } 
     return outputString; 
    } 
    public void writeData(String string, Context context){ 
     if(isBluetoothAvailable()) { 
      connectedThread.write(string.getBytes()); 
     }else{ 
      Toast.makeText(context, "Error: Not Connected", Toast.LENGTH_LONG).show(); 
     } 
    } 
    private void getBluetoothAdapter(){ 
     try{ 
      bluetoothAdapter=BluetoothAdapter.getDefaultAdapter(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    private void scanToConnect(){ 
     Set<BluetoothDevice> pairedDevices=bluetoothAdapter.getBondedDevices(); 
     if(pairedDevices.size()>0){ 
      try { 
       for (BluetoothDevice device : pairedDevices) { 
        if (device.getName().equals("HC-05")) { 
         bluetoothDevice = device; 
         new connectBt(bluetoothDevice); 
         break; 
        } 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
    private class connectBt extends Thread { 
     public connectBt(BluetoothDevice device) { 
      BluetoothSocket tmp = null; 
      bluetoothDevice = device; 
      UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
      try { 
       tmp = device.createRfcommSocketToServiceRecord(uuid); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      bluetoothSocket = tmp; 
      run(); 
     } 
     public void run() { 
      bluetoothAdapter.cancelDiscovery(); 
      try { 
       bluetoothSocket.connect(); 
       connectedThread = new ConnectedThread(bluetoothSocket); 
      } catch (IOException connectException) { 
       closeSocket(); 
      } 
     } 
     private void closeSocket() { 
      try { 
       bluetoothSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    private class ConnectedThread extends Thread{ 
     private InputStream mInput=null; 
     private OutputStream mOutput=null; 
     private String strInput; 

     public ConnectedThread(BluetoothSocket socket){ 
      bluetoothSocket=socket; 
      InputStream tmpIn=null; 
      OutputStream tmpOut=null; 
      try{ 
       tmpIn=socket.getInputStream(); 
       tmpOut=socket.getOutputStream(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
       closeSocket(); 
      } 
      mInput=tmpIn; 
      mOutput=tmpOut; 
     } 
     public void write(byte[] bytes){ 
      try{ 
       mOutput.write(bytes); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
     public String read(byte[] bytes){ 
      try { 
       mInput.read(bytes); 
       strInput = new String(bytes); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return strInput; 
     } 
     public void closeSocket(){ 
      try{ 
       bluetoothSocket.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Моя проблема заключается в том, что я должен нажать кнопку подключения дважды для подключения к Arduino, первое нажатие позволит bluetooth и второе нажатие будет подключаться к arduino, а затем отправлять и принимать данные. Но это не так, как я предполагал, включение bluetooth и подключение должно было произойти с одним нажатием. Так почему же так себя ведут?

N.B: Я новичок в java и android.

+0

После включения Bluetooth потребуется некоторое время, чтобы получить список парных устройств. Но в этом случае вы читаете сопряженные устройства сразу после включения Bluetooth. Может быть, вы задерживаете соединение. – 7383

+0

Будет проверять, что ... Не думал, что. – Vivek

+0

Помог ли мой комментарий? – 7383

ответ

1

После включения Bluetooth это займет некоторое время, чтобы получить список подключенного устройства. Но в этом случае вы читаете сопряженные устройства сразу после включения Bluetooth. Может быть, вы задерживаете соединение.

Использовать методы обработчика для задержки выполнения.

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