我无法使用应用程序通过蓝牙将智能手机连接到我的覆盆子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,请执行以下操作:
我真的很想知道如何解决这个问题,所以任何帮助都会受到赞赏。
答案 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示例BluetoothChat是如何处理2个Android设备之间的双向通信的一个很好的例子。
Android蓝牙文档 https://developer.android.com/guide/topics/connectivity/bluetooth.html
蓝牙聊天示例 https://developer.android.com/samples/index.html。请注意,您只需选择文件&gt;即可查看此项目。新&gt;示例项目并在Android Studio中搜索蓝牙聊天。
使用此Python示例可以找到在raspberry pi上启动此类服务的处理:http://blog.davidvassallo.me/2014/05/11/android-linux-raspberry-pi-bluetooth-communication/。只是在线提供的众多样本中的一个。此示例包含Android代码。
如果你想使用C ++代码在raspberry Pi上实现这样的东西,我可以推荐http://people.csail.mit.edu/albert/bluez-intro/x502.html的文档。
该链接包含服务器和客户端的示例代码。由于这是使用RFCOMM规范和默认串行端口UUID,因此无需指定任何UUID。
如果你研究如何从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