Tính năng đồng thời STA/STA của Wi-Fi

Android 12 giới thiệu tính năng đồng thời STA/STA Wi-Fi, cho phép các thiết bị kết nối đồng thời với 2 mạng Wi-Fi. Tính năng không bắt buộc này cho phép các chức năng sau.

  • Kết nối trước khi ngắt: Thiết bị kết nối với một mạng Wi-Fi mới trước khi ngắt kết nối hiện có. Điều này giúp quá trình chuyển đổi mượt mà hơn khi chuyển đổi giữa các mạng Wi-Fi
  • Kết nối đồng thời chỉ cục bộ và kết nối Internet: Thiết bị kết nối với mạng chỉ cục bộ mà không làm gián đoạn kết nối chính cung cấp Internet của thiết bị.
  • Kết nối Internet và mạng bị hạn chế đồng thời: Thiết bị kết nối với một mạng bị hạn chế (chỉ dành cho một số ứng dụng đặc quyền) mà không làm gián đoạn kết nối chính cung cấp Internet của thiết bị.
  • (Android 13 trở lên) Nhiều mạng đồng thời có kết nối Internet: Thiết bị kết nối với 2 mạng, cả hai mạng này đều không bị hạn chế và có sẵn cho tất cả ứng dụng, đồng thời cung cấp khả năng kết nối Internet.

Trang này mô tả hành vi của thiết bị khi tính năng này được bật và thông tin chi tiết về việc triển khai cho các nhà sản xuất và nhà cung cấp thiết bị.

Triển khai

Để triển khai tính năng đồng thời Wi-Fi STA/STA, các thiết bị phải hỗ trợ những nội dung sau:

  • Vi mạch hoặc chương trình cơ sở Wi-Fi phải hỗ trợ 2 kết nối STA đồng thời. Firmware phải hỗ trợ tất cả các tổ hợp kênh và băng tần cho cả hai kết nối. Để tránh các vấn đề về hiệu suất, bạn nên sử dụng chip Wi-Fi có khả năng DBS 2x2+2x2.

  • Thiết bị phải hỗ trợ các API sau trong quá trình triển khai AIDL hoặc HIDL của IWifiChip.

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • Tổ hợp giao diện Wi-Fi HAL phải có 2 giao diện STA đồng thời được hiển thị bằng cách sử dụng định dạng quy cách như [{STA} <= 2, ...]. Để biết thêm thông tin, hãy xem bài viết Khả năng truy cập đồng thời vào nhiều giao diện Wi-Fi.

Nếu đáp ứng các điều kiện tiên quyết đó, hãy triển khai tính đồng thời STA/STA Wi-Fi bằng cách thực hiện như sau:

  1. Bật riêng lẻ một hoặc nhiều hàm bằng cách sử dụng lớp phủ tài nguyên thời gian chạy (tắt theo mặc định).

    • Make-before-break (Kết nối trước khi ngắt): config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
    • Kết nối đồng thời chỉ cục bộ và kết nối Internet: config_wifiMultiStaLocalOnlyConcurrencyEnabled
    • Đồng thời bị hạn chế và kết nối Internet: config_wifiMultiStaRestrictedConcurrencyEnabled
    • Nhiều mạng đồng thời có kết nối Internet: config_wifiMultiStaMultiInternetConcurrencyEnabled
  2. Xác thực từng cách triển khai như mô tả trong các phần tương ứng.

Để hỗ trợ tốt hơn khả năng đồng thời STA/STA Wi-Fi, các khung và ứng dụng do OEM tuỳ chỉnh nên sử dụng phương thức NetworkCallback#onCapabilitiesChanged() thay vì WifiManager#getConnectionInfo(). Phương thức này chỉ trả về WifiInfo cho một mạng duy nhất và đã ngừng hoạt động trong Android 12. Để biết thêm thông tin, hãy xem Wi-Fi Network Request API cho kết nối ngang hàng.

Make-before-break

Hàm make-before-break cho phép các thiết bị kết nối với một mạng Wi-Fi mới trong khi vẫn duy trì kết nối mạng Wi-Fi hiện có, chỉ ngắt kết nối khỏi mạng cũ khi kết nối thành công với mạng Wi-Fi mới và có quyền truy cập vào Internet.

Trường hợp sử dụng tạo trước khi ngắt giải quyết các vấn đề sau trong Android 11 trở xuống, trong đó thiết bị phải ngắt kết nối khỏi mạng Wi-Fi hiện có trước khi kết nối với một mạng mới (ngắt trước khi tạo).

  • Khi kết nối với một mạng mới, thiết bị có thể phát hiện thấy mật khẩu Wi-Fi đã lưu không chính xác hoặc mạng mới không có quyền truy cập vào Internet. Điều này buộc thiết bị chuyển về mạng cũ, dẫn đến việc thiết bị không có kết nối Wi-Fi trong một khoảng thời gian đáng kể.

  • Mạng cũ bị ngắt kết nối đột ngột, tức là tất cả các ổ cắm đều bị đóng. Các ứng dụng thường không phản ứng tốt khi mất kết nối đột ngột và điều này có thể khiến người dùng không có kết nối Internet trong vài giây cho đến khi kết nối mới được thiết lập hoàn toàn.

  • Mạng mặc định sẽ thay đổi hai lần, từ mạng Wi-Fi cũ sang mạng di động, sau đó từ mạng di động sang mạng Wi-Fi mới. Điều này khiến các ứng dụng phản ứng với các thay đổi về mạng hai lần. Thiết bị cũng phải sử dụng dữ liệu di động trong một khoảng thời gian ngắn.

Quy trình tạo trước khi ngắt chỉ được dùng cho các hoạt động chuyển đổi mạng Wi-Fi tự động do hệ điều hành khởi tạo. Các hoạt động chuyển đổi mạng do người dùng khởi tạo sử dụng quy trình ngắt kết nối trước khi kết nối cũ, trong đó mạng trước đó sẽ bị ngắt kết nối hoàn toàn trước khi mạng mới được kết nối. Trong một số trường hợp, quy trình ngắt trước khi tạo được dùng ngay cả trong các hoạt động chuyển đổi tự động do hệ điều hành khởi tạo, chẳng hạn như khi chuyển đổi giữa 2 mạng được định cấu hình để dùng địa chỉ MAC của nhà máy.

Các ứng dụng có thể kiểm tra xem trường hợp sử dụng này có được hỗ trợ trên thiết bị hay không bằng cách dùng API WifiManager#isMakeBeforeBreakWifiSwitchingSupported().

Xác thực hoạt động tạo trước khi ngắt

Để xác thực việc triển khai, hãy kích hoạt tính năng tự động chuyển đổi mạng Wi-Fi (bằng cách đảm bảo có sẵn một mạng có cường độ tín hiệu mạnh hơn mạng đã kết nối) và xác minh rằng thiết bị duy trì kết nối hiện có trong khi kết nối với mạng mới. Để xem trạng thái của cả hai giao diện Wi-Fi và xác minh rằng cả hai đều được kết nối, hãy dùng lệnh sau.

adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status

Nếu mạng mới không có kết nối, thiết bị sẽ cố gắng kết nối với mạng đó, đồng thời duy trì kết nối với mạng hiện có và huỷ bỏ nỗ lực khi phát hiện thấy mạng mới không có Internet. Sau đó, thiết bị sẽ tiếp tục sử dụng kết nối hiện có làm mạng Wi-Fi chính.

Kết nối đồng thời với Internet và chỉ kết nối cục bộ

Chức năng kết nối Internet và chỉ kết nối cục bộ đồng thời cho phép các thiết bị kết nối với một kết nối chỉ cục bộ (chẳng hạn như kết nối với một thiết bị IoT) đồng thời với mạng cung cấp Internet chính. Chức năng này cải thiện trải nghiệm người dùng khi kết nối trực tiếp với các thiết bị IoT, chẳng hạn như camera. Bạn có thể kết nối thông qua API WifiNetworkSpecifier được thêm vào Android 10.

Trong Android 11 trở xuống, các thiết bị sẽ ngắt kết nối với mạng Wi-Fi chính khi kết nối với một thiết bị IoT, dẫn đến mất kết nối Internet (trừ phi thiết bị có một loại phương thức truyền dữ liệu khác, chẳng hạn như dữ liệu di động).

Các ứng dụng có thể kiểm tra xem thiết bị có hỗ trợ chức năng này hay không bằng cách sử dụng API WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported().

Để biết thêm thông tin về những thay đổi đối với chức năng kết nối đồng thời chỉ cục bộ và kết nối Internet trong Android 12, hãy xem bài viết Wi-Fi Network Request API cho kết nối ngang hàng.

Xác thực kết nối chỉ cục bộ và kết nối Internet

Để xác thực hàm này, hãy sử dụng kiểm thử CTS MultiStaConcurrencyWifiNetworkSpecifierTest.

Đồng thời hạn chế và kết nối Internet

Chức năng kết nối đồng thời với mạng bị hạn chế và mạng Internet cho phép thiết bị kết nối đồng thời với mạng Wi-Fi chính cho người dùng và mạng Wi-Fi bị hạn chế chỉ dành cho một số ứng dụng.

Các ứng dụng có thể kiểm tra xem thiết bị có hỗ trợ chức năng này hay không bằng cách sử dụng API WifiManager#isStaConcurrencyForRestrictedConnectionsSupported().

Để cho phép thiết bị kết nối với mạng Wi-Fi phụ bị hạn chế, hãy làm theo các bước sau:

  1. Thêm đề xuất mạng Wi-Fi bằng setOemPaid hoặc setOemPrivate được đặt thành true.

  2. Trong ConnectivityManager, hãy điền NetworkRequest bằng các chức năng tương ứng:

Khi thiết bị phát hiện thấy kết quả quét có một mạng phù hợp với đề xuất riêng tư hoặc đề xuất có trả phí của OEM, thiết bị sẽ tự động kết nối với mạng đó dưới dạng mạng phụ.

Xác thực kết nối Internet và số lượng thiết bị bị hạn chế truy cập đồng thời

Để xác thực hàm này, hãy sử dụng kiểm thử CTS MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.

Nhiều mạng đồng thời có kết nối Internet

Có trên Android 13 trở lên, tính năng nhiều mạng đồng thời có kết nối Internet cho phép thiết bị kết nối đồng thời với 2 mạng (AP), cả hai mạng này đều không bị hạn chế (tất cả ứng dụng đều có quyền truy cập) và cung cấp quyền truy cập vào Internet.

Các ứng dụng có thể kiểm tra xem thiết bị có hỗ trợ tính năng này hay không bằng cách sử dụng phương thức WifiManager#isStaConcurrencyForMultiInternetSupported().

Nếu được hỗ trợ, các ứng dụng có đặc quyền có thể bật tính năng này bằng phương thức WifiManager#setStaConcurrencyForMultiInternetMode(int mode). Tính năng này có các chế độ sau:

Để truy vấn chế độ tính năng hiện đang hoạt động, hãy sử dụng phương thức WifiManager#getStaConcurrencyForMultiInternetMode().

Khi tính năng này được bật, hãy làm theo các bước sau để yêu cầu thêm một mạng Wi-Fi cung cấp Internet.

  1. Tạo một bộ xác định mạng Wi-Fi bằng WifiNetworkSpecifier.Builder. Chọn một dải tần cho bộ chỉ định bằng phương thức setBand(). Không chỉ định SSID hoặc BSSID vì khung Wi-Fi sẽ chọn mạng bổ sung cho băng tần đã chỉ định.

  2. Sử dụng ConnectivityManager, hãy tạo một NetworkRequest có khả năng NET_CAPABILITY_INTERNET.

  3. Thêm bộ chỉ định vào yêu cầu mạng cùng với một thực thể NetworkCallback để theo dõi trạng thái của yêu cầu và đưa ra yêu cầu cho ConnectivityManager. Nếu có một mạng đã lưu có băng tần được yêu cầu trong kết quả quét và kết nối với mạng đó thành công, thì NetworkCallback.onAvailable() sẽ được gọi trên đối tượng gọi lại.

Xác thực nhiều mạng đồng thời có kết nối Internet

Để xác thực hàm này, hãy sử dụng kiểm thử CTS sau:

  • CTS: MultiStaConcurrencyMultiInternetWifiNetworkTest

Nguyên tắc về chip Wi-Fi của nhà cung cấp

Đối với nhà cung cấp chip Wi-Fi, hãy sử dụng các nguyên tắc sau để hỗ trợ khả năng đồng thời Wi-Fi STA/STA.

Chip Wi-Fi phải hỗ trợ hai kết nối STA đồng thời. Điều này có nghĩa là nó hỗ trợ những điều sau:

  • Mỗi giao diện STA có một địa chỉ MAC duy nhất mà khung có thể lập trình.
  • Giao diện STA phụ có thể được tạo và huỷ động.
  • Mỗi STA có thể được kết nối với một SSID khác (trong cùng một băng tần hoặc một băng tần khác).
  • Mỗi STA có thể được kết nối với cùng một SSID (trong cùng một băng tần hoặc một băng tần khác). Hai STA không bao giờ được kết nối với cùng một BSSID.

Các tính năng quan trọng phải hoạt động trên cơ sở mỗi giao diện và phải có trên giao diện chính. Sau đây là danh sách các tính năng quan trọng này:

  • Bạn phải hỗ trợ chuyển vùng trên ít nhất giao diện chính (được thiết lập bằng IWifiChip.setMultiStaPrimaryConnection()). Nếu bạn hỗ trợ chuyển vùng trên cả hai giao diện, thì các quyết định về một kết nối không được xung đột với kết nối đồng thời thứ hai. Ví dụ: một giao diện không được chuyển vùng sang BSSID của kết nối khác.

  • APF (và các hoạt động chuyển tải khác như ARP và NS) phải được hỗ trợ trên ít nhất giao diện chính (được đặt bằng IWifiChip.setMultiStaPrimaryConnection()).

  • Số liệu thống kê về lớp liên kết phải hoạt động trên cơ sở mỗi giao diện.

Sau đây là các cách triển khai chip Wi-Fi được đề xuất cho các trường hợp đồng thời khác nhau:

  • Chip Wi-Fi phải cho phép khung gọi IWifiChip.setMultiStaUseCase() bằng một trong các hằng số sau để chỉ định chức năng hiện tại:

    • DUAL_STA_TRANSIENT_PREFER_PRIMARY: Chỉ định chức năng Make-Before-Break. Bạn phải ưu tiên chất lượng của kết nối chính hơn kết nối phụ.
    • DUAL_STA_NON_TRANSIENT_UNBIASED: Chỉ định kết nối Internet và chỉ kết nối cục bộ đồng thời hoặc chức năng kết nối Internet và kết nối bị hạn chế đồng thời. Bạn phải ưu tiên chất lượng của cả hai kết nối như nhau.
  • Vì STA đồng thời kép có thể dẫn đến các chế độ hoạt động MCC, SCC và DBS, nên việc triển khai của nhà cung cấp phải chọn cấu hình đài tốt nhất khi khung gọi IWifiChip.setMultiStaUseCase() để cho biết chức năng. Sau đây là các nguyên tắc chung:

    • Nên dùng DBS 2x2+2x2 nếu có.
    • Tránh sử dụng DBS 1x1+1x1 nếu có thể vì tác động quá mức đến chất lượng kết nối. Thay vào đó, hãy ưu tiên MCC.
    • Người lái xe hoặc chương trình cơ sở phải định cấu hình được chu kỳ hoạt động của MCC cho nhiều chức năng. Khung này không đặt chu kỳ hoạt động MCC trực tiếp mà truy vấn thông tin này bằng StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent.
    • Nếu sử dụng MCC, bạn nên sử dụng các chu kỳ hoạt động sau đây giữa các kết nối chính và phụ:

      • DUAL_STA_TRANSIENT_PREFER_PRIMARY: 70% màu chính, 30% màu phụ.
      • DUAL_STA_NON_TRANSIENT_UNBIASED: 50% chính, 50% phụ.