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

در دستگاه‌های دارای Android 10 (سطح 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() در شیء بازگشت تماس فراخوانی می‌شود. اگر کاربر درخواست را رد کند یا اگر اتصال به شبکه ناموفق باشد، NetworkCallback.onUnavailable() در شیء فراخوانی برگشتی فراخوانده می‌شود.

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

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

وقتی کاربر در پاسخ به درخواست برنامه‌ای خاص، اتصال به شبکه‌ای را تأیید می‌کند، دستگاه این تأیید را برای آن نقطه دسترسی خاص ذخیره می‌کند. اگر برنامه درخواست خاصی برای اتصال مجدد به آن نقطه دسترسی ارائه دهد، دستگاه مرحله تأیید کاربر را رد می‌کند و به‌طور خودکار به شبکه متصل می‌شود. اگر کاربر انتخاب کند که شبکه را درحین اتصال به شبکه درخواست‌شده توسط میانای برنامه‌سازی کاربردی فراموش کند، این تأیید ذخیره‌شده برای آن ترکیب برنامه و شبکه برداشته می‌شود و هرگونه درخواست آتی از برنامه باید دوباره توسط کاربر تأیید شود. اگر برنامه درخواست غیرخاصی ارائه دهد، مثلاً با الگوی 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);