繁体   English   中英

如何使用 Android 应用程序通过蓝牙连接到 Raspberry pi

[英]How to connect to Raspberry pi with an android app over bluetooth

我无法使用应用程序通过蓝牙将智能手机连接到树莓派。

我的情况:

我正在开发一个基于树莓派的蓝牙可控应用程序。 我能够通过蓝牙连接到树莓派,并使用应用程序“蓝牙终端”通过 RFCOMM 套接字发送和接收数据。 树莓派一直在监听 RFCOMM 连接。

我的目标:

我想开发一个应用程序,用户可以在其中通过蓝牙连接树莓派。 该应用程序应打开 RFCOMM 套接字,以便它可以与 pi 进行通信。

我的问题:

我的应用程序无法连接到 raspberry pi,因为我不知道 raspberry pi 的 UUID,我认为这可能是问题所在。

我的代码:

我对 Java 编程很陌生,所以如果你看到任何奇怪的东西,请纠正我。 这是我试图连接的方法。

        public void BTConnect() {

    final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket = null;
    String RPi_MAC = "XX:XX:XX:XX:XX:XX";

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    // If there are paired devices
    if (pairedDevices.size() > 0) {

        // Loop through paired devices
        for (BluetoothDevice device : pairedDevices) {
            if (device.getAddress().equals(RPi_MAC)) {
                try {
                    socket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e0) {
                    Log.d("BT_TEST", "Cannot create socket");
                    e0.printStackTrace();
                }

                try {
                    socket.connect();
                } catch (IOException e1) {
                    try {
                        socket.close();
                        Log.d("BT_TEST", "Cannot connect");
                        e1.printStackTrace();
                    } catch (IOException e2) {
                        Log.d("BT_TEST", "Socket not closed");
                        e2.printStackTrace();
                    }
                }
            }
        }
    }
}

当我点击按钮连接时,这是android studio的输出:

   W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
   D/BT_TEST: Cannot connect
   W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
   W/System.err:     at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:599)
   W/System.err:     at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:610)
   W/System.err:     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:333)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity.BTConnect(MainActivity.java:80)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity$1.onClick(MainActivity.java:39)
   W/System.err:     at android.view.View.performClick(View.java:4856)
   W/System.err:     at android.view.View$PerformClick.run(View.java:19956)
   W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
   W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
   W/System.err:     at android.os.Looper.loop(Looper.java:211)
   W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5373)
   W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
   W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
   W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
   W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

总结:

因此,为了能够从 android 应用程序连接到树莓派,我应该:

  • 需要知道 raspberry pi 的 UUID 是什么,如果是,我怎么知道?
  • 需要在我的 android 应用程序中使用不同的方法吗?

我真的很想知道如何解决这个问题,所以任何帮助将不胜感激。

快速回答

与您开始时的方式类似,蓝牙连接需要设备地址服务 UUID

设备地址(例如: 00:72:02:97:33:2C )可以从配对设备(或通过允许发现)获取,有关更多信息,请参阅 Android 示例应用程序。

UUID(例如:00001101-0000-1000-8000-00805F9B34FB )通常定义在使用特定标识符运行蓝牙服务的服务器部分。

现在,如果您想避免最后一部分而只想传达简单的数据,则可以使用蓝牙串行端口来依赖默认设置。 来自 Android 蓝牙文档:

提示:如果您连接到蓝牙串行板,请尝试使用众所周知的 SPP UUID 00001101-0000-1000-8000-00805F9B34FB。 但是,如果您要连接到 Android 对等点,请生成您自己的唯一 UUID。

更多信息

Android 文档和示例代码

android 示例 BluetoothChat 是一个很好的示例,说明如何处理 2 个 android 设备之间的 2 路通信。

Android 蓝牙文档https://developer.android.com/guide/topics/connectivity/bluetooth.html

蓝牙聊天示例https://developer.android.com/samples/index.html 请注意,您只需选择 File > New > Sample Project 并在 Android Studio 中搜索 Bluetooth Chat,即可查看此项目。

从 Android 到 Raspberry Pi 的蓝牙连接(Python 和 Android 代码)

可以使用以下 Python 示例在树莓派上启动此类服务: http : //blog.davidvassallo.me/2014/05/11/android-linux-raspberry-pi-bluetooth-communication/ 只是在线提供的众多示例之一。 此示例包含 Android 代码。

对串行端口使用默认 UUID(C++ 代码)

如果你想使用 C++ 代码在树莓派上实现这样的事情,我可以推荐来自http://people.csail.mit.edu/albert/bluez-intro/x502.html的文档。

该链接具有服务器和客户端的示例代码。 由于这是使用 RFCOMM 规范和默认串行端口 UUID,因此无需指定任何 UUID。

BlueTerm Android 开源应用程序(Android 代码)

如果您研究如何从 android 连接到它,您可能最终会找到 BlueTerm android 应用程序。 这是一个开源应用程序,因此您可以在https://github.com/johnhowe/BlueTerm/tree/master/src/es/pymasde/blueterm找到所有源代码。 您可以在那里找到此串行端口服务的 UUID:

private static final UUID SerialPortServiceClass_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

完整的 BluetoothSerialService 类是管理蓝牙连接的好方法,包括处理返回 UI 的消息。

我认为linux使用蓝牙需要指定连接端口。

      try {
            Method m = remoteDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            try {
                BluetoothSocket tmp = (BluetoothSocket)m.invoke(remoteDevice, 1);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

我在通过我的 android 应用程序连接到 raspberrypi3 蓝牙时遇到了类似的问题。 首先在你的pi命令提示符下一一执行以下命令:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install bluetooth blueman bluez
sudo reboot
sudo apt-get install python-bluetooth

执行上述命令后,将应用程序的蓝牙与 pi 的蓝牙配对。 现在您需要将 SP 配置文件添加到 Pi。 编辑此文件:

在 pi 命令提示符下执行以下命令:

sudo nano /etc/systemd/system/dbus-org.bluez.service

将打开一个文件并在“ExecStart=”行的末尾添加兼容性标志“-C”。 在此之后添加一个新行以添加 SP 配置文件。 这两行应该是这样的:

ExecStart=/usr/lib/bluetooth/bluetoothd -C

ExecStartPost=/usr/bin/sdptool add SP

保存并重新启动您的 pi,这应该可以工作。

您不需要知道 uuid,您必须设置要在客户端和服务器上使用的 uuid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM