2015-04-18 27 views
6

Tôi thấy một lỗi lạ trong iOS 8.3 và đang tự hỏi liệu có ai khác đang nhìn thấy cùng một thứ hay không.Lõi Bluetooth: CBPeripheral ngắt kết nối mỗi ~ 10 giây

Tôi có iPad Air (ở chế độ Trung tâm) và iPhone 6 (ở chế độ Ngoại vi) ở rất gần.

  • My CBCentralManager được khởi tạo với một hàng đợi nền serial và CBCentralManagerOptionRestoreIdentifierKey tùy chọn
  • Người quản lý bắt đầu quét thiết bị ngoại vi sử dụng CBCentralManagerScanOptionAllowDuplicatesKey: true tùy chọn
  • Trong centralManager:didDiscoverPeripheral: tôi kiểm tra đối với một danh sách các thiết bị ngoại vi mà đã được phát hiện:
let connect:() ->() = { 
    peripheral.delegate = self 
    self.devices[peripheral.identifier.UUIDString] = peripheral 
    self.manager.connectPeripheral(peripheral, options: nil) 
} 

if let device = devices[peripheral.identifier.UUIDString] { 
    if device.peripheral.state == .Disconnected { 
    connect() 
    } 
} else if peripheral.state == .Disconnected { 
    connect() 
} 
  • Sau khi kết nối, tôi khám phá các dịch vụ và đặc điểm.

Thiết bị ngoại vi hiện ngắt kết nối sau khoảng 10 giây, được phát hiện ngay lập tức và kết nối lại. 10 giây sau thủ tục này lặp lại chính nó.

Đây có phải là lỗi hay tôi đang làm điều gì sai ở đây?

Tôi cũng đã cố gắng đăng ký trực tiếp một đặc điểm trên thiết bị ngoại vi, nhưng điều này dường như không thay đổi bất cứ điều gì.

+1

tôi sử dụng ứng dụng thử nghiệm của tôi trên một thiết bị iOS8.3 và tôi không thấy điều này - cả với một Fitbit Flex ngoại vi và một thiết bị iOS như một thiết bị ngoại vi. Có lý do cụ thể nào bạn đang đặt khóa cho phép trùng lặp không? Nó không phải là bình thường cần thiết và cống pin. Tôi không có vấn đề gì khi duy trì kết nối với thiết bị ngoại vi BLE trong nhiều giờ. – Paulw11

+0

Cảm ơn Paul, tôi đang sử dụng khóa trùng lặp để thực hiện các tác vụ dựa trên RSSI. Bạn có kết nối với thiết bị ngoại vi một lần không? Bạn đọc/ghi/đăng ký đặc điểm nào? Giá trị cập nhật ngoại vi có liên tục không? Tôi nghĩ rằng nó có thể có một cái gì đó để làm với điều đó? – desktop

+0

Tôi kết nối với thiết bị ngoại vi một lần. Nếu bạn muốn nhận được giá trị RSSI của thiết bị ngoại vi được kết nối, bạn có thể sử dụng phương pháp CBPeripheral 'readRSSI'. Mã mẫu của tôi không liên tục đọc/ghi hoặc thông báo về bất kỳ đặc tính nào – Paulw11

Trả lời

7

Đó là hành vi mong đợi. Bluetooth được thiết kế để tiêu thụ rất ít năng lượng để nó giảm kết nối càng sớm càng tốt. Cũng ít nhất trong iOS 7 nó không phải là cần thiết để tái khám phá thiết bị ngoại vi - bạn đã có thể kết nối lại với thiết bị đã được phát hiện sau khi ngắt kết nối. Tôi khá chắc chắn nó cũng đúng đối với iOS 8. Cách khuyến khích để làm việc với BLE nếu bạn không cần một kết nối vĩnh viễn là:

  1. Khám phá
  2. Connect
  3. Đọc/viết tất cả các bạn cần làm sớm càng tốt
  4. cài đặt hẹn giờ
  5. Khi timer cháy đi đến điểm 2

Nếu bạn cần một kết nối vĩnh viễn (ví dụ bạn cần phải lấy dữ liệu abo nhịp tim ut trong thời gian thực), bạn nên đăng ký cho đặc trưng với - setNotifyValue:forCharacteristic:

When you enable notifications for characteristic’s value, the peripheral calls the peripheral:didUpdateNotificationStateForCharacteristic:error: method of its delegate object to notify your app when the characteristic’s value changes. Because it is the peripheral that chooses when to send an update, your app should be prepared to handle them as long as notifications or indications remain enabled.

+0

Cảm ơn, tôi đã cố gắng đăng ký đặc tính thông báo của thiết bị ngoại vi sau khi kết nối, tuy nhiên kết nối vẫn bị ngắt. Bạn có biết đặc điểm thông báo thực sự cần phát ra bất kỳ dữ liệu nào để hai thiết bị có thể kết nối không? – desktop

+0

@desktop Có, nó sẽ phát ra một số dữ liệu nhưng tôi không biết thường xuyên như thế nào. Có lẽ nó được mô tả một nơi nào đó bên trong đặc điểm kỹ thuật BLE https://www.bluetooth.org/en-us/specification/adopted-specifications – Avt

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