InputStream.available () сообщает об отсутствии байтов при прослушивании сервера Bluetooth RFCOMM, который постоянно передает данные - PullRequest
2 голосов
/ 14 сентября 2011

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

У меня есть пример кода, но он зависает в команде чтения.

// Ref http://homepages.ius.edu/rwisman/C490/html/JavaandBluetooth.htm
import java.io.*;
import javax.microedition.io.*;
//import javax.bluetooth.*;

public class RFCOMMClient {
    public static void main(String args[]) {
    try {
        StreamConnection conn = (StreamConnection) Connector.open(
        "btspp://00078093523B:2", Connector.READ, true);

        InputStream is = conn.openInputStream();

        byte buffer[] = new byte[8];
        try {
            int bytes_read = is.read(buffer, 0, 8);
            String received = new String(buffer, 0, bytes_read);
            System.out.println("received: " + received);
        } catch (IOException e) {
            System.out.println(" FAIL");
            System.err.print(e.toString());
        }
        conn.close();
    } catch (IOException e) {
        System.err.print(e.toString());
    }
}

}

Обратите внимание, что проблема заключается в том, что вызов read () считает, что данных нет.Тем не менее, устройство Bluetooth постоянно выплевывает данные (это датчик).Вот мой код Python, который работает:

In [1]: import bluetooth

In [2]: address = "00:07:80:93:52:3B"

In [3]: s = bluetooth.BluetoothSocket(bluetooth.RFCOMM)

In [4]: s.connect((address,1))

In [5]: s.recv(1024)
Out[5]: '<CONFIDENTIALDATAREMOVED>'

Пожалуйста, помогите,

Спасибо!

1 Ответ

1 голос
/ 14 сентября 2011

чтение заблокирует и будет ждать данных; лучшей идиомой было бы использовать available ():

int bytesToRead = is.available();
if(bytesToRead > 0)
    is.read(buffer, 0, bytesToRead);
else
    // wait for data to become available
...