我想使用蓝牙的D-Bus接口通过HCI命令“ LE Set Scan Enable”在蓝牙控制器级别禁用“过滤重复项”设置。
我已经尝试从SetDiscoveryFilter(org.bluez.Adapter1)设置'DuplicateData'参数,但是根据btmon,这不会更改LE Set Scan Enable的'Filter重复项'的值。 我还阅读了有关“ bluetoothd”和“ main.conf”的手册页。
通过对比,我发现'hcitool lescan --duplicates'可以解决问题。
任何指针将不胜感激!
答案 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。
但是请注意,这两种解决方法都需要提升的特权。