0

我正在寻找一种方法来 ping 一个BluetoothDevice我只知道 MAC 地址的遥控器。我想知道(至少每秒一次或更快)该设备是否仍在我的 Android 手机范围内。我无权访问其他设备(因此我无法创建客户端软件)。如果我不需要 root 手机并且可以使用标准 API 那就太好了。但如果没有其他可能,我可以想象它会扎根。

我已经找到了这个问题,但它并没有真正解决我的问题。

我已经尝试了一些方法:

  1. 定期进行 DeviceDiscovery
  2. hcitool -i hci0 inq --flush结合使用hcidump
  3. 使用l2ping

我什至尝试从BlueZ堆栈中提取重要的行,并使用 JNI 将它们本地实现到我的代码中。

我对这些想法的问题:

  1. 太慢(每台设备每 9-13 秒只能找到一次)
  2. 太慢了(在 linux pc 上要快很多。在 android-phone 上它和 1 一样慢。)
  3. 它比大多数设备要快一点,hcitool但在大多数设备上它需要配对

我的下一个想法如下:

我想为远程设备创建一个不安全的套接字并在其上执行ServiceDiscoveryping 操作。据我了解l2ping,几乎相同(仅在没有可用 API 功能的情况下进行名称解析)。但我真的不知道如何执行ServiceDiscovery. 我几乎从 Android 阅读了整个蓝牙 API,并尝试了类似createInsecureRfcommSocketToServiceRecord(UUID myUUID)不同 UUID 的东西,但我真的不知道我在做什么。

所以我有两个问题:

  1. 如何以编程方式执行远程ServiceDiscovery操作?BluetoothDevices
  2. 还有其他方法/想法,如何定期 ping 蓝牙设备?

编辑:

    mMyDevice = mBluetoothAdapter.getRemoteDevice(MY_MAC);
    mMyUUID = UUID.fromString("00001105-0000-1000-8000-00805F9B34FB");
    try {
        mBT_Socket = mMyDevice.createInsecureRfcommSocketToServiceRecord(mMyUUID);
        mBluetoothAdapter.cancelDiscovery();
        mBT_Socket.connect();
    }catch(Exception e){}
4

1 回答 1

0

我想在 ping 附近设备方面分享的一个想法是使用 OBEX Push UUID 向附近设备发送蓝牙请求。我不确定需要多长时间,但值得一试。在此方法中,您使用 RFComm Socket 创建到另一台设备上的 OBEX 服务器的连接。请注意,每个设备都有一个运行的本机 OBEX 服务器,可以接收 OBEX 推送请求。OBEX 推送 UUID 为“00001105-0000-1000-8000-00805F9B34FB”。

这样,如果附近的蓝牙设备不可用,您的客户端设备将无法连接到附近的设备,并且您可能会在 1-2 秒内断开连接。

您可以在此处注意两件事的时间范围 1. 如果附近的设备可用,需要多长时间才能建立连接?2. 需要多长时间才能知道您是否无法建立连接。如果蓝牙设备不可用?

于 2013-02-18T10:07:06.923 回答