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

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

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

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

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

  • नेटवर्क कनेक्शन बनाएं: दो डिवाइसों को एक-एक करके ढूंढने के बाद ताकि वे एक विज्ञापन बना सकें ऐक्सेस पॉइंट के बिना, दो-तरफ़ा वाई-फ़ाई अवेयर नेटवर्क कनेक्शन.

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

Android 13 (एपीआई लेवल 33) को बेहतर बनाने के लिए किए गए अपडेट

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

Android 12 (एपीआई लेवल 31) को बेहतर बनाने के लिए किए गए अपडेट

Android 12 (एपीआई लेवल 31) की वजह से, वाई-फ़ाई Aware में कुछ बदलाव किए गए हैं:

  • Android 12 (एपीआई लेवल 31) या उसके बाद के वर्शन वाले डिवाइसों पर, onServiceLost() कॉलबैक की वजह से जब आपका ऐप्लिकेशन, खोजी गई किसी सेवा को खो देता है, तो सेवा को रोकना या सीमा से बाहर जाना.
  • वाई-फ़ाई अवेयर डेटा पाथ का सेटअप आसान बनाया गया है. पहले के वर्शन शुरू करने वाले व्यक्ति का MAC पता देने के लिए, L2 मैसेज का इस्तेमाल किया गया, जो पेश किया गया इंतज़ार का समय. Android 12 और उसके बाद के वर्शन वाले डिवाइसों पर, जवाब देने वाला व्यक्ति (सर्वर) को किसी भी पीयर को स्वीकार करने के लिए कॉन्फ़िगर किया जा सकता है—इसका मतलब है कि इसे पहले से ही उसका MAC पता जान लें. इससे डेटापाथ तेज़ी से बढ़ जाता है सिर्फ़ एक नेटवर्क पर, कई पॉइंट-टू-पॉइंट लिंक को चालू करता है अनुरोध.
  • 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 अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है API (एपीआई), जैसा कि नीचे दिखाया गया है:

    Kotlin

    context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
    

    Java

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

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

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

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

सेशन पाना

वाई-फ़ाई अवेयर का इस्तेमाल शुरू करने के लिए, आपके ऐप्लिकेशन को कॉल करके WifiAwareSession attach(). यह तरीका ये काम करता है:

  • वाई-फ़ाई अवेयर हार्डवेयर चालू करता है.
  • यह वाई-फ़ाई अवेयर क्लस्टर में शामिल होता है या बनाया जाता है.
  • एक यूनीक नेमस्पेस के साथ वाई-फ़ाई अवेयर सेशन बनाता है जो कंटेनर, जिसमें बनाए गए सभी डिस्कवरी सेशन का डेटा भी शामिल होता है.

अगर ऐप्लिकेशन सही तरीके से अटैच हो जाता है, तो सिस्टम 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() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉलबैक का तरीका इस्तेमाल किया जाता है. Google आपके यूआरएल पैरामीटर को कैसे इस्तेमाल करेगा, यह तय करने के लिए इस तरीके से 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 कॉलबैक.
    • आपका ऐप्लिकेशन किसी सेवा की सदस्यता लेता है. इसके बाद, जब इसे मिलते-जुलते वीडियो का पता चलता है पब्लिशर, आपके ऐप्लिकेशन को पब्लिशर के PeerHandle onServiceDiscovered() कॉलबैक.

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

  • जब साथी को मैसेज मिल जाता है, तो सिस्टम onMessageSendSucceeded() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है भेजने वाले ऐप्लिकेशन में कॉलबैक का अनुरोध करें.
  • जब मिलते-जुलते ऐप्लिकेशन को मैसेज मिलता है, तो सिस्टम onMessageReceived() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है reciving ऐप्लिकेशन में कॉलबैक कर सकते हैं.

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

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

कनेक्शन बनाएं

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

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

  1. सेवा प्रकाशित करने के लिए वाई-फ़ाई अवेयर खोज का इस्तेमाल करें ( सर्वर) और किसी सेवा की सदस्यता लें ( क्लाइंट).

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

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

    Kotlin

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

    Java

    ServerSocket ss = new ServerSocket(0);
    int port = ss.getLocalPort();
    
  4. ConnectivityManager का इस्तेमाल करके, इसका इस्तेमाल करके प्रकाशक पर वाई-फ़ाई अवेयर नेटवर्क का अनुरोध करें: 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. सदस्य को पब्लिशर से मैसेज मिलने के बाद, वाई-फ़ाई का अनुरोध करें पब्लिशर के तरीके का इस्तेमाल करके, सदस्य पर नेटवर्क के बारे में जानकारी दें. ये काम करें बनाते समय कोई पोर्ट तय नहीं करते NetworkSpecifier. कॉन्टेंट बनाने नेटवर्क कनेक्शन के होने पर उचित कॉलबैक विधियों को कॉल किया जाता है उपलब्ध, बदला या खो गया है.

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

    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().

मिलते-जुलते ऐप्लिकेशन का ग्रुप और जगह की जानकारी का पता लगाने की सुविधा

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

वाई-फ़ाई RTT API, इसकी मदद से सीधे तौर पर वाई-फ़ाई अवेयर पीयर की मदद से मैक पता या उसका PeerHandle.

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

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

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

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

  • सदस्य को जियोफ़ेंस तय करना होगा. ऐसा करने के लिए, सदस्य को इनमें से कुछ setMinSpaceMm और setMaxLengthMm.

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

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