واجهة برمجة تطبيقات طلب شبكة Wi-Fi للاتصال من خلال شبكة الند للند

على أجهزة Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكنك استخدام واجهة برمجة تطبيقات جديدة للتواصل بين الأجهزة بهدف إعداد الأجهزة الثانوية، مثل أجهزة Chromecast وGoogle Home . تتيح هذه الميزة لتطبيقك مطالبة المستخدم بتغيير نقطة الاتصال التي يتصل بها الجهاز باستخدام WifiNetworkSpecifier لوصف خصائص الشبكة المطلوبة.

لاستخدام واجهة برمجة التطبيقات هذه، يمكنك إجراء ما يلي:

  1. إنشاء محدد شبكة Wi-Fi باستخدام 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() على كائن الاستدعاء. وإذا رفض المستخدم الطلب أو إذا فشل الاتصال بالشبكة، NetworkCallback.onUnavailable() على كائن الاستدعاء.

يؤدي بدء طلب الاتصال بجهاز مماثل إلى فتح مربّع حوار على الجهاز نفسه، ويمكن لمستخدم هذا الجهاز قبول طلب الاتصال.

تجاوز موافقة المستخدم

بعد أن يوافق المستخدم على شبكة للاتصال بها استجابةً لطلب من تطبيق معيّن، يخزِّن الجهاز الموافقة على نقطة الوصول المحدّدة. إذا قدّم التطبيق طلبًا محدّدًا ل الاتصال بنقطة الوصول هذه مرة أخرى، يتخطّى الجهاز مرحلة موافقة المستخدم ويتصل تلقائيًا بالشبكة. إذا اختار المستخدم نسيان أثناء الاتصال بشبكة تطلبها واجهة برمجة التطبيقات، يتم تخزين ستتم إزالة الموافقة على هذه المجموعة من التطبيق والشبكة، كما ستتم إزالة أي طلب الموافقة الوارد من التطبيق من قِبل المستخدم مرة أخرى. إذا كان التطبيق طلبًا غير محدد، مثل استخدام نمط SSID أو BSSID، ثم يجب أن يوافق المستخدم على الطلب.

نموذج رمز

توضِّح عيّنة الرمز البرمجي التالية كيفية الاتصال بشبكة مفتوحة باستخدام بادئة "test" لعنوان SSID و"10:03:23" لعنوان OUI الخاص بـ BSSID:

Kotlin

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)

Java

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);