Отправить команду на 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();

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

 DJhon16 авг. 2016 г., 08:14
Вопрос обновлен. Пожалуйста, проверь это.
 Boldbayar19 авг. 2016 г., 05:19
Вы закрыли свое текущее соединение? как mSocket.close ();
 DJhon17 авг. 2016 г., 10:43
Любое решение ???
 DJhon16 авг. 2016 г., 10:16
Обратите внимание, что - я использую «Протокол передачи RS232: 1200, N, 8, 1».
 Sreejith Krishnan R19 авг. 2016 г., 11:51
@Dilshad Можете ли вы опубликовать соответствующий код, написанный для микроконтроллера. Вы используете Bluez? Также попробуйте получить все записи SDP, используяdeveloper.android.com/reference/android/bluetooth/... и посмотрите, присутствует ли в нем UUID, который вы используете.
 Muhammed Refaat18 авг. 2016 г., 13:41
Вы смотрели здесьstackoverflow.com/questions/18657427/...
 Vasiliy17 авг. 2016 г., 11:09
Как вы ожидаете получить решение, если вы не выполнили того минимума, о котором я вас просил - вывести трассировку стека для всех исключений, перезапустить код и опубликовать весь logcat?
 Vasiliy16 авг. 2016 г., 08:31
И снова - как вы можете знать, что по пути не исключение? Исключения создаются для того, чтобы уведомить вас о том, что что-то пошло не так, но вы просто игнорируете их. добавлятьe.printStackTrace() всем вашимcatch пункты и опубликовать весь вывод logcat.
 DJhon17 авг. 2016 г., 12:02
Спасибо за вашу поддержку, пожалуйста, проверьте обновленный вопрос. Здесь достаточно информации для вас. Пожалуйста, дайте мне знать.
 Vasiliy16 авг. 2016 г., 07:05
Вывод logcat, который вы вложили, не имеет значения, потому что в вашем коде все исключения "замалчиваются" - вы ловите их и ничего не делаете. Минимум, который вы ДОЛЖНЫ сделать при обнаружении исключения, - это зарегистрировать его (например,e.printStackTrace()). Пожалуйста, повторите ваш код со всеми зарегистрированными исключениями, и тогда мы сможем помочь вам
 DJhon16 авг. 2016 г., 09:07
Спасибо за ответ, но опубликованная выше трассировка журнала показывается только в Studio trace. Но после отладки я обнаружил проблему в строке "mmSocket.connect ();". Пожалуйста, помогите мне, или любое предложение будет заметно.
 Umut Catal17 авг. 2016 г., 12:10
Вы можете использовать эти шаги для отправки данных.adhityareza.wordpress.com/2014/10/21/...

Ответы на вопрос(3)

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

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

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

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

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

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

 DJhon23 авг. 2016 г., 13:05
Извиняюсь за задержку с ответом. Но это не работает.
 Prateek28 февр. 2017 г., 04:23
Да, я смог отправить команды.
 Subhalaxmi23 февр. 2017 г., 14:10
Привет .. Prateek, Может вы можете отправить команду? Нужны ваши входы

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

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

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

 DJhon16 авг. 2016 г., 14:25
Спасибо за вашу помощь, но это не работает для меня. Любое дальнейшее предложение будет действительно полезным. После отладки он выдает в этой строке "mmSocket.connect ();"
 DJhon16 авг. 2016 г., 14:47
Пожалуйста, посмотрите на обновленный вопрос.

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

 DJhon17 авг. 2016 г., 13:25
Над библиотекой есть "Build Issue". Спасибо за помощь. Я пытаюсь построить это. Когда я получу шанс, я вернусь к вам.

Ваш ответ на вопрос