Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测Android上的可连接设备是否可连接_Android_Bluetooth Lowenergy - Fatal编程技术网

检测Android上的可连接设备是否可连接

检测Android上的可连接设备是否可连接,android,bluetooth-lowenergy,Android,Bluetooth Lowenergy,我正在做一个配置信标的项目。在通电后的一定时间内,信标将变得不可配置,直到其重新通电。为了显示可配置信标的列表,我查看了某些特征(蓝牙设备名称、广告包中的某些制造商数据)。我还需要知道它是否“可连接”,即。E如果设备的可连接广告数据包中的PDU类型指示其可连接。我在安卓4.X和5.X上搜索了安卓蓝牙类的高低,但没有找到任何能告诉我这些信息的东西 我意识到确定信标可连接性的一种方法是连接到它,例如。g、 :device.connectGatt(…)。然而,我看到有时在回调到onConnection

我正在做一个配置信标的项目。在通电后的一定时间内,信标将变得不可配置,直到其重新通电。为了显示可配置信标的列表,我查看了某些特征(蓝牙设备名称、广告包中的某些制造商数据)。我还需要知道它是否“可连接”,即。E如果设备的可连接广告数据包中的PDU类型指示其可连接。我在安卓4.X和5.X上搜索了安卓蓝牙类的高低,但没有找到任何能告诉我这些信息的东西

我意识到确定信标可连接性的一种方法是连接到它,例如。g、 :
device.connectGatt(…)
。然而,我看到有时在回调到
onConnectionStateChange
并返回
STATE\u DISCONNECTED
之前需要两分钟以上的时间。此外,在一个环境中可能有许多这样的信标,连接到每一个可以配置的信标将是低效的

此属性的iOS等效项可以在
cbentralmanagerdelegate
回调方法
centralManager:didDiscoveryPeripal:advertisementData:RSSI
中的键
CBAdvertisementDataIsConnectable
下的
advertisementData
字典中找到


所以,问题是:Android上有没有一种方法可以从广告数据、扫描结果或……来确定可连接设备是否“可连接”

更新:在Android O SDK中的最终API中,
ScanResult
类(自Android 5.0开始添加)现在有了
isConnectable()方法。只能在Android 8.0+上检测可连接广告。有关更多信息,请参见此处:

不幸的是,在Android 8.0之前,这是不可能的

可连接播发由PDU头字节0确定。您可以在下面的示例结构中看到这一点:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac
问题是在Anroid 8.0之前的设备上,Android扫描API不允许您访问这些标题。Android 4.x的回调中正好有三个字段:

onLeScan(BluetoothDevice device, rssi, byte[] scan data)
扫描数据字节数组在上述头字节之后开始。从我看到的
BluetoothDevice
定义来看,没有任何字段或方法告诉您它是否是可连接的广告——该类只是bluetooth mac地址的容器,其中包含在bluetooth堆栈上执行功能的方法。而且,
IBluetooth.aidl
是蓝牙堆栈的专用接口(以及
BluetoothDevice
调用什么来获取其信息),其中没有任何方法可以获取此标志


在Android 8.0之前,这些信息似乎没有从BlueDroid堆栈传递到Java层。

这应该是可能的,因为Nordic的nRF主控制面板会这样做

经过一些挖掘,我想我知道它是如何做到这一点的。但我不确定这是不是正确的方法

我尝试使用并将设备设置为可连接。在Nordic应用程序中,根据scanResult.getFlags()中找到的字节,设备被设置为可连接

我发现此代码适用于我的设备:

int flags = scanResult.getScanRecord().getAdvertiseFlags();
if ((flags & 2) == 2) {
  //connectable
}

鉴于你的断言与我自己的发现一致,我认为这里的答案是没有答案-(这在Android OInteresting中现在是可能的。
ScanRecord
对象是在Android 5.0中添加的。你知道nRF主控制面板是否只在Android 5+设备上执行此操作吗?如果它在Android 4.x设备上工作,它必须有另一种方式。我无法复制这些结果。我在Nexus 9扫描RadBeacon USB时测试了这一点使用Android 5 BLE API。我将RadBeacon置于可连接模式(使用TI CC2540扫描仪进行验证),Android
scanResult.getScanRecord().getAdvertiseFlags()
返回6。然后我将RadBeacon USB更改为不可连接模式(再次使用扫描仪进行验证),并
scanResult.getScanRecord().getAdvertiseFlags()
仍然返回6。为了进一步确认这不仅仅是缓存问题,我关闭/打开了蓝牙,然后插入了信标。它仍然返回6。根据我的经验,对于“可连接”标志似乎存在某种分歧,规范对此并不完全清楚(或者我只是没有找到一个完整的定义)。我曾与CSR信标合作,如果将LE discoverable mode标志设置为true,它也会显示为可连接,而Bluegiga信标的可发现模式标志对可连接标志没有影响。如果您尝试北欧应用程序,您可能会发现您的RadBeacon显示为可连接。是的,我相信北欧应用程序works on我对此做了更多的研究,发现了这个标志值返回的内容。它是广告中标志广告块的字节值,它不会告诉你设备是否可连接。它告诉你设备是否可发现,这是一个非常不同的事情。位值是:位0 LE有限可发现模式bit 1 LE通用可发现模式位2 BR/EDR不支持位3同时LE和BR/EDR到同一设备(控制器)位4同时LE和BR/EDR到同一设备(主机)我可以确认nRF应用程序显示连接按钮,即使是已知为不可连接广告的设备。这是在Android 6.0.1上,nRF应用程序版本为4.0.1