Bluetooth ASCII протокол - PullRequest
       21

Bluetooth ASCII протокол

0 голосов
/ 30 апреля 2011

Я пытаюсь связаться с устройством Bluetooth. Информация, которую я имею на устройстве, гласит, что

"Протокол связи - ASCII, отдельные выходные значения запятые. Сообщение завершается парой возврата каретки и перевода строки. При сохранении в виде файла с помощью эмулятора терминала эти результаты могут быть считаны в электронную таблицу Excel."

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

EDIT:

для отправки данных я пытаюсь:

public void send(String s){
            try {
                writer.write(s);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

, где

try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }

            inStream = tmpIn;
            writer = new OutputStreamWriter(tmpOut);

Вы также можете видеть там, где я использую inStream, который является простым InputStream. Я также попробовал InputStreamReader, но я только что получил случайные символы обратно. С InputStream я читаю только 4 байта, независимо от того, что я отправляю устройство, поэтому я не уверен, работает ли даже отправка.

Что я должен использовать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 января 2012

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

Вот код, который я использую для отправки и получения, я уже использовал его на нескольких устройствах, и, похоже, он работает хорошо.

    /**
 * This thread runs during a connection with a remote device.
 * It handles all incoming and outgoing transmissions.
 */
private class ConnectedThread extends Thread {
    private final BluetoothSocket socket;
    private final InputStream inStream;
    private final OutputStream outStream;
    private final DataInputStream datIn;

    public ConnectedThread(BluetoothSocket socket) {
        Log.d(TAG, "create ConnectedThread");
        this.socket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the BluetoothSocket input and output streams
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, "temp sockets not created", e);
        }

        inStream = tmpIn;
        outStream = tmpOut;
        datIn = new DataInputStream(inStream);
    }

    public void run() {
        Log.i(TAG, "BEGIN ConnectedThread");
        Bundle data = new Bundle();

        // Keep listening to the InputStream while connected
        while (true) {
            Log.i(TAG, "Reading...");
            try {
                // Read from the InputStream
                String results;
                Log.i(TAG, "Recieved:");
                results = datIn.readLine();
                Log.i(TAG, results);

             // Send the obtained bytes to the UI Activity
                data.putString("results", results);
                Message m = handler.obtainMessage(); // get a new message from the handler
                m.setData(data); // add the data to the message
                m.what = MESSAGE_READ;
                handler.sendMessage(m);
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                handler.obtainMessage(MESSAGE_DISCONNECTED).sendToTarget();
                setState(STATE_NONE);
                // Start the service over to restart listening mode
                break;
            }
        }
    }

    /**
     * Write to the connected OutStream.
     * @param buffer  The bytes to write
     */
    public void write(byte[] buffer) {
        try {
            outStream.write(buffer);
            Log.i(TAG, "Sending: " + new String(buffer));

        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }

    public void cancel() {
        try {
            socket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

/**
 * Write to the ConnectedThread in an unsynchronized manner
 * @param out The bytes to write
 * @see ConnectedThread#write(byte[])
 */
public void send(byte[] out) {
    // Create temporary object
    ConnectedThread r;
    // Synchronize a copy of the ConnectedThread
    synchronized (this) {
        if (state != STATE_CONNECTED) return;
        r = connectedThread;
    }
    // Perform the write unsynchronized
    r.write(out);
}
0 голосов
/ 19 августа 2011

Вы должны взглянуть на документацию Java по IO Streams, чтобы получить полную картину.

Для получения я предполагаю, что вы используете метод InputStream.read(), который читает один байт за раз. Чтобы получить несколько байтов за раз, вы должны использовать буфер byte[]. Но это не ваш случай, просто к вашему сведению.

В вашем случае вам не нужно использовать InputStream методы, но вместо этого InputStreamReader, потому что Reader работает с символами, а не байтами. Как указано в вашей цитате описания протокола, у вас есть отдельные строки ASCII. В этой ситуации удобен BufferedReader, поскольку он имеет метод readLine().

Так что вы можете просто

    in = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(in);
    BufferedReader br = new BufferedReader(isr);

А потом

    String line = br.readLine();

Для отправки данных вы должны использовать OutputStreamWriter.

ПОМНИТЕ: Пожалуйста, закройте потоки после использования !!! в finaly{} пункте

...