2015-06-10 21 views
8

Tôi muốn có danh sách các thiết bị ble mà iOS của tôi có thể kết nối, làm mới khi thiết bị ble xuất hiện và biến mất.Làm thế nào để phát hiện với CoreBluetooth khi một thiết bị ngoại vi biến mất?

Để làm điều đó, tôi đã tạo một NSMutableDictionnary* peripheralsAvailable và mọi lúc - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; được gọi bởi CBCentralManager, tôi thêm thiết bị ngoại vi vào thiết bị ngoại viTừ điển có sẵn (và sau đó cập nhật UITableView). Tất cả đều ổn ở đây.

Tuy nhiên tôi không thể tìm thấy cách tôi có thể cập nhật từ điển nếu một ngoại vi "biến mất". Dường như tôi chỉ có thể thêm các thiết bị ngoại vi trong từ điển của mình khi chúng được phát hiện, nhưng tôi không thể loại bỏ một thiết bị khi tôi tắt nó.

Bạn có thể cho tôi biết nếu tôi thiếu gì đó không?

Trả lời

4

Hệ điều hành sẽ phát hiện bộ nhớ cache của thiết bị. I E. bạn sẽ chỉ nhận được một sự kiện "khám phá" trên mỗi thiết bị.

Để liên tục nhận được các sự kiện phát hiện trong khi thiết bị ngoại vi được quảng cáo, bạn phải sử dụng các tùy chọn sau đây:

CBCentralManagerScanOptionAllowDuplicatesKey

Một giá trị logic Boolean xác định xem quá trình quét nên chạy mà không lọc trùng lặp.

Giá trị cho khóa này là đối tượng NSNumber. Nếu CÓ, lọc là bị tắt và sự kiện khám phá được tạo ra mỗi khi trung tâm nhận được gói quảng cáo từ thiết bị ngoại vi. Tắt tính năng 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 KHÔNG, nhiều khám phá của cùng một thiết bị ngoại vi được kết hợp thành một sự kiện khám phá duy nhất. Nếu khóa là không được chỉ định, giá trị mặc định là KHÔNG.

Đặt tùy chọn ở trên thành YES, bạn có thể theo dõi tất cả các thiết bị ngoại vi đang quảng cáo và khi ngừng quảng cáo, bạn có thể xóa nó khỏi danh sách.

Đối với thiết bị mà bạn đã kết nối, có sự kiện ủy quyền didDisconnectPeripheral.


Thiết bị Bluetooth không quảng cáo mà chúng sắp biến mất, cũng như không quảng cáo bạn sắp ra khỏi phạm vi. Bạn nhận được một quảng cáo trong khi họ đang quảng cáo và bạn đang trong phạm vi, và bạn sẽ không nhận được gì khi bạn ra khỏi phạm vi hoặc họ ngừng quảng cáo. Không có sự kiện nào kích hoạt khi họ ra đi. Bạn phải nhớ các thiết bị đang quảng cáo và khi họ ngừng quảng cáo (bạn chưa nhận được quảng cáo trong một thời gian), bạn có thể xóa quảng cáo khỏi danh sách.

+1

Cảm ơn bạn! Tôi biết về didDisconnectPeripheral, nhưng tôi đã phải kết nối để sử dụng nó.Tôi không biết về CBCentralManagerScanOptionAllowDuplicatesKey, và đó là chính xác những gì tôi cần. – darksider

+0

Làm thế nào để làm điều đó nếu bạn ở chế độ nền? Khóa CBCentralManagerScanOptionAllowDuplicates sẽ bị bỏ qua trong trường hợp đó. – kukudas

+1

@kukudas, thiết bị ngoại vi BLE của bạn có thể quảng cáo với địa chỉ thiết bị khác nhau theo khoảng thời gian đều đặn để khách hàng sẽ xem nó như một thiết bị ngoại vi khác trong khi ở chế độ nền, nhưng có ID thực trong gói quảng cáo, để khách hàng biết rằng thực sự là cùng một ngoại vi. –

0

Câu trả lời hay của Marcus. Một lưu ý bổ sung cần thêm là tùy chọn quét CBCentralManagerScanOptionAllowDuplicatesKey như đã đề cập ở trên không hoạt động ở chế độ nền.

Các ứng dụng đã chỉ định chế độ nền trung tâm bluetooth được phép quét trong khi ở chế độ nền. Điều đó nói rằng, họ phải quét một cách rõ ràng một hoặc nhiều dịch vụ bằng cách chỉ định chúng trong tham số serviceUUID. Tùy chọn quét CBCentralManager được bỏ qua trong khi quét trong nền.

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