2012-10-23 33 views
6

Tôi đã tự hỏi tôi có thể đo cường độ tín hiệu của các thiết bị Bluetooth trong phạm vi của iPhone của tôi không. Về cơ bản những gì tôi muốn làm là quét cho một danh sách các thiết bị trong phạm vi, và sau đó xem cái nào có cường độ tín hiệu cao nhất. Có thể trong iOS và tôi sẽ làm như thế nào nếu có?Tôi có thể đo cường độ tín hiệu Bluetooth trong iOS không?

Trả lời

5

Có cách đo cường độ tín hiệu cho Bluetooth Low Energy (4.0) là số RSSI. Khi bạn quét các thiết bị ngoại vi, bạn sẽ thiết lập các CBCentralManagerScanOptionAllowDuplicatesKey cờ để YES như hình dưới đây:

NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@YES, CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 

// Start scanning for peripherals 
[cmanager scanForPeripheralsWithServices:nil options:dictionary]; 

Nếu bạn muốn xem công việc số RSSI mà không cần viết bất kỳ mã bạn nên kiểm tra các ứng dụng LightBlue trong iTunes. Khi bạn kết nối với một thiết bị ngoại vi, nó sẽ hiển thị cho bạn số RSSI được cập nhật mỗi giây khi nó được kết nối.

2

Có một cái nhìn đến CoreBluetooth documentation:

- (void)centralManager:(CBCentralManager *)central 
didDiscoverPeripheral:(CBPeripheral *)peripheral 
    advertisementData:(NSDictionary *)advertisementData 
        RSSI:(NSNumber *)RSSI 
{ ... } 

RSSI là những gì bạn đang tìm kiếm. Disclaimer: Core Bluetooth được thực hiện cho Bluetooth 4 LE chỉ.

Nếu phạm vi chính xác không quan trọng, nhưng bạn quan tâm đến việc quét các thiết bị có sẵn nói chung, bạn có thể xem dự án github BeeTee, cho phép bạn quét tất cả các thiết bị Bluetooth xung quanh bạn (không chỉ Bluetooth LE). Một lần nữa tuyên bố từ chối trách nhiệm: Tôi là tác giả của BeeTee. ;-)

0

Khi bạn mã hóa mã 'trung tâm' bằng CBCentralManager, cuối cùng bạn sẽ kết nối với CBPeripheral mà bạn đang tìm kiếm. Khi bạn đã kết nối với thiết bị ngoại vi, hãy tham khảo nó, đặt đối tượng của bạn làm đại biểu của thiết bị ngoại vi và gọi 'readRSSI' trên thiết bị ngoại vi. Bạn sẽ nhận được một cuộc gọi lại đại biểu peripheral: didReadRSSI: error: Nếu bạn viết một phương thức gọi 'readRSSI', bạn có thể gọi nó bằng cách sử dụng performSelector: withObject: afterDelay:.

Một trong những câu trả lời được đề xuất cho câu hỏi này là cung cấp khóa 'cho phép trùng lặp' khi quét. Các tài liệu cho khóa từ điển CBCentralManagerScanOptionAllowDuplicatesKey khi được chuyển đến scanForPeripheralsWithServices:options: cho biết rằng "Việc tắt bộ lọc này có thể ảnh hưởng xấu đến thời lượng pin và chỉ nên sử dụng nếu cần".

Nếu bạn chọn viết lời gọi bị trì hoãn, bạn có thể điều chỉnh tần suất của các cuộc gọi để giúp bạn quản lý tác động lên pin của người dùng.

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