从Android设备向蓝牙发送命令

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (366)

我遇到了一个问题,从我的android设备发送命令到蓝牙设备。

蓝牙与微控制器相关联:

    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)到外部蓝牙。但我正在问题。日志跟踪在应用程序发布时的下方:

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

扫码关注云+社区