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

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

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

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

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

  • नेटवर्क कनेक्शन बनाना: जब दो डिवाइस एक-दूसरे को ढूंढ लेते हैं, तो वे ऐक्सेस पॉइंट के बिना, दोनों दिशाओं में काम करने वाला 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 डेटा पाथ को सेट अप करने की प्रोसेस को आसान बना दिया गया है. पिछले वर्शन में, अनुरोध करने वाले डिवाइस का MAC पता देने के लिए 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. देखें कि डिवाइस पर PackageManager एपीआई के साथ Wi-Fi Aware काम करता है या नहीं. इसके लिए, यहां दिया गया तरीका अपनाएं:

    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 Direct, SoftAP या टेदरिंग का इस्तेमाल करने पर, Wi-Fi Aware की सुविधा काम न करे. यह देखने के लिए कि फ़िलहाल Wi-Fi Aware की सुविधा उपलब्ध है या नहीं, isAvailable() को कॉल करें.

    Wi-Fi Aware की उपलब्धता कभी भी बदल सकती है. आपके ऐप्लिकेशन को BroadcastReceiver रजिस्टर करना चाहिए, ताकि उसे ACTION_WIFI_AWARE_STATE_CHANGED मिल सके. 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 सेशन बनाती है. यह नेमस्पेस, इसमें बनाए गए सभी डिस्कवरी सेशन के लिए कंटेनर के तौर पर काम करता है.

अगर ऐप्लिकेशन अटैच हो जाता है, तो सिस्टम 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 इन दो तरीकों में से किसी एक से मिलता है:

    • आपका ऐप्लिकेशन कोई सेवा पब्लिश करता है और उसे किसी सदस्य से मैसेज मिलता है. आपका ऐप्लिकेशन, सदस्य की PeerHandle को onMessageReceived() कॉलबैक से पाता है.
    • आपका ऐप्लिकेशन किसी सेवा की सदस्यता लेता है. इसके बाद, जब इसे मैच करने वाला पब्लिशर मिलता है, तो आपके ऐप्लिकेशन को 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. ConnectivityManager का इस्तेमाल करके, पब्लिशर से Wi-Fi Aware नेटवर्क का अनुरोध करें. इसके लिए, WifiAwareNetworkSpecifier का इस्तेमाल करें. साथ ही, डिस्कवरी सेशन और सदस्य के 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 RTT API, Wi-Fi Aware पीयर को सीधे तौर पर रेंज करने की अनुमति देता है. इसके लिए, पीयर के MAC पते या PeerHandle का इस्तेमाल किया जाता है.

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

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

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

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

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

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

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