आप उपलब्ध कराई गई वाई-फ़ाई जगह की जानकारी की सुविधा का इस्तेमाल कर सकते हैं वाई-फ़ाई आरटीटी (दोतरफ़ा यात्रा का समय) एपीआई आस-पास के आरटीटी की सुविधा वाले वाई-फ़ाई ऐक्सेस पॉइंट और मिलते-जुलते ऐप्लिकेशन की दूरी मापने के लिए वाई-फ़ाई अवेयर डिवाइस.
अगर तीन या उससे ज़्यादा ऐक्सेस पॉइंट की दूरी मापी जाती है, तो मल्टीलेटेशन एल्गोरिदम की मदद से, उन डिवाइस की पोज़िशन का पता लगाया जा सकता है जो उनके लिए सबसे सही हैं माप. आम तौर पर, नतीजा एक से दो मीटर के अंदर सटीक हो जाता है.
इस सटीक जानकारी के साथ, आप सटीक स्थान-आधारित सेवाएं विकसित कर सकते हैं, जैसे के रूप में, साफ़ तौर पर आवाज़ से कंट्रोल करने की सुविधा का इस्तेमाल करें (उदाहरण के लिए, "इसे चालू करें" हालांकि, लाइट” और जगह के आधार पर जानकारी (उदाहरण के लिए, "क्या कोई खास ऑफ़र उपलब्ध है" ?")
डेटा मेज़र करने के लिए, अनुरोध करने वाले डिवाइस को ऐक्सेस पॉइंट से कनेक्ट करने की ज़रूरत नहीं है वाई-फ़ाई आरटीटी की मदद से तय की गई दूरी. निजता बनाए रखने के लिए, सिर्फ़ अनुरोध करने वाला डिवाइस ही ऐक्सेस पॉइंट की दूरी तय करने के लिए; ऐक्सेस पॉइंट के पास ऐसा नहीं है यह जानकारी. फ़ोरग्राउंड ऐप्लिकेशन के लिए, वाई-फ़ाई से रीयल-टाइम में मैसेज भेजने की सुविधा (आरटीटी) अनलिमिटेड है, लेकिन बैकग्राउंड में चलने वाले ऐप्लिकेशन के लिए थ्रॉटल किया जाता है.
वाई-फ़ाई आरटीटी और फ़ाइन-टाइम-मेज़रमेंट (एफ़टीएम) से जुड़ी सुविधाएं आईईईई 802.11-2016 मानक के मुताबिक तय किए गए हैं. वाई-फ़ाई आरटीटी के लिए, सटीक समय ज़रूरी है FTM से मिली माप, क्योंकि यह दो के बीच की दूरी की गणना करती है इसके बीच, डिवाइसों के बीच आने-जाने में पैकेट के लिए लगने वाले समय को मापता है और उस समय को प्रकाश की गति से गुणा कर रहा है.
Android वर्शन के आधार पर लागू करने में अंतर
वाई-फ़ाई आरटीटी को Android 9 (एपीआई लेवल 28) में पेश किया गया था. इस प्रोटोकॉल का इस्तेमाल करते समय चल रहे डिवाइसों के साथ, मल्टीलेटेशन का इस्तेमाल करके किसी डिवाइस की पोज़िशन पता करने के लिए Android 9 के लिए, आपके पास पहले से तय किए गए ऐक्सेस पॉइंट (एपी) की जगह की जानकारी का ऐक्सेस होना चाहिए डेटा शामिल है. इस डेटा को सेव और वापस पाने का तरीका आपको तय करना है.
Android 10 (एपीआई लेवल 29) और उसके बाद के वर्शन वाले डिवाइसों पर, एपी लोकेशन डेटा
इस रूप में दिखाया जाता है
ResponderLocation
ऑब्जेक्ट, जिनमें अक्षांश, देशांतर, और ऊंचाई शामिल हैं. उन वाई-फ़ाई आरटीटी एपी के लिए जो
सहायता स्थान कॉन्फ़िगरेशन जानकारी/स्थान नागरिक रिपोर्ट (LCI/LCR डेटा),
प्रोटोकॉल इस अवधि के दौरान एक ResponderLocation
ऑब्जेक्ट दिखाएगा
रेंज की प्रोसेस.
इस सुविधा की मदद से, ऐप्लिकेशन सीधे तौर पर APs से उनकी पोज़िशन के बारे में क्वेरी कर सकते हैं करने की ज़रूरत नहीं होगी. इस तरह, आपका ऐप्लिकेशन ये काम कर पाएगा APs को ढूंढने और उनकी पोज़िशन जानने का तरीका. भले ही, AP को पहले न पता हो. जैसे, जब कोई उपयोगकर्ता किसी नई इमारत में घुसता है.
ज़रूरी शर्तें
- रेंज का अनुरोध करने वाले डिवाइस के हार्डवेयर को, 802.11-2016 FTM मानक.
- रेंज का अनुरोध करने वाला डिवाइस, Android 9 (एपीआई लेवल) पर चल रहा होना चाहिए 28) या उससे बाद का वर्शन है.
- रेंज का अनुरोध करने वाले डिवाइस में, जगह की जानकारी की सुविधा चालू होनी चाहिए और वाई-फ़ाई स्कैनिंग चालू हो जाए (सेटिंग > जगह की जानकारी के तहत).
- अगर रेंज अनुरोध को टारगेट कर रहा ऐप्लिकेशन
Android 13 (एपीआई लेवल 33) या उसके बाद वाला वर्शन, इसमें
NEARBY_WIFI_DEVICES
अनुमति. अगर ऐसा कोई ऐप्लिकेशन Android के पुराने वर्शन को टारगेट करता है, तो उसे उसके पासACCESS_FINE_LOCATION
तो अनुमति नहीं है. - अगर ऐप्लिकेशन दिख रहा है या वह यहां है, तो ऐप्लिकेशन को ऐक्सेस पॉइंट की रेंज के बारे में क्वेरी करनी होगी फ़ोरग्राउंड सेवा का इस्तेमाल किया जाता है. ऐप्लिकेशन बैकग्राउंड.
- ऐक्सेस पॉइंट को आईईईई 802.11-2016 एफ़टीएम मानक लागू करना होगा.
सेटअप
अपने ऐप्लिकेशन को वाई-फ़ाई आरटीटी की सुविधा के लिए सेट अप करने के लिए, यहां दिया गया तरीका अपनाएं.
1. अनुमतियां मांगें
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में इन अनुमतियों का अनुरोध करें:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 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" />
NEARBY_WIFI_DEVICES
और ACCESS_FINE_LOCATION
की अनुमतियां खतरनाक हैं
अनुमतियां दी हैं, ताकि जब भी उपयोगकर्ता चाहे, आपको रनटाइम पर उसके लिए अनुरोध करना पड़े
आरटीटी स्कैन करें. आपके ऐप्लिकेशन को उपयोगकर्ता की जानकारी का अनुरोध करना होगा
की अनुमति नहीं दी गई है. Reader Revenue Manager को सेट अप करने के बारे में
रनटाइम अनुमतियों के बारे में जानने के लिए,
ऐप्लिकेशन अनुमतियों का अनुरोध करें.
2. देखें कि डिवाइस पर वाई-फ़ाई आरटीटी की सुविधा काम करती है या नहीं
डिवाइस में वाई-फ़ाई आरटीटी की सुविधा है या नहीं, यह देखने के लिए पैकेज मैनेजर एपीआई:
Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
3. देखें कि वाई-फ़ाई आरटीटी उपलब्ध है या नहीं
डिवाइस पर वाई-फ़ाई आरटीटी मौजूद हो सकता है. हालांकि, ऐसा हो सकता है कि यह अभी उपलब्ध न हो, क्योंकि उपयोगकर्ता ने वाई-फ़ाई बंद कर दिया है. उनके हार्डवेयर और फ़र्मवेयर के आधार पर कुछ डिवाइस में वाई-फ़ाई आरटीटी की सुविधा काम नहीं करती, तो हो सकता है कि सॉफ़्टएपी या टेदरिंग इस्तेमाल किया जा रहा है. यह देखने के लिए कि फ़िलहाल वाई-फ़ाई आरटीटी उपलब्ध है या नहीं, कॉल करें isAvailable().
वाई-फ़ाई आरटीटी की सुविधा, किसी भी समय बदल सकती है. आपके ऐप्लिकेशन को ब्रॉडकास्ट रिसीवर रिसीव करने के लिए ACTION_ Wifi_RTT_स्टेट_CHANGED, इसे तब भेजा जाता है, जब खरीदारी के लिए उपलब्धता में बदलाव होता है. आपके ऐप्लिकेशन को ब्रॉडकास्ट मिलने पर इंटेंट के हिसाब से, ऐप्लिकेशन को उपलब्धता की मौजूदा स्थिति की जांच करनी चाहिए और के हिसाब से व्यवहार करता है.
उदाहरण के लिए:
Kotlin
val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED) val myReceiver = object: BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (wifiRttManager.isAvailable) { … } else { … } } } context.registerReceiver(myReceiver, filter)
Java
IntentFilter filter = new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED); BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (wifiRttManager.isAvailable()) { … } else { … } } }; context.registerReceiver(myReceiver, filter);
ज़्यादा जानकारी के लिए, ब्रॉडकास्ट पढ़ें.
रेंज के लिए अनुरोध करें
रेंज से जुड़ा अनुरोध (RangingRequest) ने इसे बनाया है AP या वाई-फ़ाई अवेयर पीयर की सूची के तौर पर जिसमें किसी रेंज को शामिल किया गया हो का अनुरोध किया गया है. एक से ज़्यादा ऐक्सेस पॉइंट या वाई-फ़ाई अवेयर पीयर की जानकारी रेंज में आने वाला अनुरोध; सभी डिवाइसों की दूरियों को मापा जाता है और वापस कर दिया जाता है.
उदाहरण के लिए, कोई अनुरोध addAccessPoint() :
Kotlin
val req: RangingRequest = RangingRequest.Builder().run { addAccessPoint(ap1ScanResult) addAccessPoint(ap2ScanResult) build() }
Java
RangingRequest.Builder builder = new RangingRequest.Builder(); builder.addAccessPoint(ap1ScanResult); builder.addAccessPoint(ap2ScanResult); RangingRequest req = builder.build();
पहुंच बिंदु की पहचान इसके
Scanresult ऑब्जेक्ट जो यह हो सकता है
कॉल करने पर मिला
WifiManager.getScanresults().
Google Analytics 4 पर माइग्रेट करने के लिए,
addAccessPoints(सूची
इसी तरह, रेंज में किसी डिवाइस के MAC का इस्तेमाल करके, वाई-फ़ाई अवेयर पीयर को जोड़ा जा सकता है या उसका PeerHandle इस्तेमाल करें. यह addWifiAwarePeer(MacAddress पीयर) और addWifiAwarePeer(PeerHandle पीयर) विधियों का भी इस्तेमाल किया जा सकता है. वाई-फ़ाई अवेयर पीयर खोजने के बारे में ज़्यादा जानकारी के लिए, वाई-फ़ाई अवेयर दस्तावेज़ देखें.
अनुरोध की रेंज
कोई ऐप्लिकेशन, WifiRttManager.startRanging() और नीचे दी गई चीज़ें मुहैया कराना न भूलें: RangingRequest: ऑपरेशन, यह तय करने के लिए एक एक्ज़िकेटर कॉलबैक कॉन्टेक्स्ट, और RangingresultsCallback खोजें.
उदाहरण के लिए:
Kotlin
val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager val request: RangingRequest = myRequest mgr.startRanging(request, executor, object : RangingResultCallback() { override fun onRangingResults(results: List<RangingResult>) { … } override fun onRangingFailure(code: Int) { … } })
Java
WifiRttManager mgr = (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE); RangingRequest request ...; mgr.startRanging(request, executor, new RangingResultCallback() { @Override public void onRangingFailure(int code) { … } @Override public void onRangingResults(List<RangingResult> results) { … } });
रेंजिंग ऑपरेशन एसिंक्रोनस तरीके से किए जाते हैं और रेंज के नतीजे इसके कॉलबैक में से किसी एक में लौटाया जाता है RangingresultsCallback:
- अगर पूरी रेंज ऑपरेशन सफल नहीं होता, onRangingFailure कॉलबैक यहां बताए गए स्टेटस कोड के साथ ट्रिगर होता है RangingresultsCallback. ऐसी गड़बड़ी तब हो सकती है, जब सेवा रेंज से जुड़ी कार्रवाई नहीं कर पाती समय पर--उदाहरण के लिए, क्योंकि वाई-फ़ाई अक्षम है, इसलिए ऐप्लिकेशन ने बहुत ज़्यादा रेंज ऑपरेशन का अनुरोध किया है और उसे थ्रॉटल कर दिया गया है या किसी वजह से अनुमति से जुड़ी समस्या है.
- रेंजिंग ऑपरेशन पूरा होने के बाद, onRanging के नतीजे कॉलबैक को उन नतीजों की सूची के साथ ट्रिगर किया जाता है जो अनुरोध--हर अनुरोध के लिए एक नतीजा. नतीजों का क्रम ऐसा नहीं होता अनुरोधों के क्रम से मेल खाना चाहिए. ध्यान दें कि रेंज पूरा नहीं किया है, लेकिन फिर भी हर नतीजे से पता चलता है कि वह गड़बड़ी है और उन्हें मापा जा सकता है.
रेंज के नतीजों की व्याख्या करना
हर नतीजे को onRanging के नतीजे कॉलबैक को Rangingresults से तय किया जाता है ऑब्जेक्ट है. हर अनुरोध पर, ये काम करें.
1. अनुरोध की पहचान करें
हमने
RangingRequest:
आम तौर पर, ScanResult
में दिया गया MAC पता होता है, जो ऐक्सेस की पहचान करता है
अंक. MAC पते को
getMacAddress()
तरीका.
रेंज में उपलब्ध नतीजों की सूची, मिलते-जुलते ऐप्लिकेशन की तुलना में अलग-अलग हो सकती है (ऐक्सेस पॉइंट) सीमा में बताए गए हैं, इसलिए आपको MAC पते का इस्तेमाल करके मिलते-जुलते ऐप्लिकेशन की पहचान करें, न कि नतीजों के क्रम की.
2. यह पता लगाना कि हर एक मेज़रमेंट सही तरीके से हुआ या नहीं
यह पता लगाने के लिए कि मेज़रमेंट सही से हुआ है या नहीं, इसका इस्तेमाल करें
getStatus()
तरीका. इसके अलावा कोई भी अन्य मान
STATUS_सफल
गड़बड़ी दिखाता है. गड़बड़ी का मतलब है कि इस नतीजे के अन्य सभी फ़ील्ड
(ऊपर दिए गए अनुरोध पहचान को छोड़कर) अमान्य हैं और
get*
तरीका इस वाक्य से काम नहीं करेगा:
गैर-कानूनी स्टेट अपवाद अपवाद.
3. हर सही मेज़रमेंट के लिए नतीजे पाना
हर एक सफल मेज़रमेंट के लिए,
संबंधित get
तरीके:
दूरी, मि॰मी॰ में, और माप का मानक विचलन:
माप के लिए इस्तेमाल किए गए पैकेट का आरएसएसआई:
मिलीसेकंड में वह समय जब माप लिया गया था (समय को दिखाता है बूट के बाद से):
आज़माए गए मापों की संख्या और मापों की संख्या जो सफल रही (और जिस पर दूरी की माप आधारित हैं):
वाई-फ़ाई आरटीटी की सुविधा वाले Android डिवाइस
यहां दी गई टेबल में कुछ फ़ोन, ऐक्सेस पॉइंट, और रीटेल, वेयरहाउसिंग, और डिस्ट्रिब्यूशन सेंटर डिवाइसों की सूची दी गई है जो वाई-फ़ाई-आरटीटी के साथ काम करते हैं. इनमें पूरी जानकारी शामिल नहीं है. हमारा सुझाव है कि आप हमसे संपर्क करें ताकि आरटीटी की सुविधा वाले अपने प्रॉडक्ट यहां लिस्ट किए जा सकें.
ऐक्सेस पॉइंट
निर्माता और मॉडल | सहायता की तारीख |
---|---|
Nest Wifi Pro (वाई-फ़ाई 6E) | इनकी अनुमति है |
कंपलाब वाइल्ड एपी | इनकी अनुमति है |
Google वाई-फ़ाई | इनकी अनुमति है |
Google Nest का वाई-फ़ाई राऊटर | इनकी अनुमति है |
Google Nest वाई-फ़ाई पॉइंट | इनकी अनुमति है |
अरूबा AP-635 | इनकी अनुमति है |
सिस्को 9130 | इनकी अनुमति है |
सिस्को 9136 | इनकी अनुमति है |
सिस्को 9166 | इनकी अनुमति है |
सिस्को 9164 | इनकी अनुमति है |
अरूबा AP-505 | इनकी अनुमति है |
अरूबा एपी-515 | इनकी अनुमति है |
अरूबा AP-575 | इनकी अनुमति है |
अरूबा एपी-518 | इनकी अनुमति है |
अरूबा एपी-505एच | इनकी अनुमति है |
अरूबा AP-565 | इनकी अनुमति है |
अरूबा एपी-535 | इनकी अनुमति है |
फ़ोन
निर्माता और मॉडल | Android वर्शन |
---|---|
Pixel 6 | 9 से ज़्यादा |
Pixel 6 Pro | 9 से ज़्यादा |
Pixel 5 | 9 से ज़्यादा |
Pixel 5a | 9 से ज़्यादा |
Pixel 5a (5G) | 9 से ज़्यादा |
Xiaomi Mi 10 Pro | 9 से ज़्यादा |
Xiaomi Mi 10 | 9 से ज़्यादा |
Xiaomi Redmi Mi 9T Pro | 9 से ज़्यादा |
Xiaomi Mi 9T | 9 से ज़्यादा |
Xiaomi Mi 9 | 9 से ज़्यादा |
Xiaomi Mi Note 10 | 9 से ज़्यादा |
Xiaomi Mi Note 10 Lite | 9 से ज़्यादा |
Xiaomi Redmi Note 9S | 9 से ज़्यादा |
Xiaomi Redmi Note 9 Pro | 9 से ज़्यादा |
Xiaomi Redmi Note 8T | 9 से ज़्यादा |
Xiaomi Redmi Note 8 | 9 से ज़्यादा |
Xiaomi Redmi K30 Pro | 9 से ज़्यादा |
Xiaomi Redmi K20 Pro | 9 से ज़्यादा |
Xiaomi Redmi के20 | 9 से ज़्यादा |
Xiaomi Redmi Note 5 Pro | 9 से ज़्यादा |
Xiaomi Mi CC9 Pro | 9 से ज़्यादा |
LG G8X ThinQ | 9 से ज़्यादा |
LG V50S थिनक्यू | 9 से ज़्यादा |
LG V60 थिनक्यू | 9 से ज़्यादा |
LG V30 | 9 से ज़्यादा |
Samsung Galaxy Note 10+ 5G | 9 से ज़्यादा |
Samsung Galaxy S20 और 5G | 9 से ज़्यादा |
Samsung Galaxy S20 और इसके बाद के वर्शन | 9 से ज़्यादा |
Samsung Galaxy S20 5G | 9 से ज़्यादा |
Samsung Galaxy S20 Ultra 5G | 9 से ज़्यादा |
Samsung Galaxy S20 | 9 से ज़्यादा |
Samsung Galaxy Note 10 और उसके बाद के वर्शन | 9 से ज़्यादा |
Samsung Galaxy Note 10 5G | 9 से ज़्यादा |
Samsung Galaxy Note 10 | 9 से ज़्यादा |
Samsung A9 Pro | 9 से ज़्यादा |
Google Pixel 4 XL | 9 से ज़्यादा |
Google Pixel 4 | 9 से ज़्यादा |
Google Pixel 4a | 9 से ज़्यादा |
Google Pixel 3 XL | 9 से ज़्यादा |
Google Pixel 3 | 9 से ज़्यादा |
Google Pixel 3a XL | 9 से ज़्यादा |
Google Pixel 3a | 9 से ज़्यादा |
Google Pixel 2 XL | 9 से ज़्यादा |
Google Pixel 2 | 9 से ज़्यादा |
Google Pixel 1 XL | 9 से ज़्यादा |
Google Pixel 1 | 9 से ज़्यादा |
पोको एक्स2 | 9 से ज़्यादा |
शार्प ऐक्वोस R3 SH-04L | 9 से ज़्यादा |
रीटेल, वेयरहाउसिंग और डिस्ट्रिब्यूशन सेंटर से जुड़े डिवाइस
निर्माता और मॉडल | Android वर्शन |
---|---|
ज़ीब्रा PS20 | 10.0 से ज़्यादा |
ज़ेब्रा TC52/TC52HC | 10.0 से ज़्यादा |
ज़ीब्रा टीसी57 | 10.0 से ज़्यादा |
ज़ीब्रा टीसी72 | 10.0 से ज़्यादा |
ज़ीब्रा टीसी77 | 10.0 से ज़्यादा |
ज़ेब्रा MC93 | 10.0 से ज़्यादा |
ज़ीब्रा TC8300 | 10.0 से ज़्यादा |
zebra VC8300 | 10.0 से ज़्यादा |
ज़ीब्रा EC30 | 10.0 से ज़्यादा |
ज़ीब्रा ET51 | 10.0 से ज़्यादा |
ज़ीब्रा ET56 | 10.0 से ज़्यादा |
ज़ीब्रा एल10 | 10.0 से ज़्यादा |
ज़ेब्रा CC600/CC6000 | 10.0 से ज़्यादा |
ज़ेब्रा MC3300x | 10.0 से ज़्यादा |
ज़ेब्रा MC330x | 10.0 से ज़्यादा |
ज़ीब्रा TC52x | 10.0 से ज़्यादा |
ज़ीब्रा TC57x | 10.0 से ज़्यादा |
zebra EC50 (LAN और HC) | 10.0 से ज़्यादा |
zebra EC55 (WAN) | 10.0 से ज़्यादा |
ज़ीब्रा WT6300 | 10.0 से ज़्यादा |
स्कोर्पियो X5 | 10.0 से ज़्यादा |