禁用LE Set Scan Enable命令的“过滤重复项”设置

时间:2019-03-25 10:44:53

标签: bluetooth-lowenergy bluez

我想使用蓝牙的D-Bus接口通过HCI命令“ LE Set Scan Enable”在蓝牙控制器级别禁用“过滤重复项”设置。

我已经尝试从SetDiscoveryFilter(org.bluez.Adapter1)设置'DuplicateData'参数,但是根据btmon,这不会更改LE Set Scan Enable的'Filter重复项'的值。 我还阅读了有关“ bluetoothd”和“ main.conf”的手册页。

通过对比,我发现'hcitool lescan --duplicates'可以解决问题。

任何指针将不胜感激!

3 个答案:

答案 0 :(得分:1)

欢迎使用StackOverflow。发布问题时,发布使用的软件和硬件版本非常有用,因为这可以帮助您获得更好的答案。

关于您的问题,这取决于您使用的BlueZ的版本。假设这是当前的最新版本(v5.50),则可以使用低能耗扫描选项来禁用重复过滤器。请在此处查看文档:-

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt#n107

您还可以查看bluetoothctl命令中正在使用的内容。请看一下:-

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/client/main.c#n1390

如果要尝试此操作,可以按如下所示使用bluetoothctl命令:-

#bluetoothctl
[bluetoothctl] menu scan
[bluetoothctl] duplicate-data on
[bluetoothctl] back
[bluetoothctl] scan on

这将只返回一次广告,而重复的广告将被取消。

我希望这会有所帮助。

答案 1 :(得分:0)

非常感谢您的回答。我在上尝试了bluetoothctl命令 bluez 5.48和5.50并获得与我的D-Bus应用程序相同的结果。 无论“重复数据”设置(打开/关闭)如何,btmon / HCI始终 在“扫描”上显示“过滤重复项:已启用”

< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2      #5 [hci0] 10.895438
        Scanning: Enabled (0x01)
        Filter duplicates: Enabled (0x01)
> HCI Event: Command Complete (0x0e) plen 4                 #6 [hci0] 10.898311
      LE Set Scan Enable (0x08|0x000c) ncmd 2
        Status: Success (0x00)

真正令我困惑的是,禁用LE扫描(“扫描关闭”)也会禁用 过滤重复项...:-(

< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2     #21 [hci0] 14.969999
        Scanning: Disabled (0x00)
        Filter duplicates: Disabled (0x00)
> HCI Event: Command Complete (0x0e) plen 4                #22 [hci0] 14.973667
      LE Set Scan Enable (0x08|0x000c) ncmd 2
        Status: Success (0x00)

几次阅读doc / adapter-api.txt之后,我认为'DuplicateData' 过滤器仅适用于bluez本身,不适用于Bluetooth硬件, 但我可能错了

答案 2 :(得分:0)

使用bluez进行扫描的一个问题是,当前的Linux内核支持始终会打开广告的重复数据删除。请参阅linux-bluetooth邮件列表中的this thread-dhalbert's comment在GitHub上

即使您执行

SELECT [Case Number], [Doc Type], [Document Number], (
  SELECT  COUNT(*)  from [Document Tracker] AS tbl2 WHERE
(
   tbl1.[Doc Type] < tbl2.[Doc Type] AND
   tbl1.[Case Number] = tbl2.[Case Number] 
)
)
+1 AS Rank
FROM [Document Tracker] AS tbl1
ORDER BY [Case Number], [Doc Type] DESC , [Document Number];

或将sudo bluetoothctl menu scan duplicate-data on 传递到D-Bus API {"DuplicateData": true},内核驱动程序将在扫描开始时始终发送以下HCI命令:

SetDiscoveryFilter()

使用< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 Scanning: Enabled (0x01) Filter duplicates: Enabled (0x01) 绕过BT MGMT命令的内核解释,并发送适当的HCI命令(筛选重复项:Disabled(0x00))。

我的解决方法如下(comment on GitHub命令的来源):

hcitool lescan --duplicates

有关使用# This is executed every time after 'scan on' is executed in bluetoothctl. # First, disable ongoing scan enabled by bluetoothctl - if this is not executed # then next command to enable scanning will result in Command Disallowed (0x0c) # status. Fortunatelly, bluetoothctl seems not to be bothered by execution of # this commands. hcitool cmd 0x08 0x000C 0x00 0x00 # This results in # < HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 # Scanning: Disabled (0x00) # Filter duplicates: Disabled (0x00) # > HCI Event: Command Complete (0x0e) plen 4 # LE Set Scan Enable (0x08|0x000c) ncmd 1 # Status: Success (0x00) # Now, enable scanning with duplicate filtering disabled hcitool cmd 0x08 0x000C 0x01 0x00 # This results in # < HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 # Scanning: Enabled (0x01) # Filter duplicates: Disabled (0x00) # > HCI Event: Command Complete (0x0e) plen 4 # LE Set Scan Enable (0x08|0x000c) ncmd 1 # Status: Success (0x00) # and bluetoothctl now reports all packets, as if the 'duplicate-data on' # actually works as expected. Note: 'duplicate-data on' shall still be # executed to prevent additional layer of filtering in bluetoothd itself. + hcitool lescan --duplicates的其他解决方法,请选中hci_le_set_scan_enable

但是请注意,这两种解决方法都需要提升的特权。