6

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

我能够建立蓝牙连接,接下来我调用一个线程来使用蓝牙设备建立蓝牙套接字连接。在这里,当读取字节时,它返回为 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
4

1 回答 1

1

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

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

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 在您进行蓝牙连接的设备中不存在)

编辑

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

//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'

于 2016-05-06T10:53:37.260 回答