2017-02-07 23 views
5

Tôi mới làm việc với BLE, hiện đang cố gắng tạo một ứng dụng đơn giản kết nối với thiết bị BLE tùy chỉnh của tôi. Tôi có thể khám phá thiết bị BLE, nhưng vì một lý do nào đó tôi không thể kết nối với nó. Tôi đã thử kiểm tra bằng 'Xanh lam nhạt', nó cho thấy thiết bị của tôi có thể kết nối và có vẻ hoạt động tốt. Nhưng trong ứng dụng của tôi sau khi tôi phát hiện ra thiết bị, CB quản lý cố gắng kết nối với nó và dường như 'đóng băng'? Chức năng 'didConnect ngoại vi' không bao giờ được kích hoạt, và trạng thái ngoại vi là mãi mãi 'kết nối'.Swift 3: Không thể kết nối với thiết bị ngoại vi qua BLE

Tôi làm cách nào để xác định sự cố? Có bất kỳ tùy chọn tôi có thể bao gồm trong phương pháp kết nối, hoặc bằng cách nào đó theo dõi quá trình kết nối?

Tôi sẽ đánh giá cao bất kỳ lời khuyên nào để tìm kiếm sự cố.

Làm việc trong XCode 8.2.1, sử dụng Swift 3. iOS 10.2.1 cài đặt trên điện thoại thử nghiệm

Dưới đây là mã của tôi:

import UIKit 
import CoreBluetooth 

class InfoPageViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { 

var manager:CBCentralManager! 
var peripheral:CBPeripheral! 

let BEAN_NAME = "MyDevice" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    manager = CBCentralManager(delegate: self, queue: nil) 
} 

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 

    let device = (advertisementData as NSDictionary) 
     .object(forKey: CBAdvertisementDataLocalNameKey) 
     as? NSString 

    if device?.contains(BEAN_NAME) == true { 
     self.manager.stopScan() 

     self.peripheral = peripheral 
     self.peripheral.delegate = self 

     manager.connect(peripheral, options: nil) 

     print("discovered \(BEAN_NAME)") 

    } 
} 

func centralManager(
    central: CBCentralManager, 
    didConnect peripheral: CBPeripheral) { 
    print("connected to \(BEAN_NAME)") 

    peripheral.discoverServices(nil) 
} 
+0

Chỉ cần đảm bảo: Tôi giả định một nơi khác bạn đang gọi 'scanForPeripherals' (có vẻ hiển nhiên vì bạn đang nói' didDiscover' được gọi, nhưng nó không nằm trong đoạn mã trên). Bạn có thể xác nhận rằng LightBlue có thể kết nối với thiết bị ngoại vi không? (Nếu bạn nhấn vào nó trong danh sách, nó sẽ kết nối và hiển thị cho bạn dữ liệu quảng cáo và dịch vụ.) Lưu ý rằng khi bạn đã kết nối với LightBlue, bạn có thể sẽ không phát hiện thêm thiết bị trong ứng dụng cho đến khi bạn ngắt kết nối trong LightBlue . (Và tất nhiên: chỉ cần làm thế nào "tùy chỉnh" là thiết bị này? Bạn có biết nó thực sự có thể kết nối? Bạn có một bộ dev cho nó?) –

+1

Có, tôi gọi 'scanForPeripherals' như là một phần của' centralManagerDidUpdateState', mà dường như công việc. Không bao gồm nó trong mã ở trên, vì nó dường như không có liên quan đến vấn đề. Và trong LightBlue tôi có thể kết nối với nó, có thể thấy dữ liệu quảng cáo, dịch vụ. Tôi không có một bộ dev cho thiết bị đó, nhưng nó có thể được kết nối với một ứng dụng khác trên Android (vì vậy nó có thể kết nối), nhưng tôi không thể hiểu tại sao không phải là iOS. –

+2

'tùy chọn func centralManager (_ trung tâm: CBCentralManager, didConnect ngoại vi: CBPeripheral)' là khai báo/chữ ký thực sự của phương thức. Bạn đang thiếu "_". Đó có thể là lý do tại sao nó không được gọi. Bên trong, nó có vẻ là tùy chọn, nó nên kiểm tra trước "Đại biểu của tôi có phản hồi' centralManager (_ central: CBCentralManager, didConnect ngoại vi: CBPeripheral) 'và trả về false. – Larme

Trả lời

2
func centralManager(central: CBCentralManager, didConnect peripheral: CBPeripheral) {} 
--------------------^ 

Versus:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) 
--------------------^ 

Chữ ký của phương thức không đúng, bạn thiếu _.

Chữ ký của phương thức là quan trọng. Chúng ta có thể giả định, vì các phương thức ủy nhiệm là tùy chọn, nội bộ, mã Apple tự hỏi: Đại biểu của tôi có phương pháp func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) được triển khai (respondsToSelector:) không? Trong trường hợp của bạn, không, bởi vì nó không giống nhau, và sau đó bạn không được gọi.

Bạn sao chép/dán từ tài liệu hoặc xóa tài liệu và để XCode thực hiện việc tự động hoàn thành.

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