वाई-फ़ाई अवेयर की खास जानकारी

Wi-Fi Aware की सुविधाओं की मदद से, Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन वाले डिवाइस, एक-दूसरे को ढूंढ सकते हैं और सीधे कनेक्ट हो सकते हैं. इसके लिए, उन्हें किसी अन्य तरह के कनेक्शन की ज़रूरत नहीं होती. Wi-Fi Aware को नेबर अवेयरनेस नेटवर्किंग (एनएएन) भी कहा जाता है.

Wi-Fi Aware नेटवर्किंग, आस-पास के डिवाइसों के साथ क्लस्टर बनाकर काम करती है. इसके अलावा, अगर डिवाइस किसी इलाके में पहला डिवाइस है, तो नया क्लस्टर बनाकर काम करती है. क्लस्टर बनाने का यह तरीका, पूरे डिवाइस पर लागू होता है. इसे Wi-Fi Aware सिस्टम सर्विस मैनेज करती है. ऐप्लिकेशन के पास क्लस्टर बनाने के तरीके पर कोई कंट्रोल नहीं होता. ऐप्लिकेशन, Wi-Fi Aware सिस्टम सेवा से संपर्क करने के लिए, Wi-Fi Aware एपीआई का इस्तेमाल करते हैं. यह सेवा, डिवाइस पर मौजूद Wi-Fi Aware हार्डवेयर को मैनेज करती है.

Wi-Fi Aware एपीआई की मदद से, ऐप्लिकेशन ये काम कर सकते हैं:

  • अन्य डिवाइसों का पता लगाना: एपीआई में आस-पास मौजूद अन्य डिवाइसों का पता लगाने का तरीका होता है. यह प्रोसेस तब शुरू होती है, जब कोई डिवाइस, खोजे जा सकने वाली एक या उससे ज़्यादा सेवाओं को पब्लिश करता है. इसके बाद, जब कोई डिवाइस एक या उससे ज़्यादा सेवाओं की सदस्यता लेता है और पब्लिशर के वाई-फ़ाई की रेंज में आता है, तो सदस्य को सूचना मिलती है कि उससे मैच करने वाला पब्लिशर मिल गया है. पब्लिशर का पता लगाने के बाद, सब्सक्राइबर उसे एक छोटा मैसेज भेज सकता है या उस डिवाइस के साथ नेटवर्क कनेक्शन बना सकता है. डिवाइस, एक साथ पब्लिशर और सब्सक्राइबर, दोनों हो सकते हैं.

  • नेटवर्क कनेक्शन बनाना: दो डिवाइसों के एक-दूसरे को ढूंढने के बाद, वे ऐक्सेस पॉइंट के बिना, दोनों तरफ़ से काम करने वाला Wi-Fi Aware नेटवर्क कनेक्शन बना सकते हैं.

Wi-Fi Aware नेटवर्क कनेक्शन, ब्लूटूथ कनेक्शन की तुलना में ज़्यादा दूरी तक और ज़्यादा तेज़ी से डेटा ट्रांसफ़र कर सकते हैं. इस तरह के कनेक्शन, उन ऐप्लिकेशन के लिए मददगार होते हैं जो उपयोगकर्ताओं के बीच बड़ी मात्रा में डेटा शेयर करते हैं. जैसे, फ़ोटो शेयर करने वाले ऐप्लिकेशन.

Android 13 (एपीआई लेवल 33) में किए गए सुधार

Android 13 (एपीआई लेवल 33) और इसके बाद के वर्शन वाले डिवाइसों पर, इंस्टैंट कम्यूनिकेशन मोड काम करता है. इन डिवाइसों पर, ऐप्लिकेशन PublishConfig.Builder.setInstantCommunicationModeEnabled() और SubscribeConfig.Builder.setInstantCommunicationModeEnabled() तरीकों का इस्तेमाल करके, पब्लिशर या सब्सक्राइबर डिस्कवरी सेशन के लिए इंस्टैंट कम्यूनिकेशन मोड को चालू या बंद कर सकते हैं. इंस्टैंट कम्यूनिकेशन मोड, मैसेज भेजने और पाने की प्रोसेस को तेज़ करता है. साथ ही, डिवाइस और सेवाओं की अपने-आप पहचान करने की प्रोसेस को तेज़ करता है. इसके अलावा, पब्लिशर या सब्सक्राइबर के डिस्कवरी सेशन के हिस्से के तौर पर सेट अप किए गए किसी भी डेटा-पाथ को तेज़ करता है. यह पता लगाने के लिए कि कोई डिवाइस, इंस्टैंट कम्यूनिकेशन मोड के साथ काम करता है या नहीं, isInstantCommunicationModeSupported() तरीके का इस्तेमाल करें.

Android 12 (एपीआई लेवल 31) में किए गए सुधार

Android 12 (एपीआई लेवल 31) में, Wi-Fi Aware की सुविधा में कुछ सुधार किए गए हैं:

  • Android 12 (एपीआई लेवल 31) या इसके बाद के वर्शन वाले डिवाइसों पर, onServiceLost() कॉलबैक का इस्तेमाल किया जा सकता है. इससे आपको तब सूचना मिलेगी, जब आपके ऐप्लिकेशन को खोजी गई सेवा का ऐक्सेस नहीं मिल पाएगा. ऐसा सेवा के बंद होने या रेंज से बाहर होने की वजह से हो सकता है.
  • Wi-Fi Aware डेटा पाथ के सेटअप को आसान बना दिया गया है. पुराने वर्शन में, इनिशिएटर का मैक पता देने के लिए L2 मैसेजिंग का इस्तेमाल किया जाता था. इससे इंतज़ार का समय बढ़ जाता था. Android 12 और इसके बाद के वर्शन वाले डिवाइसों पर, जवाब देने वाले डिवाइस (सर्वर) को किसी भी पीयर को स्वीकार करने के लिए कॉन्फ़िगर किया जा सकता है. इसका मतलब है कि उसे पहले से ही, शुरुआत करने वाले डिवाइस का मैक पता जानने की ज़रूरत नहीं होती. इससे डेटापाथ को तेज़ी से चालू किया जा सकता है. साथ ही, नेटवर्क के सिर्फ़ एक अनुरोध से कई पॉइंट-टू-पॉइंट लिंक चालू किए जा सकते हैं.
  • Android 12 या इसके बाद के वर्शन पर चलने वाले ऐप्लिकेशन, WifiAwareManager.getAvailableAwareResources() तरीके का इस्तेमाल करके, फ़िलहाल उपलब्ध डेटा पाथ, पब्लिश सेशन, और सदस्यता सेशन की संख्या जान सकते हैं. इससे ऐप्लिकेशन को यह तय करने में मदद मिल सकती है कि उसके पास अपनी मुख्य सुविधाओं को चलाने के लिए ज़रूरी संसाधन उपलब्ध हैं या नहीं.

शुरुआती सेट अप

वाई-फ़ाई अवेयर की मदद से डिवाइसों को खोजने और नेटवर्किंग की सुविधा का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन को सेट अप करें. इसके लिए, यह तरीका अपनाएं:

  1. अपने ऐप्लिकेशन के मेनिफ़ेस्ट में इन अनुमतियों का अनुरोध करें:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- If your app targets Android 13 (API level 33)
         or higher, you must declare the NEARBY_WIFI_DEVICES permission. -->
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     <!-- If your app derives location information from
                          Wi-Fi APIs, don't include the "usesPermissionFlags"
                          attribute. -->
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     <!-- If any feature in your app relies on precise location
                          information, don't include the "maxSdkVersion"
                          attribute. -->
                     android:maxSdkVersion="32" />
  2. यह देखने के लिए कि डिवाइस में Wi-Fi Aware की सुविधा काम करती है या नहीं, PackageManager एपीआई का इस्तेमाल करें, जैसा कि यहां दिखाया गया है:

    Kotlin

    context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)

    Java

    context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
  3. देखें कि फ़िलहाल Wi-Fi Aware की सुविधा उपलब्ध है या नहीं. ऐसा हो सकता है कि डिवाइस पर Wi-Fi Aware की सुविधा मौजूद हो, लेकिन फ़िलहाल उपलब्ध न हो. ऐसा इसलिए, क्योंकि उपयोगकर्ता ने वाई-फ़ाई या जगह की जानकारी की सुविधा बंद कर दी है. हार्डवेयर और फ़र्मवेयर की क्षमताओं के आधार पर, कुछ डिवाइसों पर Wi-Fi Aware की सुविधा काम नहीं करती. ऐसा तब होता है, जब Wi-Fi Direct, SoftAP या टेदरिंग की सुविधा का इस्तेमाल किया जा रहा हो. फ़िलहाल, वाई-फ़ाई अवेयर की सुविधा उपलब्ध है या नहीं, यह जानने के लिए isAvailable() को कॉल करें.

    Wi-Fi Aware की सुविधा की उपलब्धता कभी भी बदल सकती है. आपके ऐप्लिकेशन को BroadcastReceiver रजिस्टर करना चाहिए, ताकि उसे ACTION_WIFI_AWARE_STATE_CHANGED मिल सके. यह तब भेजा जाता है, जब उपलब्धता में बदलाव होता है. जब आपके ऐप्लिकेशन को ब्रॉडकास्ट इंटेंट मिलता है, तो उसे सभी मौजूदा सेशन खारिज कर देने चाहिए. यह मान लें कि Wi-Fi Aware सेवा में रुकावट आई है. इसके बाद, उपलब्धता की मौजूदा स्थिति देखें और उसके हिसाब से अपने व्यवहार में बदलाव करें. उदाहरण के लिए:

    Kotlin

    val wifiAwareManager = context.getSystemService(Context.WIFI_AWARE_SERVICE) as WifiAwareManager?
    val filter = IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED)
    val myReceiver = object : BroadcastReceiver() {
    
        override fun onReceive(context: Context, intent: Intent) {
            // discard current sessions
            if (wifiAwareManager?.isAvailable) {
                ...
            } else {
                ...
            }
        }
    }
    context.registerReceiver(myReceiver, filter)

    Java

    WifiAwareManager wifiAwareManager = 
            (WifiAwareManager)context.getSystemService(Context.WIFI_AWARE_SERVICE)
    IntentFilter filter =
            new IntentFilter(WifiAwareManager.ACTION_WIFI_AWARE_STATE_CHANGED);
    BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // discard current sessions
            if (wifiAwareManager.isAvailable()) {
                ...
            } else {
                ...
            }
        }
    };
    context.registerReceiver(myReceiver, filter);

ज़्यादा जानकारी के लिए, ब्रॉडकास्ट देखें.

सेशन शुरू करना

Wi-Fi Aware का इस्तेमाल शुरू करने के लिए, आपके ऐप्लिकेशन को attach() को कॉल करके, WifiAwareSession पाना होगा. इस तरीके से ये काम किए जा सकते हैं:

  • यह Wi-Fi Aware हार्डवेयर को चालू करता है.
  • यह किसी Wi-Fi Aware क्लस्टर में शामिल होता है या उसे बनाता है.
  • यह एक यूनीक नेमस्पेस के साथ Wi-Fi Aware सेशन बनाता है. यह नेमस्पेस, इसमें बनाए गए सभी डिस्कवरी सेशन के लिए कंटेनर के तौर पर काम करता है.

अगर ऐप्लिकेशन अटैच हो जाता है, तो सिस्टम onAttached() कॉलबैक को लागू करता है. यह कॉलबैक, WifiAwareSession ऑब्जेक्ट उपलब्ध कराता है. आपके ऐप्लिकेशन को सेशन से जुड़ी आगे की सभी कार्रवाइयों के लिए, इस ऑब्जेक्ट का इस्तेमाल करना चाहिए. कोई ऐप्लिकेशन, किसी सेवा को पब्लिश करने या किसी सेवा की सदस्यता लेने के लिए, सेशन का इस्तेमाल कर सकता है.

आपके ऐप्लिकेशन को attach() को सिर्फ़ एक बार कॉल करना चाहिए. अगर आपका ऐप्लिकेशन attach() को कई बार कॉल करता है, तो ऐप्लिकेशन को हर कॉल के लिए एक अलग सेशन मिलता है. हर सेशन का अपना नेमस्पेस होता है. यह मुश्किल स्थितियों में काम आ सकता है. हालांकि, आम तौर पर इससे बचना चाहिए.

कोई सेवा पब्लिश करना

किसी सेवा को खोजने लायक बनाने के लिए, publish() तरीके को कॉल करें. इसमें ये पैरामीटर शामिल होते हैं:

  • PublishConfig से सेवा के नाम और अन्य कॉन्फ़िगरेशन प्रॉपर्टी के बारे में पता चलता है. जैसे, मैच फ़िल्टर.
  • DiscoverySessionCallback, इवेंट होने पर की जाने वाली कार्रवाइयों के बारे में बताता है. जैसे, सदस्य को मैसेज मिलने पर की जाने वाली कार्रवाइयां.

यहां एक उदाहरण दिया गया है:

Kotlin

val config: PublishConfig = PublishConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.publish(config, object : DiscoverySessionCallback() {

    override fun onPublishStarted(session: PublishDiscoverySession) {
        ...
    }

    override fun onMessageReceived(peerHandle: PeerHandle, message: ByteArray) {
        ...
    }
})

Java

PublishConfig config = new PublishConfig.Builder()
    .setServiceName(“Aware_File_Share_Service_Name”)
    .build();

awareSession.publish(config, new DiscoverySessionCallback() {
    @Override
    public void onPublishStarted(PublishDiscoverySession session) {
        ...
    }
    @Override
    public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
        ...
    }
}, null);

अगर पब्लिश करने की प्रोसेस पूरी हो जाती है, तो onPublishStarted() कॉलबैक का तरीका कॉल किया जाता है.

पब्लिश करने के बाद, जब सदस्यता लेकर इस्तेमाल होने वाले ऐप्लिकेशन वाले डिवाइस, पब्लिश करने वाले डिवाइस की वाई-फ़ाई रेंज में आते हैं, तो सदस्यों को सेवा का पता चलता है. जब कोई सदस्य किसी पब्लिशर को ढूंढता है, तो पब्लिशर को इसकी सूचना नहीं मिलती. हालांकि, अगर सदस्य पब्लिशर को कोई मैसेज भेजता है, तो पब्लिशर को इसकी सूचना मिलती है. ऐसा होने पर, onMessageReceived() कॉलबैक का तरीका कॉल किया जाता है. इस तरीके से PeerHandle आर्ग्युमेंट का इस्तेमाल करके, सदस्य को मैसेज भेजा जा सकता है या उससे कनेक्शन बनाया जा सकता है.

सेवा को पब्लिश होने से रोकने के लिए, DiscoverySession.close() को कॉल करें. डिस्कवरी सेशन, उनके पैरंट WifiAwareSession से जुड़े होते हैं. अगर पैरंट सेशन बंद हो जाता है, तो उससे जुड़े डिस्कवरी सेशन भी बंद हो जाते हैं. हालांकि, खारिज किए गए ऑब्जेक्ट भी बंद कर दिए जाते हैं, लेकिन सिस्टम इस बात की गारंटी नहीं देता कि आउट-ऑफ़-स्कोप सेशन कब बंद होंगे. इसलिए, हमारा सुझाव है कि आप close() तरीकों को साफ़ तौर पर कॉल करें.

किसी सेवा की सदस्यता लेना

किसी सेवा की सदस्यता लेने के लिए, subscribe() तरीके को कॉल करें. इसमें ये पैरामीटर इस्तेमाल किए जाते हैं:

  • SubscribeConfig, उस सेवा का नाम बताता है जिसकी सदस्यता लेनी है. साथ ही, यह कॉन्फ़िगरेशन की अन्य प्रॉपर्टी के बारे में भी बताता है. जैसे, मैच फ़िल्टर.
  • DiscoverySessionCallback से उन कार्रवाइयों के बारे में पता चलता है जो इवेंट होने पर की जानी चाहिए. जैसे, जब किसी पब्लिशर का पता चलता है.

यहां एक उदाहरण दिया गया है:

Kotlin

val config: SubscribeConfig = SubscribeConfig.Builder()
        .setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
        .build()
awareSession.subscribe(config, object : DiscoverySessionCallback() {

    override fun onSubscribeStarted(session: SubscribeDiscoverySession) {
        ...
    }

    override fun onServiceDiscovered(
            peerHandle: PeerHandle,
            serviceSpecificInfo: ByteArray,
            matchFilter: List<ByteArray>
    ) {
        ...
    }
}, null)

Java

SubscribeConfig config = new SubscribeConfig.Builder()
    .setServiceName("Aware_File_Share_Service_Name")
    .build();

awareSession.subscribe(config, new DiscoverySessionCallback() {
    @Override
    public void onSubscribeStarted(SubscribeDiscoverySession session) {
        ...
    }

    @Override
    public void onServiceDiscovered(PeerHandle peerHandle,
            byte[] serviceSpecificInfo, List<byte[]> matchFilter) {
        ...
    }
}, null);

अगर सदस्यता लेने की प्रोसेस पूरी हो जाती है, तो सिस्टम आपके ऐप्लिकेशन में onSubscribeStarted() कॉलबैक को कॉल करता है. आपके ऐप्लिकेशन को पब्लिशर मिलने के बाद, पब्लिशर से कम्यूनिकेट करने के लिए, कॉलबैक में SubscribeDiscoverySession आर्ग्युमेंट का इस्तेमाल किया जा सकता है. इसलिए, आपको यह रेफ़रंस सेव करना चाहिए. डिस्कवरी सेशन पर updateSubscribe() को कॉल करके, सदस्यता सेशन को किसी भी समय अपडेट किया जा सकता है.

इस समय, आपकी सदस्यता, वाई-फ़ाई की रेंज में आने वाले पब्लिशर के मैच होने का इंतज़ार करती है. ऐसा होने पर, सिस्टम onServiceDiscovered() कॉलबैक का तरीका लागू करता है. इस कॉलबैक से PeerHandle आर्ग्युमेंट का इस्तेमाल करके, उस पब्लिशर को मैसेज भेजा जा सकता है या उससे कनेक्शन बनाया जा सकता है.

किसी सेवा की सदस्यता लेना बंद करने के लिए, DiscoverySession.close() पर कॉल करें. डिस्कवरी सेशन, उनके पैरंट WifiAwareSession से जुड़े होते हैं. अगर पैरंट सेशन बंद हो जाता है, तो उससे जुड़े डिस्कवरी सेशन भी बंद हो जाते हैं. हालांकि, खारिज किए गए ऑब्जेक्ट भी बंद कर दिए जाते हैं, लेकिन सिस्टम इस बात की गारंटी नहीं देता कि आउट-ऑफ़-स्कोप सेशन कब बंद होंगे. इसलिए, हमारा सुझाव है कि आप close() तरीकों को साफ़ तौर पर कॉल करें.

मैसेज भेजें

किसी दूसरे डिवाइस पर मैसेज भेजने के लिए, आपको इन ऑब्जेक्ट की ज़रूरत होगी:

  • DiscoverySession. इस ऑब्जेक्ट की मदद से, sendMessage() को कॉल किया जा सकता है. आपके ऐप्लिकेशन को DiscoverySession तब मिलता है, जब वह कोई सेवा पब्लिश करता है या किसी सेवा की सदस्यता लेता है.

  • मैसेज को रूट करने के लिए, दूसरे डिवाइस का PeerHandle. आपके ऐप्लिकेशन को किसी दूसरे डिवाइस का PeerHandle, इन दो में से किसी एक तरीके से मिलता है:

    • आपका ऐप्लिकेशन कोई सेवा पब्लिश करता है और उसे किसी सदस्य से मैसेज मिलता है. आपके ऐप्लिकेशन को onMessageReceived() कॉलबैक से, सदस्य का PeerHandle मिलता है.
    • आपका ऐप्लिकेशन किसी सेवा की सदस्यता लेता है. इसके बाद, जब उसे कोई मिलता-जुलता पब्लिशर मिलता है, तो आपके ऐप्लिकेशन को onServiceDiscovered() कॉलबैक से पब्लिशर का PeerHandle मिलता है.

मैसेज भेजने के लिए, sendMessage() पर कॉल करें. इसके बाद, ये कॉलबैक हो सकते हैं:

  • जब दूसरे डिवाइस को मैसेज मिल जाता है, तो सिस्टम मैसेज भेजने वाले ऐप्लिकेशन में onMessageSendSucceeded() कॉलबैक को कॉल करता है.
  • जब पीयर को कोई मैसेज मिलता है, तो सिस्टम मैसेज पाने वाले ऐप्लिकेशन में onMessageReceived() कॉलबैक को कॉल करता है.

हालांकि, पीयर से कम्यूनिकेट करने के लिए PeerHandle ज़रूरी है, लेकिन आपको इसे पीयर के स्थायी आइडेंटिफ़ायर के तौर पर इस्तेमाल नहीं करना चाहिए. ऐप्लिकेशन, ज़्यादा लेवल वाले आइडेंटिफ़ायर का इस्तेमाल कर सकता है. ये आइडेंटिफ़ायर, डिस्कवरी सर्विस में या बाद के मैसेज में एम्बेड किए जाते हैं. PublishConfig या SubscribeConfig के setMatchFilter() या setServiceSpecificInfo() तरीके का इस्तेमाल करके, डिस्कवरी सर्विस में आइडेंटिफ़ायर को एम्बेड किया जा सकता है. setMatchFilter() वाले तरीके से, वीडियो के सुझावों पर असर पड़ता है. वहीं, setServiceSpecificInfo() वाले तरीके से, वीडियो के सुझावों पर कोई असर नहीं पड़ता.

किसी मैसेज में आइडेंटिफ़ायर को एम्बेड करने का मतलब है कि मैसेज के बाइट कलेक्शन में बदलाव करके, उसमें आइडेंटिफ़ायर को शामिल करना. उदाहरण के लिए, पहले कुछ बाइट के तौर पर.

कनेक्शन बनाना

Wi-Fi Aware की सुविधा, Wi-Fi Aware की सुविधा वाले दो डिवाइसों के बीच क्लाइंट-सर्वर नेटवर्किंग की सुविधा देती है.

क्लाइंट-सर्वर कनेक्शन सेट अप करने के लिए:

  1. सर्वर पर कोई सेवा पब्लिश करने और क्लाइंट पर किसी सेवा की सदस्यता लेने के लिए, Wi-Fi Aware की सुविधा का इस्तेमाल करें.

  2. सदस्य को पब्लिशर की जानकारी मिलने के बाद, सदस्य से पब्लिशर को एक मैसेज भेजें.

  3. पब्लिशर डिवाइस पर ServerSocket शुरू करें और उसका पोर्ट सेट करें या उसे हासिल करें:

    Kotlin

    val ss = ServerSocket(0)
    val port = ss.localPort

    Java

    ServerSocket ss = new ServerSocket(0);
    int port = ss.getLocalPort();
  4. WifiAwareNetworkSpecifier का इस्तेमाल करके, पब्लिशर पर Wi-Fi Aware नेटवर्क का अनुरोध करने के लिए, ConnectivityManager का इस्तेमाल करें. साथ ही, डिस्कवरी सेशन और सब्सक्राइबर का PeerHandle बताएं. यह जानकारी आपको सब्सक्राइबर से मिले मैसेज से मिली है:

    Kotlin

    val networkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build()
    val myNetworkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build()
    val callback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            ...
        }
    
        override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
            ...
        }
    
        override fun onLost(network: Network) {
            ...
        }
    }
    
    connMgr.requestNetwork(myNetworkRequest, callback);

    Java

    NetworkSpecifier networkSpecifier = new WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
        .setPskPassphrase("somePassword")
        .setPort(port)
        .build();
    NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
        .setNetworkSpecifier(networkSpecifier)
        .build();
    ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            ...
        }
    
        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
            ...
        }
    
        @Override
        public void onLost(Network network) {
            ...
        }
    };
    
    ConnectivityManager connMgr.requestNetwork(myNetworkRequest, callback);
  5. जब पब्लिशर किसी नेटवर्क का अनुरोध करता है, तो उसे सदस्य को एक मैसेज भेजना चाहिए.

  6. जब सदस्य को पब्लिशर से मैसेज मिल जाए, तो सदस्य के डिवाइस पर Wi-Fi Aware नेटवर्क का अनुरोध करें. इसके लिए, उसी तरीके का इस्तेमाल करें जो पब्लिशर के डिवाइस पर किया गया था. NetworkSpecifier बनाते समय, पोर्ट की जानकारी न दें. इंटरनेट कनेक्शन उपलब्ध होने, बदलने या बंद होने पर, कॉलबैक के सही तरीके इस्तेमाल किए जाते हैं.

  7. सब्सक्राइबर पर onAvailable() मेथड को कॉल करने के बाद, एक Network ऑब्जेक्ट उपलब्ध होता है. इसकी मदद से, पब्लिशर पर ServerSocket के साथ कम्यूनिकेट करने के लिए, Socket को खोला जा सकता है. हालांकि, इसके लिए आपको ServerSocket का IPv6 पता और पोर्ट पता होना चाहिए. ये आपको onCapabilitiesChanged() कॉलबैक में दिए गए NetworkCapabilities ऑब्जेक्ट से मिलते हैं:

    Kotlin

    val peerAwareInfo = networkCapabilities.transportInfo as WifiAwareNetworkInfo
    val peerIpv6 = peerAwareInfo.peerIpv6Addr
    val peerPort = peerAwareInfo.port
    ...
    val socket = network.getSocketFactory().createSocket(peerIpv6, peerPort)

    Java

    WifiAwareNetworkInfo peerAwareInfo = (WifiAwareNetworkInfo) networkCapabilities.getTransportInfo();
    Inet6Address peerIpv6 = peerAwareInfo.getPeerIpv6Addr();
    int peerPort = peerAwareInfo.getPort();
    ...
    Socket socket = network.getSocketFactory().createSocket(peerIpv6, peerPort);
  8. इंटरनेट कनेक्शन सेट अप करने के बाद, unregisterNetworkCallback() पर कॉल करें.

    देखें.

आस-पास मौजूद डिवाइसों की रेंज का पता लगाना और जगह की जानकारी के आधार पर डिवाइसों को ढूंढना

वाई-फ़ाई आरटीटी की मदद से जगह की जानकारी देने की सुविधा वाले डिवाइस, आस-पास मौजूद डिवाइसों की दूरी का सीधे तौर पर पता लगा सकते हैं. साथ ही, इस जानकारी का इस्तेमाल करके, Wi-Fi Aware की मदद से डिवाइस और सेवाओं की अपने-आप पहचान करने की सुविधा को सीमित कर सकते हैं.

वाई-फ़ाई आरटीटी एपीआई, वाई-फ़ाई अवेयर पीयर के मैक पते या PeerHandle का इस्तेमाल करके, सीधे तौर पर रेंज तय करने की सुविधा देता है.

वाई-फ़ाई अवेयर की मदद से, किसी खास जियोफ़ेंस में मौजूद सेवाओं को ही खोजा जा सकता है. उदाहरण के लिए, ऐसा जियोफ़ेंस सेट अप किया जा सकता है जो "Aware_File_Share_Service_Name" सेवा पब्लिश करने वाले डिवाइस को ढूंढने की अनुमति देता है. यह डिवाइस, 3 मीटर (3,000 मि॰मी॰ के तौर पर बताया गया है) से कम और 10 मीटर (10,000 मि॰मी॰ के तौर पर बताया गया है) से ज़्यादा दूरी पर नहीं होना चाहिए.

जियोफ़ेंसिंग की सुविधा चालू करने के लिए, पब्लिशर और सदस्य, दोनों को ये कार्रवाइयां करनी होंगी:

  • पब्लिशर को setRangingEnabled(true) का इस्तेमाल करके, पब्लिश की गई सेवा पर रेंजिंग की सुविधा चालू करनी होगी.

    अगर पब्लिशर, रेंजिंग की सुविधा चालू नहीं करता है, तो सदस्य की ओर से तय की गई जियोफ़ेंस की सभी पाबंदियों को अनदेखा कर दिया जाता है. साथ ही, दूरी को अनदेखा करते हुए सामान्य तरीके से खोज की जाती है.

  • सदस्य को setMinDistanceMm और setMaxDistanceMm के कुछ कॉम्बिनेशन का इस्तेमाल करके, जियोफ़ेंस तय करना होगा.

    दोनों में से किसी भी वैल्यू के लिए, दूरी तय न करने का मतलब है कि कोई सीमा नहीं है. सिर्फ़ ज़्यादा से ज़्यादा दूरी तय करने का मतलब है कि कम से कम दूरी 0 है. सिर्फ़ कम से कम दूरी तय करने का मतलब है कि ज़्यादा से ज़्यादा दूरी तय नहीं की गई है.

जब किसी जियोफ़ेंस में कोई पीयर सेवा मिलती है, तो onServiceDiscoveredWithinRange कॉलबैक ट्रिगर होता है. इससे पीयर की दूरी का पता चलता है. इसके बाद, बाद में दूरी मापने के लिए, ज़रूरत के हिसाब से डायरेक्ट वाई-फ़ाई आरटीटी एपीआई को कॉल किया जा सकता है.