我已经成功地将我的Android(6.0.1)手机(索尼Xperia Z3)与我的笔记本电脑(运行Ubuntu 14.04)配对。我可以来回发送文件。蓝牙连接菜单显示,如果发送了文件,连接开关将切换到ON。
我使用建立了持久连接
sudo rfcomm connect rfcomm0 [MAC ADDRESS] [CHANNEL]
我想通过蓝牙将数据从手机发送到笔记本电脑。如果我运行这个代码,开关也会打开,但会立即关闭连接(开关会回到OFF)。
Logcat在调用init()
:后显示以下警告
W/BluetoothAdapter:getBluetoothService()调用时没有蓝牙管理器回调
并且在调用write()
方法时出现此异常:
E/error:error init:java.io.io异常:读取失败,套接字可能关闭或超时,读取ret:-1
使用rfcomm
进行连接时,某些通道会失败并拒绝连接。我的猜测是我用错了频道。
- 调用
rfcomm
时,如何知道要使用哪个频道 - 如何在我的Android应用程序中指定此频道
- 我如何知道要使用哪个UUID
- 在示例代码中,使用了第一个UUID:为什么
不知怎么的,我无法让它与方法createRfcommSocketToServiceRecord
一起工作。
我当时所做的是删除:
ParcelUuid[] uuids = device.getUuids();
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuids[0].getUuid());
并将这些行替换为:
int channel = 1; // substitute with channel you are listening on
Method m = device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
BluetoothSocket socket = (BluetoothSocket) m.invoke(device, channel);
然后我发布了sudo rfcomm listen rfcomm0
,它显示了它在Linux终端上监听的频道,我终于可以连接了!
回答我自己的问题:
调用rfcomm时,如何知道要使用哪个通道
Linux终端在发布sudo rfcomm listen rfcomm0
时显示通道如何在我的Android应用程序中指定此频道
我使用反射访问的方法现在有这个参数(createRfcommSocket
)如何知道要使用哪个UUID
在此解决方案中没有。在示例代码中使用了第一个UUID:为什么
对于找到的解决方案来说无关紧要。