1

我想开发一个使用 Linux 蓝牙 API Bluez 的应用程序,意味着允许 Android 设备发送和接收数据。

对于 PC 端,我查看了以下代码: http: //people.csail.mit.edu/albert/bluez-intro/x502.html 因为 Android 使用 RFCOMM 协议,或者我猜因为无法手动设置协议.

由于在 Android 中只能使用 Java API(Bluez API 锁定)并且 SDP 不能很好地工作,所以我必须使用这个调用:

InsecureBluetooth.createRfcommSocket(BlueDevice , Channel , false);

例如,当我将频道设置为 0xC (12) 时,这是命令返回的频道之一:

sdptool browse local | grep Channel

android应用程序可以正确连接到PC。

问题是我无法弄清楚允许两个应用程序通信的参数是什么。对于 PC 端,我只有一个值为 1 的端口号。对于 Android 端,我有一个分配给 SDP 可用服务的通道。但是 SDP 在 Android 中不起作用,所以我该怎么做呢?

任何帮助表示赞赏。谢谢

4

2 回答 2

1

我以这种方式解决了:

对于PC端使用SDP记录。我们必须将服务记录到必须免费的知名频道,我的意思是其他服务不使用。要检查它,请执行以下命令:

sdptool record local

执行此操作的代码位于http://people.csail.mit.edu/albert/bluez-intro/x604.html

4-9 节。描述服务

这两行必须在// 设置通用服务 ID之后添加

// set the service class ID
sdp_list_t service_class = {NULL, &svc_uuid};
sdp_set_service_classes( record, &service_class);

我们必须将频道更改为其他服务未使用的频道。例如频道 1 :

uint8_t rfcomm_channel = 1;

现在我们有一些东西可以监听 PC 端,我们必须通过众所周知的反射方法将 Android 设备直接连接到通道一,因为不幸的是,SDP 现在完全可以在 android 中工作。

Method bluetoothConnect;

bluetoothConnect = BlueDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class} );
CommunicationChannel = (BluetoothSocket) bluetoothConnect.invoke(BlueDevice, 1);

CommunicationChannel.connect();

当然BlueDevice是一个被startDiscovery()方法破坏的设备,“1”代表通道 1。

于 2012-06-11T09:27:36.633 回答
0

我知道这不能回答你的问题,我认为 bluecove (http://bluecove.org/) 会是更好的选择。它支持大多数操作系统,并为 Java 提供了不错的库。

我认为 bluez 不适用于 Windows,您需要 WIDCOMM 或 BlueSoleil 堆栈,而 bluecove 将为您使用适当的堆栈。

于 2012-06-03T18:56:14.597 回答