2012-12-14 30 views
9

Tôi đang làm luận án Thạc sĩ của mình tại thời điểm trên định vị WiFi và để kiểm tra các thuật toán của tôi, tôi cần thu thập một số dữ liệu.Có cách nào để kiểm soát rõ ràng khoảng quét WiFi trong Android không?

Để làm điều này, tôi đã viết một chương trình ngắn và rất đơn giản cho Android, chỉ cần thu thập RSSI cho tất cả các điểm truy cập có thể tìm thấy được mỗi lần quét và lưu chúng vào tệp. Tôi đã thiết lập một BroadcastReceiver lắng nghe trên các sự kiện WifiManager.SCAN_RESULTS_AVAILABLE_ACTION và tôi sử dụng một Timer, đây gọi là tim, để bắt đầu quét với một WifiManager, gọi wifi như sau:

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

Vấn đề tôi đang gặp bây giờ là các quét khởi xướng dường như không xảy ra mỗi giây ngay cả khi tôi thành công trong việc khởi tạo chúng và tất cả bây giờ và sau đó có quét khác bắt đầu từ một số ứng dụng khác được ghi lại là tốt.

Có cách nào dễ dàng để quét trên một khoảng thời gian đã định và không nhận được quét do một số ứng dụng khác khởi xướng không?

Toàn bộ ứng dụng có thể được tìm thấy trên https://github.com/while/RSSIMiner nếu ứng dụng trợ giúp theo bất kỳ cách nào.

Trả lời

4

Có cách nào dễ dàng để quét trên một khoảng thời gian đã định không?

Nếu điều này không hoạt động tốt, tôi không sợ. Theo kinh nghiệm của tôi, các phương pháp "liên quan đến phần cứng" có thể không hoạt động chính xác như định nghĩa của chúng. Ví dụ: tôi đã từng tạo một ứng dụng nhỏ ghi lại vị trí của bạn sau mỗi X phút. Vì vậy, tôi gọi requestLocationUpdates với một số thông số minTime. Nhưng điện thoại của tôi chỉ đơn giản là bỏ qua giá trị minTime, và tôi nhận được thông tin cập nhật từ GPS ngay sau khi chúng có sẵn, whcih không phải là những gì tôi muốn. Tôi đã đăng câu hỏi về vấn đề này tại đây và nhận được câu trả lời là this, từ đó chúng tôi biết rằng trước khi đậu thạch, các thiết bị có thể đơn giản bỏ qua giá trị này ...

Vì vậy,. Tôi sẽ cố gắng chạy mã này trên phiên bản Android mới nhất. Và tôi không hiểu nhiều về Wifi, nhưng không phải là 1 giây một khoảng thời gian quá thường xuyên để quét? Có lẽ hệ thống không bỏ qua yêu cầu quét (Vì vậy, nó trả về true) nhưng phần cứng không?

Chúng tôi có thể bỏ qua quá trình quét do một số ứng dụng khác khởi xướng không?

Theo như tôi biết, nó cũng tiêu cực ở đây. Không có tính năng bổ sung nào trong chương trình phát sóng SCAN_RESULTS_AVAILABLE_ACTION để bạn không thể biết ứng dụng nào đã bắt đầu quá trình quét.

Giải pháp tốt nhất là để defnie yêu cầu của bạn. Bạn có thể sử dụng số ScanResult.timestamp để xác định xem bạn có nên sử dụng kết quả này hay không. Ví dụ: nếu bạn đang cố gắng lấy RSSI cho mỗi điểm truy cập mỗi giây, bạn có thể so sánh BSSID hiện tại với BSSID trước đó. Nếu BSSID hiện tại được đưa vào kết quả quét từ giây cuối cùng, bạn có thể đơn giản bỏ qua nó. Sau đó, không quan trọng bạn nhận được bao nhiêu kết quả.

Giải pháp khác đơn giản hơn nhiều là tạo một boolean gọi là scanInitiated và đặt thành true khi bắt đầu quét. Khi nhận được broacast, chỉ sử dụng dữ liệu nếu scanInitiatedtrue, và sau đó đặt nó thành false. Điều này không quá đáng tin cậy khi khoảng thời gian ngắn, nhưng trong khoảng thời gian dài nó sẽ hoạt động tốt.

+1

Cảm ơn bạn đã phản hồi ngay cả khi đó không phải là tin tuyệt vời. Tôi sợ rằng đây là trường hợp. Tôi đã thử các ứng dụng trong một mối quan hệ Galaxy và Nexus 7 cả hai chạy jellybean (+) vì vậy không có may mắn có một trong hai. Vấn đề là mô hình của tôi giả định khoảng thời gian thường xuyên vì vậy tôi đoán tôi sẽ phải thay đổi nó để xử lý các khoảng quét không đồng nhất. – while

+1

Điều kỳ lạ là nó quản lý để quét một nơi nào đó khoảng 1sec khoảng nếu thiết lập để 500ms vì vậy nó phải hỗ trợ nó phần cứng khôn ngoan. – while

+0

Yea, như tôi đã đề xuất trong giải pháp đầu tiên - bạn chỉ nên chọn và sử dụng các kết quả được yêu cầu, không phải mọi kết quả bạn nhận được. Điều này sẽ giúp bạn khắc phục cả hai vấn đề. – Jong

Các vấn đề liên quan