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()तरीके का इस्तेमाल करके, उपलब्ध डेटा पाथ, पब्लिश सेशन, और सदस्यता सेशन की संख्या का पता लगा सकते हैं. इससे ऐप्लिकेशन को यह तय करने में मदद मिल सकती है कि उसके टारगेट फ़ंक्शन को लागू करने के लिए, ज़रूरी संसाधन उपलब्ध हैं या नहीं.
शुरुआती सेट अप
अपने ऐप्लिकेशन को Wi-Fi Aware की मदद से डिवाइसों को खोजने और नेटवर्किंग के लिए सेट अप करने के लिए, यह तरीका अपनाएं:
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में इन अनुमतियों का अनुरोध करें:
<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" />PackageManagerएपीआई की मदद से, यह देखें कि डिवाइस में Wi-Fi Aware की सुविधा काम करती है या नहीं:Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);देखें कि Wi-Fi Aware की सुविधा उपलब्ध है या नहीं. ऐसा हो सकता है कि डिवाइस पर Wi-Fi Aware की सुविधा मौजूद हो, लेकिन वह उपलब्ध न हो. ऐसा इसलिए, क्योंकि उपयोगकर्ता ने वाई-फ़ाई या जगह की जानकारी की सुविधा बंद कर दी है. हार्डवेयर और फ़र्मवेयर की क्षमताओं के आधार पर, कुछ डिवाइसों पर Wi-Fi Aware की सुविधा काम नहीं करती. ऐसा तब होता है, जब Wi-Fi Direct, SoftAP या टेदरिंग का इस्तेमाल किया जा रहा हो. वाई-फ़ाई अवेयर की सुविधा उपलब्ध है या नहीं, यह देखने के लिए
isAvailable()को कॉल करें.वाई-फ़ाई अवेयर की उपलब्धता कभी भी बदल सकती है.
ACTION_WIFI_AWARE_STATE_CHANGEDपाने के लिए,BroadcastReceiverको रजिस्टर करें. यह सूचना, उपलब्धता में बदलाव होने पर भेजी जाती है. जब आपके ऐप्लिकेशन को ब्रॉडकास्ट इंटेंट मिलता है, तो सभी मौजूदा सेशन खारिज कर दें. यह मान लें कि 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 की सुविधा वाले दो डिवाइसों के बीच क्लाइंट-सर्वर नेटवर्किंग की सुविधा देती है.
क्लाइंट-सर्वर कनेक्शन सेट अप करने के लिए:
कोई सेवा पब्लिश करने और किसी सेवा की सदस्यता लेने के लिए, Wi-Fi Aware डिस्कवरी का इस्तेमाल करें.
सदस्यता लेने वाले व्यक्ति को पब्लिशर की जानकारी मिलने के बाद, सदस्यता लेने वाले व्यक्ति की ओर से पब्लिशर को एक मैसेज भेजें.
पब्लिशर डिवाइस पर
ServerSocketशुरू करें और उसका पोर्ट सेट करें या पाएं:Kotlin
val ss = ServerSocket(0) val port = ss.localPortJava
ServerSocket ss = new ServerSocket(0); int port = ss.getLocalPort();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) { ... } }; connMgr.requestNetwork(myNetworkRequest, callback);पब्लिशर के नेटवर्क का अनुरोध करने के बाद, सदस्य को एक मैसेज भेजें.
सदस्य को पब्लिशर से मैसेज मिलने के बाद, सदस्य के डिवाइस पर Wi-Fi Aware नेटवर्क का अनुरोध करें. इसके लिए, उसी तरीके का इस्तेमाल करें जो पब्लिशर के डिवाइस पर किया गया था.
NetworkSpecifierबनाते समय, पोर्ट की जानकारी न दें. इंटरनेट कनेक्शन उपलब्ध होने, बदलने या बंद होने पर, कॉलबैक के सही तरीके कॉल किए जाते हैं.सब्सक्राइबर पर
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);इंटरनेट कनेक्शन सेट अप करने के बाद,
unregisterNetworkCallback()पर कॉल करें.
आस-पास मौजूद डिवाइसों की रेंज का पता लगाना और जगह की जानकारी के आधार पर डिवाइसों को ढूंढना
वाई-फ़ाई आरटीटी की मदद से जगह की जानकारी देने की सुविधा वाले डिवाइस, आस-पास मौजूद डिवाइसों की दूरी का सीधे तौर पर पता लगा सकते हैं. साथ ही, इस जानकारी का इस्तेमाल करके, Wi-Fi Aware की मदद से डिवाइस और सेवाओं की अपने-आप पहचान करने की सुविधा को सीमित कर सकते हैं.
Wi-Fi RTT API, Wi-Fi Aware की सुविधा वाले किसी पीयर डिवाइस की दूरी का पता लगाने की सुविधा देता है. इसके लिए, उस डिवाइस के मैक पते या PeerHandle का इस्तेमाल किया जाता है.
वाई-फ़ाई अवेयर की मदद से, किसी खास जियोफ़ेंस में मौजूद सेवाओं को ही खोजा जा सकता है. उदाहरण के लिए, ऐसा जियोफ़ेंस सेट अप किया जा सकता है जो Aware_File_Share_Service_Name सेवा पब्लिश करने वाले डिवाइस का पता लगा सके. यह डिवाइस, तीन मीटर (3,000 मि॰मी॰) से कम और 10 मीटर (10,000 मि॰मी॰) से ज़्यादा दूर नहीं होना चाहिए.
जियोफ़ेंसिंग की सुविधा चालू करने के लिए, पब्लिशर और सदस्य, दोनों को कार्रवाई करनी होगी:
पब्लिशर को
setRangingEnabled(true)का इस्तेमाल करके, पब्लिश की गई सेवा पर रेंजिंग की सुविधा चालू करनी होगी.अगर पब्लिशर, रेंजिंग की सुविधा चालू नहीं करता है, तो सदस्य की ओर से तय की गई जियोफ़ेंस की सभी पाबंदियों को अनदेखा कर दिया जाता है. साथ ही, दूरी को अनदेखा करते हुए सामान्य तरीके से खोज की जाती है.
सदस्य को
setMinDistanceMm()औरsetMaxDistanceMm()के कुछ कॉम्बिनेशन का इस्तेमाल करके, जियोफ़ेंस की जानकारी देनी होगी.दोनों में से किसी भी वैल्यू के लिए, दूरी तय न करने का मतलब है कि कोई सीमा नहीं है. सिर्फ़ ज़्यादा से ज़्यादा दूरी तय करने का मतलब है कि कम से कम दूरी 0 है. सिर्फ़ कम से कम दूरी तय करने का मतलब है कि ज़्यादा से ज़्यादा दूरी तय नहीं की गई है.
जब किसी जियोफ़ेंस में कोई पीयर सर्विस मिलती है, तो onServiceDiscoveredWithinRange कॉलबैक ट्रिगर होता है. इससे पीयर की दूरी का पता चलता है. इसके बाद, ज़रूरत पड़ने पर दूरी का पता लगाने के लिए, डायरेक्ट वाई-फ़ाई आरटीटी एपीआई को कॉल किया जा सकता है.