Отправить команду на Bluetooth с Android-устройства

Я получаю проблему для отправки команд с моего устройства Android на устройство Bluetooth.

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(); 

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

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

 // 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(); 

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

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

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

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

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

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

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

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