CC2650模块无法通过蓝牙与iOS应用程序连接

时间:2018-04-19 08:02:10

标签: ios swift bluetooth bluetooth-lowenergy

我尝试使用Swift开发iOS应用。这个应用程序将通过蓝牙控制德州仪器的CC2650模块。我正在使用iOS Core蓝牙库。我从

获取了蓝牙连接代码

https://github.com/hoiberg/HM10-BluetoothSerial-iOS

import UIKit

导入CoreBluetooth

var serial:BluetoothSerial!

最终班级BluetoothSerial:NSObject,CBCentralManagerDelegate,CBPeripheralDelegate {

var delegate: BluetoothSerialDelegate!

var centralManager: CBCentralManager!

}

var writeType: CBCharacteristicWriteType = .withResponse

init(delegate: BluetoothSerialDelegate) {
    super.init()
    self.delegate = delegate
    centralManager = CBCentralManager(delegate: self, queue: nil)
}

func startScan() {
    guard centralManager.state == .poweredOn else { return }

   let uuid = CBUUID(string: "0x180A")

    centralManager.scanForPeripherals(withServices: [uuid], options: nil)

    let peripherals = centralManager.retrieveConnectedPeripherals(withServices: [uuid])
    for peripheral in peripherals {


        let StrenghtOfRSSI = peripheral.readRSSI()
        delegate.serialDidDiscoverPeripheral(peripheral, RSSI: nil)

    }
}

func stopScan() {
    centralManager.stopScan()
}

func connectToPeripheral(_ peripheral: CBPeripheral) {
    pendingPeripheral = peripheral
    centralManager.connect(peripheral, options: nil)
}



func sendMessageToDevice(_ message: String) {
    guard isReady else { return }

    if let data = message.data(using: String.Encoding.init(rawValue: UInt(message)!)) {
        connectedPeripheral?.writeValue(data, for: writeCharacteristic!, type: .withResponse)
}





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

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

    peripheral.delegate = self
    pendingPeripheral = nil
    connectedPeripheral = peripheral
    delegate.serialDidConnect(peripheral)


    peripheral.discoverServices([CBUUID(string: "F0001110-0451-4000-B000-000000000000")])

}

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    connectedPeripheral = nil
    pendingPeripheral = nil

    delegate.serialDidDisconnect(peripheral, error: error as NSError?)
}

func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
    pendingPeripheral = nil

    delegate.serialDidFailToConnect(peripheral, error: error as NSError?)
}

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    connectedPeripheral = nil
    pendingPeripheral = nil

    delegate.serialDidChangeState()
}


func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {

    for service in peripheral.services! {

        peripheral.discoverCharacteristics(nil, for: service)
    }
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {

    for characteristic in service.characteristics! {


        if bluetoothCounter == false {

        if characteristic.uuid == CBUUID(string: "F0001112-0451-4000-B000-000000000000") {
            peripheral.setNotifyValue(true, for: characteristic)               
            writeCharacteristic = characteristic    
            delegate.serialIsReady(peripheral)
            }

        } else {

            if characteristic.uuid == CBUUID(string: "F0001113-0451-4000-B000-000000000000") {
                peripheral.setNotifyValue(true, for: characteristic
                writeCharacteristic = characteristic
                delegate.serialIsReady(peripheral)
            }

        }
    }


}

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {

    let data = characteristic.value
    guard data != nil else { return }


    delegate.serialDidReceiveData(data!)

    if let str = String(data: data!, encoding: String.Encoding.utf8) {
        delegate.serialDidReceiveString(str)
    } else {
        print("Received an invalid string!")
    }

}
}

但我有问题。当我的应用程序扫描外围设备时,它无法直接找到CC2650模块。但是,有一些有趣的情况正在发生。当我打开BLE扫描仪应用程序(https://itunes.apple.com/us/app/ble-scanner-4-0/id1221763603?mt=8)时,我可以发现我的CC2650模块并发送消息。之后,我打开我的应用程序,我也可以发现我的CC2650并可以发送消息。我的应用程序无法直接找到CC2650模块。

我无法解决这个问题。我尝试了一些我发现的蓝牙连接。

我需要一些帮助。

谢谢你们。

1 个答案:

答案 0 :(得分:1)

我首先要检查BLE适配器的状态,例如:

func centralManagerDidUpdateState(_ central: CBCentralManager) {

    var consoleMsg = ""

    switch(central.state) {
    case .poweredOff:
        consoleMsg = "BLE is off"
    case .poweredOn:
        consoleMsg = "BLE is on"
        self.centralManager.scanForPeripherals(withServices: nil, options: nil)

    case .resetting:
        consoleMsg = "BLE is resetting"
    case .unauthorized:
        consoleMsg = "BLE is UA"
    case .unknown:
        consoleMsg = "BLE status unknown"
    case .unsupported:
        consoleMsg = "BLE is unsupported"

    }
    self.delegate?.statusUpdated(statusText: consoleMsg)
    print("\(consoleMsg) \n", terminator: "")

}

此代码将替换您的startScan方法,如果它打印出“BLE已打开”您就可以了,它将开始扫描外围设备。

从您的代码中看起来您实际上并没有连接到外围设备。

例如,您只能在centralManager.connect(peripheral, options: nil)内拨打connectToPeripheral,我在serialDidDiscoverPeripheral部分内看不到对此的调用。

您需要扫描,然后注册didDiscoverPeripheral委托方法,检查该外围设备是否是您想要的(通过UUID或设备名称,您可以从您正在使用的BLE浏览器应用程序获取),然后连接到它,然后扫描服务然后与它们交互(读,写,通知等)。

您可以添加:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    if let peripheralName = peripheral.name {
        print(peripheralName)
        if (peripheralName == "Your peripheral name"){
            self.peripheral = peripheral
            self.peripheral.delegate = self // This is to subscribe to delegate methods from the peripheral
            self.centralManager.stopScan() // Found your peripheral so stop scanning
            self.centralManager.connect(self.peripheral, options: nil)
        }
    }
}

将连接(并打印到控制台)外围设备。然后,您需要扫描服务(您可以在didConnect委托方法中启动它:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    peripheral.delegate = self
    peripheral.discoverServices(nil)
}

然后,您似乎拥有用于发现服务和特征的代码,以便一切正常。

旁注: 您拨打 let peripherals = centralManager.retrieveConnectedPeripherals(withServices: [uuid]) 仅检索已连接的外围设备,因此如果您通过其他应用(例如BLE资源管理器)连接到该应用,则会显示在您的应用中。