Небезопасное соединение Bluetooth действует как петля?

Я разрабатываю приложение Android Bluetooth, которое предназначено для общения по Bluetooth с устройством, которое мы создали, я успешно заставил все работать на большинстве устройств на Android 3+, но кажется, что Android 2.3.x (это наше минимальное требование) не вести себя как другие. Я также воспроизвел такое же поведение на Huawei Ascend P1.

Случается так, что на стороне Android все работает нормально, я подключаюсь к устройству, и если я не в паре, делается запрос на сопряжение, я получаю как входящие, так и исходящие данные, но когда я их использую, они действуют так, как будто я разговариваю сам с собой. петля Все написанное на выходном потоке читается на входном потоке. И конечно устройство не видит ничего (кажется, что даже не знает, что подключен телефон андроид).

Вот пример кода из моих источников (большая часть точно такая же, как описано в документации Android):

Присоединительная резьба:

   private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        btSpeaking = true;
        BluetoothSocket tmp = null;
        mmDevice = device;
        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            tmp = device.createInsecureRfcommSocketToServiceRecord(BluetoothUuid.declareUuid.getUuid());
        } catch (IOException e) { }
        mmSocket = tmp;
    }

    public void run() {
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }

        // Do work to manage the connection (in a separate thread)
        mConnected = new ConnectedThread(mmSocket);
        mConnected.start();
    }

    /** Will cancel an in-progress connection, and close the socket */
    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;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            WSLog.e(tag, e.getMessage(), e);
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
            try {
                writeSocket(RESET, empty);
            } catch (IOException e1) {
                return;
            }

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                                              for (int size = 0; size < framesize;) {
                        int read = mmInStream.read(frame, size, frame.length - size);
                        if (read < 0) {
                            return;
                        }
                        size = size + read;
                    }
                } catch (IOException e) {
                    return;
                }
            }

    }

Написать сокет:

private void writeSocket(byte comm, byte[] data) throws IOException {
        ByteBuffer bf = ByteBuffer.allocate(1 + data.length);
        bf.put(PROTO);
        bf.put(comm);
        bf.put(data);
        mmOutStream.write(bf.array());
    }

Я действительно надеюсь, что я не делаю что-то явно не так, но так как я не могу понять, почему это не работает, у меня не было выбора, кроме как обратиться за помощью.

Спасибо мартин

0 ответов

Другие вопросы по тегам