Cơ chế hoạt động của giao diện HCI và quảng bá dữ liệu trong Bluetooth Low Energy

1. Tổng quan về giao diện HCI (Host Controller Interface)

HCI đóng vai trò là lớp giao tiếp chuẩn hóa, cho phép phần mềm (Host) tương tác với phần cứng Bluetooth (Controller). Bằng cách tuân thủ định dạng dữ liệu được định nghĩa trong đặc tả Bluetooth Core, các câu lệnh gửi qua giao diện này sẽ điều khiển hành vi trực tiếp của chip Bluetooth.

Trong hệ điều hành Linux, nhân (kernel) cung cấp Driver HCI và mở rộng thông qua các socket thuộc họ AF_BLUETOOTH. Điều này cho phép các ứng dụng ở tầng người dùng (user space) có thể gửi và nhận các gói tin thô (raw packets) với thiết bị ngoại vi. Các công cụ phổ biến như hcitool hay hciconfig đều được xây dựng dựa trên cơ chế socket này.


/* Ví dụ khởi tạo một kết nối socket HCI trong môi trường Linux */
int hci_sock_fd;

// Tạo raw socket để truy cập giao thức HCI
hci_sock_fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);

if (hci_sock_fd < 0) {
    perror("Lỗi khi mở HCI socket");
    return -1;
}

2. Phân tích các câu lệnh quảng bá (Advertising)

Các câu lệnh HCI được cấu trúc dựa trên OGF (Opcode Group Field) và OCF (Opcode Command Field). Đối với các lệnh điều khiển Bluetooth Low Energy (LE), giá trị OGF mặc định là 0x08.

Kích hoạt chế độ quảng bá

Sử dụng câu lệnh sau để bật/tắt việc phát tín hiệu quảng bá từ thiết bị:

# hcitool -i hci0 cmd 0x08 0x000a 01
  • 0x08: OGF dành cho LE Controller.
  • 0x000a: OCF của lệnh HCI_LE_Set_Advertise_Enable.
  • 01: Tham số kích hoạt (Enable). Sử dụng 00 nếu muốn dừng quảng bá (Disable).

Thiết lập dữ liệu quảng bá (Advertising Data)

Dữ liệu quảng bá được cấu trúc theo từng khối AD (Advertising Data). Mỗi khối bao gồm: Độ dài (1 byte) - Loại dữ liệu (1 byte) - Nội dung dữ liệu.

# hcitool -i hci0 cmd 0x08 0x0008 16 02 01 06 03 02 80 ff 0e 09 62 6c 65 5f 6e 61 6d 65 5f 5a 30 30 31

Giải mã cấu trúc lệnh trên:

  • 0x0008: OCF của lệnh HCI_LE_Set_Advertising_Data.
  • 16: Tổng độ dài của toàn bộ gói tin dữ liệu quảng bá (tính theo hex).
  • 02 01 06: Khối Flags (02 byte, loại 0x01, giá trị 0x06).
  • 03 02 80 ff: Khối Service UUID (03 byte, loại 0x02, giá trị 0xff80).
  • 0e 09 62...: Khối tên thiết bị (Local Name). Loại 0x09 đại diện cho tên đầy đủ, chứa chuỗi ký tự "ble_name_Z001".

3. Tầng GATT và truyền tải dữ liệu

GATT (Generic Attribute Profile) được xây dựng dựa trên giao thức ATT (Attribute Protocol), quy định cách thức mà hai thiết bị BLE trao đổi dữ liệu sau khi đã thiết lập kết nối. GATT phân chia thiết bị thành hai vai trò chính:

  • GATT Server: Thiết bị chứa dữ liệu (thường là cảm biến hoặc thiết bị ngoại vi).
  • GATT Client: Thiết bị truy xuất hoặc nhận thông báo từ Server (thường là điện thoại hoặc máy tính).

Trong bộ công cụ BlueZ, mã nguồn của btgatt-server.cbtgatt-client.c là những tài liệu tham khảo quan trọng để hiểu cách triển khai truyền nhận dữ liệu theo profile chuẩn (như cảm biến nhịp tim - Heart Rate Monitor).

Thẻ: bluetooth-low-energy hci bluez gatt embedded-linux

Đăng vào ngày 19 tháng 7 lúc 23:57