API درخواست شبکه Wi-Fi برای اتصال همتا به همتا

در Android 10 (سطح API 29) و دستگاه‌های بالاتر، می‌توانید از یک API همتا به همتا جدید برای راه‌اندازی پیکربندی دستگاه‌های ثانویه مانند Chromecast و سخت‌افزار Google Home استفاده کنید. این ویژگی به برنامه شما امکان می‌دهد تا با استفاده از WifiNetworkSpecifier برای توصیف ویژگی‌های یک شبکه درخواستی، از کاربر بخواهد نقطه دسترسی را که دستگاه به آن متصل است تغییر دهد.

برای استفاده از این API موارد زیر را انجام دهید:

  1. با استفاده از WifiNetworkSpecifier.Builder یک مشخص کننده شبکه Wi-Fi ایجاد کنید.

  2. یک فیلتر شبکه برای مطابقت با شبکه‌هایی که می‌خواهید به آنها متصل شوید، به همراه اعتبارنامه‌های مورد نیاز تنظیم کنید.

  3. برای تنظیم فیلتر شبکه در هر درخواست، با توجه به شرایط زیر، ترکیبی از SSID ، SSID pattern ، BSSID ، و BSSID pattern را انتخاب کنید:

    • هر درخواست باید حداقل یکی از SSID ، SSID pattern ، BSSID ، یا BSSID pattern را ارائه کند.
    • هر درخواست می تواند تنها یکی از الگوهای SSID یا SSID pattern را تنظیم کند
    • هر درخواست می تواند تنها یکی از الگوهای BSSID یا BSSID pattern را تنظیم کند
  4. برای پیگیری وضعیت درخواست، مشخص‌کننده‌ها را به همراه یک نمونه NetworkCallback به درخواست شبکه اضافه کنید.

    اگر کاربر درخواست را بپذیرد و اتصال به شبکه با موفقیت انجام شود، NetworkCallback.onAvailable() بر روی شئ callback فراخوانی می شود. اگر کاربر درخواست را رد کند یا اتصال به شبکه ناموفق باشد، NetworkCallback.onUnavailable() بر روی شئ callback فراخوانی می شود.

با شروع درخواست برای اتصال به یک دستگاه همتا، یک کادر محاوره ای در همان دستگاه راه اندازی می شود که کاربر آن دستگاه می تواند درخواست اتصال را بپذیرد.

دور زدن تایید کاربر

هنگامی که کاربر شبکه ای را برای اتصال به آن در پاسخ به درخواست یک برنامه خاص تأیید کرد، دستگاه تأییدیه نقطه دسترسی خاص را ذخیره می کند. اگر برنامه درخواست خاصی برای اتصال دوباره به آن نقطه دسترسی داشته باشد، دستگاه از مرحله تایید کاربر می گذرد و به طور خودکار به شبکه متصل می شود. اگر کاربر هنگام اتصال به شبکه‌ای که توسط API درخواست می‌شود، انتخاب کند که شبکه را فراموش کند، این تأییدیه ذخیره شده برای آن ترکیب برنامه و شبکه حذف می‌شود و هر درخواست بعدی از برنامه باید دوباره توسط کاربر تأیید شود. اگر برنامه درخواستی غیر اختصاصی، مانند الگوی SSID یا BSSID ارائه دهد، کاربر باید درخواست را تأیید کند.

نمونه کد

نمونه کد زیر نحوه اتصال به یک شبکه باز با پیشوند SSID "test" و BSSID OUI "10:03:23" را نشان می دهد:

کاتلین

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

جاوا

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);