有关HCI过滤器插座选项的详细信息?

2024-07-04 13:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用python的socket库测试一些基本的HCI命令时,似乎为了获得使用AF_BLUETOOTH和{}的套接字通信,需要在socket选项中设置“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结构定义为:

^{pr2}$

操作码掩码足够直接。{cd4{I}源于}代码:

/* 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{}s吗?第一个是HCI事件类型,第二个是子事件类型(即LE Meta事件)?在


Tags: fromimportraw事件socketfiltersockbluetooth
1条回答
网友
1楼 · 发布于 2024-07-04 13:24:32

所以,我在看noblesource,发现了这个:

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节中定义的常量值左移的位。在

相关问题 更多 >

    热门问题