Bluez应用程序在PC上运行以侦听Android设备

时间:2012-06-03 18:38:04

标签: java android bluetooth rfcomm bluez

我想开发一个使用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中不起作用,所以我怎么做呢?

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

我已经用这种方式解决了:

对于使用SDP记录的PC端。我们必须将服务记录到一个必须免费的知名频道,我的意思是不被其他服务使用。要做它的命令:

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。

答案 1 :(得分:0)

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

我认为bluez不适用于Windows,你需要一个WIDCOMM或BlueSoleil堆栈,而bluecove会为你使用适当的堆栈。