如何在swift Xcode中以编程方式绑定/配对蓝牙LE设备?

时间:2017-01-17 07:10:12

标签: ios swift xcode bluetooth-lowenergy core-bluetooth

我目前正在尝试开发和应用程序,允许用户通过单击按钮绑定到外围设备,密码将自动输入。

是否可以使用swift以编程方式绑定和删除Bond?

2 个答案:

答案 0 :(得分:0)

在您尝试向BLE设备的特征写入或从中读取时,都会启动配对。但是,如果未将设备设置为需要身份验证和/或绑定,则不会看到要求输入PIN码的iOS弹出窗口。

我在HM-10上为此苦苦挣扎,因为我可以使用Core Bluetooth (via Swift) function writeValue()将数据写入特征,而不会看到配对弹出窗口。

直到仔细阅读HM-10(实现IC cc2451)数据表,然后发现我需要将AT + TYPE设置为值3时,我才能弄清楚。默认值为0,这意味着HM -10不需要配对/绑定,因此您永远不会看到iOS弹出窗口。

您可以在提出问题并最终找到解决方案并将其写下来的地方阅读更多详细信息:How do I pair and/or bond to BLE on iOS using Swift code and an HM-10 so data sent is encrypted?

答案 1 :(得分:-1)

按照将Ble设备连接到iOS程序的步骤。

1)导入

import CoreBluetooth

2)将变量声明为类或ViewController。

  let kServiceUART = CBUUID(string: "0x1800")
 var peripheralHeartRateMonitor: CBPeripheral?

var cbManger: CBCentralManager!

3)将cbManger初始化为viewController的ViewDidLoad函数或初始化类的函数。

  cbManger = CBCentralManager(delegate: self, queue: .main)

4)覆盖CBCentralManager的委托方法。

 func centralManagerDidUpdateState(_ central: CBCentralManager) {

    switch central.state {
    case .unsupported:
        print("BLe Unsupported")
        break
    case .unauthorized:
         print("BLe unauthorized")
        break
    case .poweredOff:
        let alertMessgesInst = AlertMessages.sharedInstance
        CommonUtils.showAlert(alertMessgesInst.actofit_Title, message: alertMessgesInst.trun_On_blueTooth)
        break
    case .poweredOn:

        if isNewFirmWareOFImpulse {

            let uuidString = StorageServices.readFromDefaults(key: Constants.userDefaultKeys.impulseUUID)
            let uuid = UUID(uuidString:uuidString as! String )
            let device =  cbManger.retrievePeripherals(withIdentifiers: [uuid!])
            peripheralHeartRateMonitor = device.first
            peripheralHeartRateMonitor!.delegate = self
            cbManger?.connect(peripheralHeartRateMonitor!)

        }else {

            let option:[String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber(value: false)]
            cbManger.scanForPeripherals(withServices: nil, options: option)
        }

        break
    case .unknown:
         print("BLe unknown")
        break
    default:
        break
    } // End Swith

} // End 'centralManagerDidUpdateState' function.
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

    if isNewFirmWareOFImpulse {

        peripheralHeartRateMonitor = peripheral
        print("UUid of band is :- \(peripheralHeartRateMonitor?.identifier.uuidString)")

        if impulseName == peripheral.name {


            peripheralHeartRateMonitor!.delegate = self


            cbManger.stopScan()

            // STEP 6: connect to the discovered peripheral of interest
            cbManger?.connect(peripheralHeartRateMonitor!)


        } // End impulse condition

    }else {

        let keysArray = advertisementData.keys

        if let tempImpulseName = peripheral.name {
            print(impulseName + " and " + tempImpulseName )
            if impulseName == tempImpulseName {
                for key in keysArray {
                    if key == "kCBAdvDataManufacturerData"{
                        let manufactureData = advertisementData[key]
                        if let stringValue = manufactureData.debugDescription as? String {

                            var heartValue: String = String()
                            heartValue = stringValue
                            heartValue.removeLast()
                            heartValue.removeLast()
                            let last = heartValue.removeLast()
                            let secondLast = heartValue.removeLast()

                            let hR = String([secondLast, last])
                            if let value = UInt8(hR, radix: 16){

                                if Int(value) > 60 {
                                    hrArray.append(Int(value))
                                }


                            } // End the value block

                        } // end of if 'stringValue' condition
                    } // end 'Key' if condition

                } // End for each loop
            } // End impulse condition

        } // End pheripheral if condition

    } // end version condition

} // End function 'didDiscover peripheral'.

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


    // STEP 8: look for services of interest on peripheral

    peripheralHeartRateMonitor?.discoverServices(nil)

} // END func centralManager(... didConnect peripheral

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    if error != nil {