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

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

برای استفاده از این API، مراحل زیر را انجام دهید:

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

  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 برابر با "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);