14

Raspberry Pi 3 包括 BLE 支持。我确认它的工作原理

sudo hcitool lescan

它为邻近的广告商返回了 MAC 和 BLE 的“完整本地名称”。

在 Java 中如何以编程方式访问它?

4

3 回答 3

4

要在 Raspberry Pi 3 上使用 BLE,您必须更新 bluez(Raspbian linux 中的蓝牙核心),然后使用 bluez D-Bus 接口与之交互。

我正在寻找编写自己的 java lib,但这非常困难,因为关于 java 中的 D-Bus 和关于 bluez 的文档很少。

对于 bluez,最后一个发行版中只有示例代码。

现在我已经编写了一个简单的脚本,将 bluez 版本更新到最新版本: https ://gist.github.com/tongo/94338cebf4e6367d353439bca8d0a376

我还发现了一篇关于 d-bus、java 和 bluez 的博客文章:http: //smartspacestuff.blogspot.it/2016/02/i-got-figurin-out-dbus-bluez.html

这很有用,但对我来说不是很清楚。

我希望这会有所帮助。

如果您发现其他文档,请发布它。

于 2016-10-09T17:12:22.563 回答
1

我认为目前没有明确或简单的答案。蓝牙集成需要不属于标准 JDK 的本机组件。

在 Linux 上使用蓝牙和 Java 最常用的库是BlueCove。BlueCove 提供了额外的原生库,用于在 linux 上使用蓝牙:BlueCove-GPLBlueCove-bluez(实验性)。但是,您可能需要自己编译其中一个以在您的 RPi 上使用。执行的方法将取决于您的发行版,并且需要一些重要的 linux 知识、编译本机代码等。快速的谷歌搜索显示了以前 RPi 版本的一些工作示例。不过,目前尚不清楚它是否可以与 RPi 3 上的 BLE 一起使用。

另一个可能是尝试使用“ Camel 蓝牙组件”,它是 Bluecove 的包装器,需要安装 libbluetooth-dev 和 blueman。但同样,不清楚它是否适用于 RPi 3。

如果无法使真正的集成正常工作,另一种选择可能是简单地从 Java 调用外部进程调用到您知道已经工作的命令行蓝牙实用程序。如果这是一个选项,这取决于您的用例,但我怀疑对于许多 BLE 特定用例来说可能就足够了。

于 2016-08-24T12:03:50.023 回答
0

您可以通过简单地通过运行时执行命令并使用 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 或一些库来扫描蓝牙设备。

来源:https ://www.mkyong.com/java/how-to-execute-shell-command-from-java/

于 2016-08-26T15:54:23.683 回答