2016-08-09 5 views
17

У меня возникла проблема отправки команд с моего устройства Android на устройство Bluetooth.Отправьте команду на Bluetooth с устройства Android

Bluetooth связан с микроконтроллером. Мое усилие ниже:

public class MainActivity extends AppCompatActivity { 
    private static final int REQUEST_ENABLE_BT = 2; 
    private BluetoothAdapter mBluetoothAdapter; 

    public static final String TAG = "CustomPOC BLEEEEEEE"; 
    private Button btn_send; 
    private BluetoothDevice mdevice; 
    private Handler mHandler; 
    private ConnectThread mConnectThread; 
    private ConnectedThread mConnectedThread; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     btn_send = (Button)findViewById(R.id.senddata); 

     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); 
      finish(); 
      return; 
     } 

     if (!mBluetoothAdapter.isEnabled()) { 
      Log.i(TAG, "onClick - BT not enabled yet"); 
      Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableIntent, REQUEST_ENABLE_BT); 
     } 
     pairedOrNot(); 


     btn_send.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mConnectThread = new ConnectThread(mdevice); 
       mConnectThread.start(); 
       // new ConnectAsynk(mdevice).execute(); 
      } 
     }); 
    } 

    private void pairedOrNot() { 
     Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
     List<String> s = new ArrayList<String>(); 
     for(BluetoothDevice bt : pairedDevices) { 
      s.add(bt.getAddress()); 
      s.add(bt.getName()); 
      if("08:7C:BE:00:00:01".equals(bt.getAddress())) { 
       mdevice = bt; 
      } 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 

      case REQUEST_ENABLE_BT: 
       // When the request to enable Bluetooth returns 
       if (resultCode == Activity.RESULT_OK) { 
        Toast.makeText(this, "Bluetooth has turned on ", Toast.LENGTH_SHORT).show(); 

       } else { 
        // User did not enable Bluetooth or an error occurred 
        Log.d(TAG, "BT not enabled"); 
        Toast.makeText(this, "Problem in BT Turning ON ", Toast.LENGTH_SHORT).show(); 
        finish(); 
       } 
       break; 
      default: 
       Log.e(TAG, "wrong request code"); 
       break; 
     } 
    } 

    private class ConnectThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final BluetoothDevice mmDevice; 
     private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
     public ConnectThread(BluetoothDevice device) { 
      BluetoothSocket tmp = null; 
      mmDevice = device; 
      try { 

       tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID); 

       /*Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmp = (BluetoothSocket) m.invoke(device, 1);*/ 
       System.out.println("BTTTTTTTTTTT Address "+mmDevice.getAddress()); 
       BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()); 
//    Method m; 
//    m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); 
//    tmp = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1)); 
      } 
      catch (Exception e){ 
      e.printStackTrace(); 
      } 
      mmSocket = tmp; 
     } 
     public void run() { 
      mBluetoothAdapter.cancelDiscovery(); 

      try { 
       mmSocket.connect(); 

       // Reset the ConnectThread because we're done 
       synchronized (MainActivity.this) { 
        mConnectThread = null; 
       } 

       // Cancel the thread that completed the connection 
       if (mConnectThread != null) { 
        mConnectThread.cancel(); 
        mConnectThread = null; 
       } 

       // Cancel any thread currently running a connection 
       if (mConnectedThread != null) { 
        mConnectedThread.cancel(); 
        mConnectedThread = null; 
       } 

       ConnectedThread mConnectedThread = new ConnectedThread(mmSocket); 
       mConnectedThread.start(); 
      } catch (IOException connectException) { 
       try { 
        connectException.printStackTrace(); 
        mmSocket.close(); 
       } catch (IOException closeException) { } 

      } catch (Exception ex){ 
       ex.printStackTrace(); 
      } 

     } 
     public void cancel(){ 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { e.printStackTrace();} 
     } 

    } 


    private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private 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) { e.printStackTrace();} 
      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 
     public void run() { 
      byte[] buffer = new byte[1024]; 
      int begin = 0; 
      int bytes = 0; 
      while (true) { 
       try { 
        bytes += mmInStream.read(buffer, bytes, buffer.length - bytes); 
        for(int i = begin; i < bytes; i++) { 
         if(buffer[i] == "1010101100000001000000100000000100001110".getBytes()[0]) { 
          mHandler.obtainMessage(1, begin, i, buffer).sendToTarget(); 
          begin = i + 1; 
          if(i == bytes - 1) { 
           bytes = 0; 
           begin = 0; 
          } 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
        break; 
       } 
      } 
     } 
     public void write(byte[] bytes) { 
      try { 
       mmOutStream.write(bytes); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Несколько хедз-апе, что, когда я проверить состояние подключения по

tmp.isConnected() 

я обнаружил, что она возвращается в

ложных

стоимость.

Я хочу отправить эту команду (1010101100000001000000010000000100001110) на внешний Bluetooth. Но я становлюсь проблемой. Вход след ниже в момент запуска приложения:

08-17 07:48:39.718: W/art(14551): Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics. 
drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, 
android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 

Когда нажмите на кнопку btn_send, то я получаю сообщение ниже в логе:

08-17 07:51:32.046: W/BluetoothAdapter(14984): getBluetoothService() called with no BluetoothManagerCallback 
08-17 07:51:38.448: W/System.err(14984): java.io.IOException: read failed, socket might closed or timeout, read ret: -1 
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573) 
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:584) 
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:321) 
08-17 07:51:38.449: W/System.err(14984): at com.mahmad.custompoc11aug.MainActivity$ConnectThread.run(MainActivity.java:164) 

и после отладки я заметить, что вопрос является в этой строке

mmSocket.connect(); 

Все необходимые разрешения приведены в файле манифеста. Пожалуйста, помогите мне избавиться от этой проблемы. Заранее спасибо.

+0

Выход LogCat вы приложенный не имеет никакого значения, потому что в вашем коде все исключения «замолчать» - вы ловите их и ничего не делать. Самый минимальный, который вы ДОЛЖНЫ делать, когда ловить исключение - это зарегистрировать его (например, 'e.printStackTrace()'). Повторите свой код со всеми зарегистрированными исключениями, и тогда мы сможем вам помочь – Vasiliy

+0

Вопрос обновлен. Пожалуйста, проверь это. – DJhon

+0

И снова - как вы можете знать, что на пути не возникает никакого исключения? Исключения выбрасываются, чтобы уведомить вас, что что-то пошло не так, но вы просто игнорируете их. Добавьте 'e.printStackTrace()' ко всем вашим предложениям 'catch' и опубликуйте весь вывод logcat. – Vasiliy

ответ

1

У меня есть очень simmilar код и он работает, может быть, одна из главных отличий это то, что я делаю сброс потоков:

// Reset the ConnectThread because we're done 
      synchronized (blablabla.this) { 
       mConnectThread = null; 
      } 

// Cancel the thread that completed the connection 
     if (mConnectThread != null) { 
      mConnectThread.cancel(); 
      mConnectThread = null; 
     } 

    // Cancel any thread currently running a connection 
    if (mConnectedThread != null) { 
     mConnectedThread.cancel(); 
     mConnectedThread = null; 
    } 

    // Start the thread to manage the connection and perform transmissions 
    mConnectedThread = new ConnectedThread(socket); 
    mConnectedThread.start(); 

Только после того, как вы делаете:

mmSocket.connect(); 

Надеюсь, поможет.

+0

Спасибо за вашу помощь, но это не работает для меня. Любое дальнейшее предложение будет действительно полезно. После отладки у него есть проблема в этой строке «mmSocket.connect();» – DJhon

+0

Пожалуйста, обратите внимание на обновленный вопрос. – DJhon

1

Я пробовал эту библиотеку. Вы можете попробовать это также https://github.com/palaima/AndroidSmoothBluetooth

+0

Над библиотекой «Build issue». Спасибо за помощь. Я пытаюсь его построить. Когда я получу шанс, я вернусь к вам. – DJhon

0

Как вы уже упоминали, что этот вопрос есть на mmSocket.connect(); линии, следовательно, проблема не в то время как вы отправляете команду, но создавая соединение т.е. вы не в состоянии извлечь BluetoothSocket в открытом или подключенного состояния.

Что вы должны делать?

Попробуйте использовать следующий код с UUID, его действительным для моего блютуза ключей.

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

Позвольте мне знать, если это работает для вас.

Также проверьте, https://stackoverflow.com/a/18786701/1503130

+0

Извинения за задержку в ответе. Но это не работает. – DJhon

+0

Привет .. Prateek, можете ли вы отправить команду? Нужны ваши входы –

+0

Да, я смог отправить команды. – Prateek

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