【问题标题】:How to connect to Raspberry pi with an android app over bluetooth如何通过蓝牙使用安卓应用程序连接到树莓派
【发布时间】:2016-03-19 09:17:27
【问题描述】:

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

我的情况:

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

我的目标:

我想开发一个应用程序,用户可以在其中通过蓝牙连接树莓派。应用应打开 RFCOMM 套接字,以便与 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)

总结:

所以,为了能够从安卓应用程序连接树莓派,我是:

  • 需要知道树莓派的 UUID 是什么,如果需要,我该如何找到?
  • 需要在我的 Android 应用中使用不同的方法吗?

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

【问题讨论】:

  • 我想知道您是否真的找到了解决问题的方法。我现在也有同样的需要;我需要通过蓝牙将我的 Android 应用程序连接到 Raspberry Pi。我正在使用 bluecove 蓝牙库。但我不知道如何获取 Raspberry Pi 的 UUID,也不知道在 Android 应用程序中应该如何处理它。你有什么想法吗?
  • 不,我还没有找到解决方案。如果我找到了,我会更新这个主题
  • 所以今天我决定继续尝试通过蓝牙连接我的树莓派和我的安卓手机......成功了!我用 uuid 再次尝试,我发现树莓派的 uuid i 是蓝牙设备的基本 uuid (0000XXXX-0000-1000-8000-00805F9B34FB),在 X 上具有 RFCOMM 特定的 16 位 uuid。我可以使用“sdptool browse local”在互联网和树莓派上找到它
  • 我也在寻找类似的应用程序希望通过蓝牙在 RPi 和 Android 之间进行通信。您能否分享您的 RPi 侧面示例我已经检查了基于命令的解决方案以使用 RFCOMM 进行通信,但不确定如何将其集成到应用程序中。在 RPi 方面,您是否使用过任何库来处理数据通信?

标签: android bluetooth raspberry-pi


【解决方案1】:

快速解答

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

设备地址 (ex: 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 的消息。

【讨论】:

    【解决方案2】:

    我认为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();
            }
    

    【讨论】:

      【解决方案3】:

      我在通过我的 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,这应该可以工作。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-31
          • 2013-04-09
          • 2015-11-28
          • 2021-03-06
          • 2017-03-30
          • 1970-01-01
          • 1970-01-01
          • 2014-08-31
          相关资源
          最近更新 更多