2012-12-14 18 views
9

मैं इस समय वाईफाई पोजीशनिंग पर अपने मास्टर थीसिस कर रहा हूं और मेरे एल्गोरिदम का परीक्षण करने के लिए मुझे कुछ डेटा एकत्र करने की आवश्यकता है।एंड्रॉइड में वाईफाई स्कैन अंतराल को स्पष्ट रूप से नियंत्रित करने का कोई तरीका है?

ऐसा करने के लिए मैंने एंड्रॉइड के लिए एक छोटा और बहुत ही सरल कार्यक्रम लिखा है जो प्रत्येक स्कैन द्वारा प्राप्त सभी उपलब्ध पहुंच बिंदुओं के लिए आरएसएसआई एकत्र करता है और उन्हें फ़ाइल में सहेजता है। मैं एक BroadcastReceiver कि घटना WifiManager.SCAN_RESULTS_AVAILABLE_ACTION पर सुनता है की स्थापना की है और मैं एक Timer, यहां टिम बुलाया का उपयोग करें, इस प्रकार है, एक WifiManager साथ स्कैन आरंभ करने के लिए वाईफाई कहा जाता है:

tim.schedule(new TimerTask(){ 
     @Override 
     public void run(){ 
      wifi.startScan(); 
     } 
}, 0, 1000); 

समस्या अब मैं कर रहा हूँ वह यह है कि शुरू किए गए स्कैन हर सेकेंड में ऐसा नहीं लगते हैं, भले ही मैं उन्हें और हर बार शुरू करने में सफल रहता हूं और फिर कुछ अन्य ऐप से भी शुरू किए गए अन्य स्कैन भी दर्ज किए जाते हैं।

क्या सेट अंतराल पर स्कैन करने का कोई आसान तरीका है और किसी अन्य ऐप द्वारा शुरू किए गए स्कैन प्राप्त नहीं करते हैं?

संपूर्ण ऐप https://github.com/while/RSSIMiner पर पाया जा सकता है यदि यह किसी भी तरह से मदद करता है।

उत्तर

4

क्या सेट अंतराल पर स्कैन करने का कोई आसान तरीका है?

यदि यह अच्छी तरह से काम नहीं करता है, तो मुझे डर नहीं है। मेरे अनुभव से, "हार्डवेयर से संबंधित" विधियां बिल्कुल उनकी परिभाषा के अनुसार काम नहीं कर सकती हैं। उदाहरण के लिए, मैंने एक बार एक छोटा ऐप बनाया जो प्रत्येक एक्स मिनट में आपकी स्थिति रिकॉर्ड करता है। तो मैं कुछ minTime पैरामीटर के साथ requestLocationUpdates पर कॉल करता हूं। लेकिन मेरा फोन बस minTime मान को अनदेखा करता है, और जैसे ही वे उपलब्ध हैं, मुझे जीपीएस से अपडेट मिलते हैं, जो मैं चाहता हूं वह नहीं है। मैं इसके बारे में यहाँ एक प्रश्न पोस्ट, और this जवाब है, जहाँ से हम सीखते हैं कि जेली बीन करने से पहले, उपकरणों बस यह मान अनदेखा कर सकते हैं ...

तो यह अब ऐसी ही कुछ हो सकता है मिल गया। मैं इस कोड को नवीनतम एंड्रॉइड संस्करण पर चलाने की कोशिश करता हूं। और मैं वाईफ़ाई में इतना समझ नहीं पा रहा हूं, लेकिन स्कैन के लिए 1 सेकंड एक बहुत अंतराल नहीं है? शायद सिस्टम स्कैन अनुरोध को अनदेखा नहीं करता है (इसलिए यह true देता है) लेकिन हार्डवेयर करता है?

क्या हम किसी अन्य ऐप द्वारा शुरू किए गए स्कैन को अनदेखा कर सकते हैं?

जहां तक ​​मुझे पता है, यह भी नकारात्मक है। SCAN_RESULTS_AVAILABLE_ACTION प्रसारण में निहित कोई अतिरिक्तता नहीं है, इसलिए आप नहीं जान सकते कि कौन से ऐप ने स्कैन शुरू किया था।

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

एक और अधिक सरल सोल्यूशन एक बूलियन बनाने के लिए होगा जिसे scanInitiated कहा जाता है और स्कैन शुरू करते समय इसे true पर सेट किया जाएगा। ब्रोकास्ट प्राप्त करते समय, केवल डेटा का उपयोग करें यदि scanInitiatedtrue है, और उसके बाद इसे false पर सेट करें। अंतराल कम होने पर यह इतना विश्वसनीय नहीं होता है, लेकिन लंबे अंतराल के लिए यह बहुत अच्छा काम करेगा।

+1

responce के लिए धन्यवाद, भले ही यह अच्छी खबर न हो। मुझे डर था कि यह मामला था। मैंने ऐप्पल गैलेक्सी नेक्सस और नेक्सस 7 में ऐप्पल की कोशिश की है जिसमें दोनों जेलीबीन (+) चल रहे हैं, इसलिए कोई भाग्य नहीं है। समस्या यह है कि मेरा मॉडल नियमित अंतराल मानता है, इसलिए मुझे लगता है कि मुझे गैर-सजातीय स्कैन अंतराल को संभालने के लिए इसे बदलना होगा। – while

+1

अजीब बात यह है कि अगर यह 500ms पर सेट हो तो लगभग 1sec अंतराल को स्कैन करने का प्रबंधन करता है, इसलिए इसे हार्डवेयर के अनुसार समर्थन करना चाहिए। – while

+0

हाँ, जैसा कि मैंने पहले समाधान में सुझाव दिया था - आपको केवल आवश्यक परिणाम चुनना चाहिए और न ही आपको प्राप्त होने वाले प्रत्येक परिणाम का उपयोग करना चाहिए। यह आपको दोनों समस्याओं को ठीक करने में मदद करेगा। – Jong

संबंधित मुद्दे

 संबंधित मुद्दे