7

Thông số kỹ thuật Bluetooth năng lượng thấp không nói nhiều về việc các thiết bị ngoại vi có thể kết nối với nhiều trung tâm tại một thời điểm hay không, nhưng thử nghiệm kinh nghiệm của tôi cho tôi biết rằng chúng không thể.Quét liên tục cho iOS CoreBluetooth Central Manager?

Vì ứng dụng của tôi yêu cầu mối quan hệ không sở hữu với thiết bị ngoại vi (và không cần kết nối, sẽ chặn người khác) và cần cập nhật thường xuyên các giá trị RSSI của họ, tôi đang tìm cách quét liên tục các thiết bị ngoại vi và nắm bắt các giá trị RSSI của chúng .

Phương thức scanForPeripheralsWithServices xuất hiện để quét trong một khoảng thời gian nhất định và sau đó dừng lại. Tôi tin rằng đặt cược tốt nhất của tôi là quét trong 3 giây tại một thời điểm, dừngScan, chờ (vài giây) và sau đó bắt đầu quét lại. Nói lại.

Có ai có thể chỉ cho bạn cách làm tốt hơn không? Ví dụ, cấu hình một thiết bị ngoại vi để kết nối với nhiều hơn một Trung tâm?

Trả lời

7

Thiết bị ngoại vi không thể kết nối với nhiều hơn một trung tâm. Nhưng nếu bạn chỉ cần nắm bắt RSSI thì bạn thậm chí không cần kết nối. Quét cho các thiết bị có thể lấy RSSI sử dụng chức năng này:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
+2

Có, nhưng tôi cần phải liên tục nhận được một RSSI cập nhật. Phát hiện của tôi là một khi Giám đốc trung tâm đã phát hiện và phát hiện ra một thiết bị ngoại vi một vài lần, sau đó nó dừng phát hiện ra nó (có vẻ là khoảng 3 giây) ngay cả khi quét tiếp tục. Những gì tôi còn lại là cần phải khởi động lại quá trình quét liên tục để cố gắng cập nhật các giá trị RSSI. – Jonathan

+3

Vâng, bạn có thể bắt đầu lại quá trình quét bên trong hàm didDiscoverPeripheral, và nhờ đó bạn sẽ nhanh chóng nhận được RSSI. – Aboelseoud

+1

Cảm ơn. Điều đó hoạt động. Để tiết kiệm điện, tôi thực sự ngừng quét sau 100ms và sau đó thực hiện 100ms mỗi giây. Hoạt động tuyệt vời. – Jonathan

5

Đối với các câu trả lời trước, nếu bạn chỉ quan tâm đến RSSI bạn chỉ có thể làm cho nó vào phương pháp đại biểu:

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

BTW, theo mặc định, CBCentralManager sẽ chỉ gọi phương thức này một lần. Nếu quý vị cần gọi lại này được gọi mỗi khi CBCentralManager nhận được một gói tin quảng cáo bạn cần để bắt đầu quá trình quét với các tùy chọn CBCentralManagerScanOptionAllowDuplicatesKey thiết lập để YES:

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}; 
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions]; 

Cẩn thận mà Apple không khuyến khích việc sử dụng tùy chọn này nếu không thực sự cần thiết .

Xem: iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

tôi giải quyết loại vấn đề với mã này, về cơ bản chỉ là khởi động lại quá trình quét mỗi khi một quảng cáo được xử lý. Tôi đã phải đối mặt với cùng một vấn đề mà trường hợp CBCentralManager sẽ ngừng nghe một thiết bị ngoại vi.

(. Thiết CBCentralManagerScanOptionAllowDuplicatesKey-@YES đã không giải quyết hoàn toàn vấn đề này đối với tôi)

Giả sử các lớp thực hiện CBCentralManagerDelegate:

- (id) init { 
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; 
    [self initScan]; 
} 

- (void) initScan { 
    [self.central stopScan]; 
    [self.central scanForPeripheralsWithServices:nil 
             options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]]; 
} 

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

    // 
    // Do stuff here 
    // 

    [self initScan]; 
} 
Các vấn đề liên quan