11.5. Kết nối¶
Khi một thiết bị trung tâm (central) chọn một thiết bị ngoại vi (peripheral) từ luồng quảng bá và gửi cho nó một yêu cầu kết nối, cả hai bên rời khỏi chế độ quảng bá / quét và chuyển sang kết nối. Radio lúc này lên lịch hoạt động trên các kênh dữ liệu của tầng liên kết, nhảy giả ngẫu nhiên giữa chúng theo thứ tự đã thỏa thuận lúc thiết lập kết nối. Mọi thứ phía trên tầng liên kết -- GATT, bảo mật, L2CAP -- đều chạy trên kết nối được thiết lập ở đây.
11.5.1. Sự kiện kết nối¶
Hai thiết bị trong một kết nối BLE không truyền dữ liệu liên tục. Chúng thỏa thuận một khoảng thời gian kết nối, và tại mỗi khoảng đó cả hai bên đều bật radio, trao đổi các gói tin đang xếp hàng, xác nhận những gì đã nhận được rồi quay về trạng thái ngủ. Mỗi lần trao đổi như vậy được gọi là một sự kiện kết nối.
Radio ở mỗi bên chỉ hoạt động trong suốt các sự kiện kết nối ngắn ngủi, mọi thứ còn lại đều ở trạng thái ngủ. Thiết bị ngoại vi có thể bỏ qua các sự kiện theo độ trễ ngoại vi.¶
Các con số điều chỉnh điều này được thỏa thuận lúc kết nối và tầng liên kết thực thi chúng. Chúng hiển thị với ứng dụng cả dưới dạng các nút điều chỉnh phía yêu cầu lẫn các giá trị kết quả được báo cáo lại.
Khoảng thời gian kết nối. Từ 7,5 ms đến 4 s, theo bước 1,25 ms. Thiết bị trung tâm chọn giá trị mà thiết bị ngoại vi yêu cầu trừ khi yêu cầu đó không hợp lý. Khoảng thời gian ngắn hơn truyền dữ liệu với độ trễ thấp hơn nhưng tốn nhiều hoạt động radio hơn; khoảng dài hơn tiết kiệm điện nhưng làm mỗi vòng đi về chậm hơn.
Độ trễ ngoại vi. Một số nguyên không âm N. Thiết bị ngoại vi được phép bỏ qua tối đa N sự kiện kết nối khi không có gì để gửi, tiếp tục ngủ thay vì bật radio cho một lần trao đổi trống. Hữu ích cho các cảm biến thức dậy để báo cáo mỗi giây nhưng muốn một khoảng thời gian kết nối phản hồi nhanh thấp cho các tin nhắn tức thì hiếm gặp.
Thời gian giám sát tối đa. Từ 100 ms đến 32 s. Nếu một trong hai bên không nghe thấy gì từ bên kia trong khoảng thời gian này, liên kết được coi là mất và cả hai bên quay lại chế độ quảng bá / quét. Thời gian giám sát phải dài hơn
connection_interval * (1 + peripheral_latency)-- tầng liên kết từ chối các giá trị vi phạm điều đó.
aioble.Device.connect() nhận min_conn_interval_us và max_conn_interval_us để thiết bị trung tâm có thể yêu cầu một phạm vi cụ thể; giá trị thực tế mà radio đã chốt có thể được đọc lại thông qua cấu hình tầng liên kết sau khi kết nối được thiết lập.
11.5.2. Ý nghĩa của "central" và "peripheral" trong một kết nối¶
Các vai trò được thiết lập lúc quảng bá vẫn giữ nguyên sau khi kết nối được thiết lập:
Thiết bị trung tâm điều khiển thời gian -- nó sở hữu phía master của chuỗi nhảy kênh và các sự kiện kết nối.
Thiết bị ngoại vi phản ứng theo. Nó có thể yêu cầu thay đổi các tham số kết nối (chẳng hạn khoảng thời gian chậm hơn để tiết kiệm điện) nhưng thiết bị trung tâm quyết định có chấp nhận hay không.
Các vai trò độc lập với việc ai lưu trữ cơ sở dữ liệu GATT, đây là một trục riêng biệt. Theo quy ước, thiết bị ngoại vi cũng là máy chủ GATT và thiết bị trung tâm là máy khách GATT, nhưng BLE cho phép bên nào cũng có thể lưu trữ các dịch vụ GATT. Camera hầu như luôn tuân theo quy ước: ngoại vi + máy chủ cho các ứng dụng "camera xuất bản dữ liệu", trung tâm + máy khách cho các ứng dụng "camera đọc từ cảm biến".
11.5.3. Đơn vị truyền tối đa (MTU)¶
Tầng liên kết mang các gói tin ngắn theo mặc định -- 27 byte tải trọng, trong đó chỉ 23 byte khả dụng cho GATT. Điều đó đủ cho một lần đọc nhỏ hoặc một lệnh ngắn nhưng rất nhỏ so với bất kỳ thứ gì nhiều byte. Cả hai bên có thể thỏa thuận tăng giá trị này lên, đến giới hạn mà firmware radio hỗ trợ (thường vài trăm byte trên các bộ điều khiển hiện đại).
API aioble thực hiện việc thỏa thuận thông qua aioble.DeviceConnection.exchange_mtu() và kết quả trở nên khả dụng trên thuộc tính mtu. MTU lớn hơn đồng nghĩa với ít vòng đi về hơn cho bất kỳ giá trị nào lớn hơn ~20 byte, với một chi phí nhỏ về bộ nhớ đệm.
11.5.4. Vòng đời¶
Một kết nối tồn tại cho đến khi một trong các điều sau xảy ra:
một trong hai bên gọi
disconnect(),thời gian giám sát tối đa hết hạn (ngoài phạm vi, tắt radio, thiết bị đồng nghiệp bị lỗi), hoặc
một lỗi tầng liên kết rõ ràng (không khớp mã hóa, từ chối ghép đôi).
Khi kết nối bị mất, mọi thao tác GATT đang xếp hàng hoặc đang thực hiện trên đó đều phát sinh aioble.DeviceDisconnectedError, và mọi khối async with connection mà ứng dụng đang ở trong đó sẽ thoát sạch sẽ. Một thiết bị ngoại vi thường phản hồi bằng cách quay lại aioble.advertise() và chờ thiết bị trung tâm tiếp theo; một thiết bị trung tâm phản hồi bằng cách quét lại hoặc hiển thị thông tin ngắt kết nối cho ứng dụng.
Vòng đời là một trong những lý do khiến aioble hữu ích. Một API BLE đồng bộ sẽ phải cung cấp các hàm gọi lại ngắt kết nối và mặt nạ sự kiện; phiên bản asyncio biến các ngắt kết nối thành các ngoại lệ bên trong coroutine đang chờ thao tác, đây chính là mục đích của việc dọn dẹp async with.