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

时间:2016-03-19 09:17:27

标签: android bluetooth raspberry-pi

我无法使用应用程序通过蓝牙将智能手机连接到我的覆盆子pi。

我的情况:

我正在开发一种基于覆盆子pi的蓝牙可控应用程序。我可以通过蓝牙连接到树莓派,并使用应用程序“蓝牙终端”通过RFCOMM插槽发送和接收数据。树莓派不断收听RFCOMM连接。

我的目标:

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

我的问题:

我的应用程序无法连接到覆盆子pi,因为我不知道覆盆子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应用程序中使用不同的方法吗?

我真的很想知道如何解决这个问题,所以任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:8)

快速回答

与您的启动方式类似,蓝牙连接需要设备地址服务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文档&amp;示例代码

android示例BluetoothChat是如何处理2个Android设备之间的双向通信的一个很好的例子。

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

蓝牙聊天示例 https://developer.android.com/samples/index.html。请注意,您只需选择文件&gt;即可查看此项目。新&gt;示例项目并在Android Studio中搜索蓝牙聊天。

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

使用此Python示例可以找到在raspberry pi上启动此类服务的处理:http://blog.davidvassallo.me/2014/05/11/android-linux-raspberry-pi-bluetooth-communication/。只是在线提供的众多样本中的一个。此示例包含Android代码。

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

如果你想使用C ++代码在raspberry Pi上实现这样的东西,我可以推荐http://people.csail.mit.edu/albert/bluez-intro/x502.html的文档。

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

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

如果你研究如何从android连接到这个,你可能最终会找到BlueTerm安卓应用程序。这是一个开源应用,因此您可以在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。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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