2012-03-28 33 views
13

Tôi vừa mới bắt đầu với khung nền tảng chính dành cho iOS và tôi đang phát triển một ứng dụng cần quét liên tục các thiết bị BLE để có thể lấy số RSSI của mình mỗi phút hoặc vì thế.Bluetooth chính - cập nhật RSSI liên tục của các thiết bị trong phạm vi

Hiện nay tôi có:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

này bắt đầu quét ứng dụng của tôi cho các thiết bị BLE và gọi phương pháp này đại biểu khi một thiết bị được phát hiện:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData); 
    //Do something when a peripheral is discovered. 

    rssiLabel.text = [RSSI stringValue]; 

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];} 

phương pháp này được tôi số RSSI của ngoại vi mà tôi có thể hiển thị. Dòng cuối cùng sau đó gọi phương thức delegate này:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals { 

    NSLog(@"Currently known peripherals :"); 
    int i = 0; 
    for(CBPeripheral *peripheral in peripherals) { 
     NSLog(@"[%d] - peripheral : %@ with UUID : %@",i,peripheral,peripheral.UUID); 

    } 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
    [manager scanForPeripheralsWithServices:nil options:options]; 

} 

Mã này dường như được làm việc và làm một quét khoảng mỗi 1 phút, nhưng tôi không biết chính xác lý do tại sao nó làm việc ...

Các tài liệu trên bluetooth lõi là khá thưa thớt vì vậy nếu có ai có ý tưởng về cách làm điều này, hoặc có một cách tốt hơn để làm những gì tôi đang cố gắng để thực hiện tôi đánh giá cao sự giúp đỡ!

+0

vẻ khi được làm việc ... bao lâu một lần RSSI cập nhật? EDIT: Một lần một phút?Tôi nghĩ rằng có một thời gian ra khi bạn không kết nối, để nó bắt đầu quét lại. – chwi

+0

Tôi vừa mới bắt đầu đọc tài liệu, vì vậy bạn đang tiếp tục hơn I. Câu hỏi, tại sao bạn gọi scanForPeripheralsWithServices trong phương thức đại biểu didRetrievePeripherals? Bạn gọi nó là sau khi CBCentralManager được cấp phát. Điều này có thể gây ra việc quét lặp đi lặp lại mà bạn đã đề cập. – mkr707

+0

chỉ hai xu của tôi cho> = 7.0: retrievePeripheralsWithIdentifiers cần sử dụng từ bây giờ trở đi. –

Trả lời

20

Bạn đã thử thay đổi tùy chọn quét thành CÓ?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

Nếu bạn làm điều này bạn sẽ nhận được của bạn "didDiscoverPeripheral" callback với tất cả các gói quảng cáo được nhìn thấy bởi iPhone của bạn, mà thông thường sẽ vào khoảng mỗi 100ms (mặc dù tôi thấy thời gian gọi lại này khác nhau rất nhiều cho cùng thiết bị). Điều này bao gồm RSSI của từng thiết bị mà nó nhìn thấy.

Tốc độ này sẽ nhanh hơn rất nhiều so với tỷ lệ cập nhật ~ 1 phút của bạn.

Thực hiện
+1

Tương đương Swift cho hai dòng đó là gì? – Gerard

+0

@Gerard: Xem câu trả lời của tôi bên dưới. – kbpontius

+1

Swift3: 'manager.scanForPeripherals (withServices: [sensorTagAdvertisingUUID], các tùy chọn: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber (value: true)])' – nablahero

3

Xa như tôi thấy, điều này sẽ làm những gì bạn muốn.

Khi bạn bắt đầu quét tìm thiết bị ngoại vi bằng cuộc gọi ban đầu, đại biểu của bạn sẽ bắt đầu nhận cuộc gọi bất cứ khi nào thiết bị BLE được phát hiện. Điều này sẽ tiếp tục cho đến khi bạn dừng quá trình quét với một cuộc gọi đến

[manager stopScan]; 

Tôi không nghĩ rằng bạn thực sự cần những cuộc gọi thứ hai để scanForPeripheralsWithServices trong centralManager của bạn: Phương pháp didRetrievePeripherals, vì, như xa như tôi biết, quá trình quét doesn không dừng lại cho đến khi bạn nói với nó. Tuy nhiên, tôi vẫn đang bắt đầu quá trình này và có thể có một khoảng thời gian chờ mà tôi chưa tìm thấy.

Tôi khá chắc chắn lý do bạn nhận được cuộc gọi khoảng một phút là vì thiết bị BLE chỉ quảng cáo thường xuyên. Nếu nó quảng cáo thường xuyên hơn, giống như một thiết bị ở chế độ khám phá, tôi nghĩ bạn sẽ nhận được các cuộc gọi thường xuyên hơn. Tôi sẽ rất thú vị nếu bạn có thể xác nhận điều đó. Nếu thiết bị có chế độ khám phá, bạn có thể thử kích hoạt chế độ này để xem các thông báo có tăng tốc hay không.

2

Bạn không nên thực hiện quét liên tục vì rất tốn điện. Một khi bạn phát hiện ra thiết bị, bạn có một mảng các đối tượng CBPeripheral trả về cho bạn. Trên CBPeripheral bạn có thể đọc RSSI và nhận được một cuộc gọi lại khi RSSI thay đổi. Xem tài liệu sau: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

+0

Có '- [readRSSI]' yêu cầu kết nối ngoại vi không? –

+2

@BenMosher có nó. – luxcem

1

Swift dung dịch @Anders:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)]) 
Các vấn đề liên quan