我想开发一个使用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中不起作用,所以我怎么做呢?
感谢任何帮助。感谢
答案 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会为你使用适当的堆栈。