从Android设备

时间:2016-08-09 10:33:24

标签: android bluetooth

我遇到了从我的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();

所有必需的权限都在清单文件中给出。请帮我解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我试过这个库。你也可以尝试一下     https://github.com/palaima/AndroidSmoothBluetooth

答案 1 :(得分:0)

正如您所提到的那样问题出现在mmSocket.connect();行上,问题不在于您发送命令但是创建连接时,即您无法在打开时检索BluetoothSocket或连接状态。

  

你应该怎么做?

尝试将以下代码与 UUID 一起使用,它对我的​​蓝牙加密狗有效。

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

如果这对您有用,请告诉我。

还检查, https://stackoverflow.com/a/18786701/1503130