Android BluetoothSocket连接返回零

时间:2016-04-26 13:41:25

标签: android android-bluetooth bluetooth-socket

我们的设备通过蓝牙发送数据,在Android应用中我们需要读取这些数据。

我能够建立蓝牙连接,接下来我正在调用一个线程来使用BluetoothDevice建立蓝牙连接。这里读取字节时返回0(零) while循环也只运行一次。

我在下面的代码中使用的UUID也来自某些蓝牙代码段。我是否需要获取设备的正确UUID。

请有人帮忙吗?。如果你给我一个有用的答案,我们将不胜感激。

   //Calling ConnectThread after Bluetooth is paired
    public 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 {
                    String name = device.getName();
                    Log.e("Device Name ", name);
                    tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e) {
                }
                mmSocket = tmp;
            }

            public void run() {
                // mAdapter.cancelDiscovery();
                try {
                    mmSocket.connect();

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

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

        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) {
                }
                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);
                        if (mmSocket.isConnected()) {
                            Log.e("Socket is connected", "Socket is connected");
                        }
                        int numOfBytes = mmInStream.available();
                        Log.e("numOfBytes", String.valueOf(+numOfBytes));
                        bytes = mmInStream.read(buffer);

                        // mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        // .sendToTarget();



                    } catch (IOException e) {
                        break;
                    }
                }
            }


i am struck and unable to read the data from the Bluetooth

1 个答案:

答案 0 :(得分:1)

  

我是否需要获取设备的正确UUID。

是。您可以使用getUuids() BluetoothDevice返回远程设备支持的功能(UUID),如果需要新的UUID,则fetchUuidsWithSdp()

  

while循环只运行一次。

这是因为您的代码抛出错误而您正在处理此错误并退出循环

            while (true) {
                try {
                    // bytes += mmInStream.read(buffer, bytes, buffer.length
                    // - bytes);
                    if (mmSocket.isConnected()) {
                        Log.e("Socket is connected", "Socket is connected");
                    }
                    int numOfBytes = mmInStream.available();
                    Log.e("numOfBytes", String.valueOf(+numOfBytes));
                    bytes = mmInStream.read(buffer);

                    // mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                    // .sendToTarget();



                } catch (IOException e) {
                    // THIS BREAK INTERRUPT YOUR WHILE-LOOP SENTENCE
                    break;
                }
            }
  

这里读取字节时返回0

因为您创建了一个套接字的InputStream,但它没有连接到任何东西(因为您创建套接字所创建的UUID在您进行蓝牙连接的设备中不存在)

修改

获取uuids的其他方法是配置广播接收器以取回uuids:

//Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_UUID);
//Set your other filters
registerReceiver(ActionFoundReceiver, filter); // Don't forget to unregister during onDestroy

创建您的BroadcastRecievier以获取UUID:

  private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
     String action = intent.getAction();

       if(BluetoothDevice.ACTION_UUID.equals(action)) {
         BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
         Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
         for (int i=0; i<uuidExtra.length; i++) {
         Log.i("TEST-UUIDS","Device: " + device.getName() + ", " + device + ", Service: " + uuidExtra[i].toString());
         }
       } 
       else if(BluetoothDevice.YOUR_OTHER_ACTION_1){
        //YOUR CODE FOR ACTION 1

       } 
       else if(BluetoothDevice.YOUR_OTHER_ACTION_2){
        //YOUR CODE FOR ACTION 2

       } 

    }
  };

注意:并非每个蓝牙设备都显示其服务uuid​​s'