Когда я тестировал некоторые базовые команды HCI с использованием библиотеки socket
в python, кажется, что для получения любого трафика сокетов с использованием AF_BLUETOOTH
и BTPROTO_HCI
в параметрах сокетов должен быть установлен фильтр "Pass all":
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, определенная как:
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
s?Является ли 1-е для Типа события HCI и 2-м для Типа Субэвент (т.е. LE Meta Event)?