通过蓝牙将数据从手机发送到笔记本电脑



我已经成功地将我的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:为什么
    对于找到的解决方案来说无关紧要。

相关内容

  • 没有找到相关文章

最新更新