11.3. Radio và tầng liên kết¶
Hai tầng dưới cùng của ngăn xếp BLE gần như hoàn toàn tự động từ góc độ Python -- silicon radio và các tầng mà MicroPython chạy trên đó xử lý mọi thứ từ việc chọn kênh đến truyền lại gói tin bị mất. Ba trong số các lựa chọn mà chúng thực hiện vẫn hiển thị qua API hướng người dùng: công suất, tầm xa và thông lượng.
11.3.1. Radio¶
BLE sử dụng cùng băng tần 2.4 GHz Industrial-Scientific-Medical (ISM) như Wi-Fi, lò vi sóng và hầu hết các thiết bị không dây tầm ngắn khác. Băng tần được chia thành 40 kênh rộng 2 MHz.
Ba trong số 40 kênh được dành riêng cho quảng bá -- các thông báo ngắn thông báo sự hiện diện của thiết bị cho bất kỳ ai đang nghe. Chúng được phân bổ khắp băng tần để một thiết bị nghe có thể quét nhanh cả ba và do đó sự can thiệp trên bất kỳ kênh nào cũng khó làm thiết bị mất kết nối hoàn toàn.
Ba mươi bảy kênh là các kênh dữ liệu. Khi hai thiết bị kết nối, chúng trao đổi các gói tin trên các kênh này, nhảy giữa chúng theo một chuỗi giả ngẫu nhiên mà hai bên đồng ý vào thời điểm kết nối. Adaptive frequency hopping cho phép một trong hai bên đánh dấu một kênh là xấu (can thiệp Wi-Fi nặng, lò vi sóng, mạng BLE lân cận) để chuỗi bỏ qua nó.
40 kênh BLE trên băng tần 2.4 GHz. Ba kênh dùng để quảng bá, phần còn lại mang lưu lượng trên kết nối mở.¶
Radio phát các gói tin ngắn -- dài nhất là vài mili giây -- và ngủ giữa các lần phát. Giấc ngủ đó là thứ làm cho công nghệ này có năng lượng thấp. Một peripheral BLE điển hình dành dưới một phần trăm thời gian của nó thực sự phát; phần còn lại là radio tắt nguồn giữa các sự kiện đã lên lịch.
11.3.2. Tầng liên kết¶
Tầng liên kết là đơn vị nhỏ nhất của BLE giao tiếp với đối tác trên một thiết bị khác. Nó xử lý bốn công việc.
Đóng khung gói tin. Mỗi gói tin mang một header ngắn (địa chỉ truy cập kênh, độ dài gói tin, các bit điều khiển), một payload và một CRC. Bộ nhận kiểm tra CRC và loại bỏ bất kỳ thứ gì bị hỏng.
Địa chỉ. Mỗi thiết bị BLE có một địa chỉ thiết bị 48-bit xác định nó trên radio. Một số là public -- một định danh phần cứng mà nhà sản xuất đã gán, có thể truy xuất mãi mãi. Một số là random -- được tạo trên thiết bị, xoay vòng định kỳ và tùy chọn được mã hóa để kẻ nghe trộm không thể liên kết hai lần truyền với cùng một phần cứng vật lý. Địa chỉ xuất hiện lại trong Quảng bá và quét.
Lập lịch kết nối. Khi hai thiết bị kết nối, tầng liên kết lên lịch các sự kiện radio định kỳ trên chuỗi nhảy -- cách nhau một khoảng thời gian kết nối cố định -- và đóng gói bất kỳ dữ liệu nào đang xếp hàng từ tầng GATT bên trên vào mỗi sự kiện. Cả hai bên ngủ giữa các sự kiện. Khoảng thời gian kết nối là một thông số mà ứng dụng có thể yêu cầu (xem Kết nối).
Độ tin cậy. Mỗi gói tin trên một kết nối được xác nhận bởi phía kia. Tầng liên kết truyền lại bất kỳ thứ gì không nhận được phản hồi, do đó các tầng bên trên nhìn thấy một luồng byte có thứ tự, không mất dữ liệu. Không giống như UDP -- gửi gói tin, hy vọng điều tốt nhất ở phía mạng, BLE không có chế độ không đáng tin cậy riêng biệt trong sử dụng thông thường -- mỗi gói tin trên một kết nối mở đều được thử lại cho đến khi đến nơi hoặc liên kết được tuyên bố là mất.
Tầng liên kết cũng là nơi mã hóa chạy khi một cặp thiết bị đã đồng ý về một khóa trong quá trình ghép đôi (xem Ghép nối và liên kết). Mỗi gói tin trên một liên kết được mã hóa đều được giải mã tại bộ nhận trước khi các tầng bên trên thấy nó.
11.3.4. Những gì Python nhìn thấy từ tất cả điều này¶
Gần như không có gì. Các API bluetooth và aioble không hiển thị các kênh, chuỗi nhảy, CRC gói tin hay bộ định thời truyền lại; tất cả những thứ đó đều được xử lý bên trong cổng BLE và radio. Các phần có hiện ra là những phần mà việc thương lượng thời điểm kết nối hiển thị -- khoảng thời gian kết nối, MTU, loại địa chỉ.