gpt4 book ai didi

python - 有关 HCI 过滤器 socket 选项的详细信息?

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:02 42 4
gpt4 key购买 nike

当我使用 python 的 socket 库测试一些基本的 HCI 命令时,似乎为了使用 AF_BLUETOOTHBTPROTO_HCI 获取任何套接字流量> 需要在套接字选项中设置“全部通过”过滤器:

from socket import socket, AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI, SOL_HCI, HCI_FILTER
from struct import pack

PASS_ALL = pack("IIIh2x", 0xffffffff, 0xffffffff, 0xffffffff, 0)

def open_socket_with_hci(dev_id: int):
hci = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
hci.bind((dev_id,))
hci.setsockopt(SOL_HCI, HCI_FILTER, PASS_ALL)
return hci

我找到了 hci_filter结构定义为:

struct hci_filter {
uint32_t type_mask;
uint32_t event_mask[2];
uint16_t opcode;
};

操作码掩码非常简单。我假设 type_mask 是值的掩码(来自 hci.h 的代码):

/* HCI data types */
#define HCI_COMMAND_PKT 0x01
#define HCI_ACLDATA_PKT 0x02
#define HCI_SCODATA_PKT 0x03
#define HCI_EVENT_PKT 0x04
#define HCI_DIAG_PKT 0xf0
#define HCI_VENDOR_PKT 0xff

但是有人可以解释一下 2x event_mask 吗?第一个是 HCI 事件类型,第二个是子事件类型(即 LE 元事件)?

最佳答案

所以,我正在查看 noble source并发现了这个:

Hci.prototype.setSocketFilter = function() {
var filter = new Buffer(14);
var typeMask = (1 << HCI_COMMAND_PKT) | (1 << HCI_EVENT_PKT) | (1 << HCI_ACLDATA_PKT);
var eventMask1 = (1 << EVT_DISCONN_COMPLETE) | (1 << EVT_ENCRYPT_CHANGE) | (1 << EVT_CMD_COMPLETE) | (1 << EVT_CMD_STATUS);
var eventMask2 = (1 << (EVT_LE_META_EVENT - 32));
var opcode = 0;

filter.writeUInt32LE(typeMask, 0);
filter.writeUInt32LE(eventMask1, 4);
filter.writeUInt32LE(eventMask2, 8);
filter.writeUInt16LE(opcode, 12);

debug('setting filter to: ' + filter.toString('hex'));
this._socket.setFilter(filter);
};

因此,掩码定义为蓝牙核心第 2 卷 E 部分第 5 节和第 7 节中定义的常量值左移的位。

关于python - 有关 HCI 过滤器 socket 选项的详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53857864/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com