Как получить доступ к BLE на Raspberry Pi 3 с помощью Java?

Малина Pi 3 включает поддержку BLE. Я подтвердил, что он работает

sudo hcitool lescan

который вернул MAC и BLE "полное локальное имя" для соседних рекламодателей.

Как получить доступ к программному обеспечению в Java?

Ответ 1

Чтобы использовать BLE на Raspberry Pi 3, вам нужно обновить bluez (ядро bluetooth в Raspbian linux), а затем использовать интерфейс Bluez D-Bus для взаимодействия с ним.

Я ищу для написания своего собственного java lib, но это очень сложно, потому что документации о D-Bus в java и о bluez мало.

Для bluez в последнем дистрибутиве есть только код образца.

На данный момент я написал простой script, обновляющий версию bluez до последней версии: https://gist.github.com/tongo/94338cebf4e6367d353439bca8d0a376

Я также нашел сообщение в блоге, в котором рассказывается о d-bus, java и bluez: http://smartspacestuff.blogspot.it/2016/02/i-got-figurin-out-dbus-bluez.html

Это было полезно, но не очень понятно для меня.

Надеюсь, это поможет.

Если вы нашли другую документацию, отправьте ее.

Ответ 2

Я не думаю, что в это время есть ясный или простой ответ. Для интеграции с Bluetooth необходимы встроенные компоненты, которые не являются частью стандартного JDK.

Наиболее распространенной библиотекой, используемой для использования Bluetooth с Java в Linux, является BlueCove. BlueCove предоставляет дополнительные собственные библиотеки для работы с Bluetooth на linux: BlueCove-GPL или BlueCove-bluez (экспериментальный). Однако вам, вероятно, придется скомпилировать один из них самостоятельно для использования на вашем RPi. Способы выполнения будут зависеть от вашего дистрибутива и потребуют значительных знаний об Linux, компиляции собственного кода и т.д. Быстрый поиск в Google показывает некоторые рабочие примеры этого для предыдущих версий RPi. Неясно, будет ли он работать с BLE на RPi 3, хотя.

Другим может быть попытка использовать "компонент Camel Bluetooth ", который является оболочкой над Bluecove и ожидает установки libbluetooth-dev и blueman. Но опять же, непонятно, будет ли он работать с RPi 3.

Если не удается получить истинную интеграцию, другой вариант может заключаться в том, чтобы просто сделать внешний Process вызывать из Java в командной строке Утилиты Bluetooth, которые вы знаете, уже работают. Это зависит от вашего прецедента, если этот вариант, но я подозреваю, может быть достаточно для многих конкретных случаев использования BLE.

Ответ 3

Вы можете сделать это очень просто, просто выполнив команду через Runtime и прочитав вывод с помощью BufferedReader.

Выполнение команды:

Process p;
p = Runtime.getRuntime().exec(command);
p.waitFor();

Полный код:

 package your.package.rpicommand;

 import java.io.BufferedReader;
 import java.io.InputStreamReader;

 public class ExecuteShellCommand {

public static void main(String[] args) {

    ExecuteShellCommand obj = new ExecuteShellCommand();

    String domainName = "google.com";

    //in mac oxs
    String command = "ping -c 3 " + domainName;

    //in windows
    //String command = "ping -n 3 " + domainName;

    String output = obj.executeCommand(command);

    System.out.println(output);

}

private String executeCommand(String command) {

    StringBuffer output = new StringBuffer();

    Process p;
    try {
        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader =
                        new BufferedReader(new InputStreamReader(p.getInputStream()));

                    String line = "";
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();

}

}

Я бы хотел, чтобы я закодировал это для вас, но в Интернете уже есть много примеров.

Хотя это один из способов сделать это, вы должны использовать BlueCove или некоторую библиотеку для сканирования через устройства Bluetooth.

Источник: https://www.mkyong.com/java/how-to-execute-shell-command-from-java/