如何在Swift Xcode中以编程方式与蓝牙LE设备进行配对/连接?

6

我目前正在尝试开发一款应用,允许用户通过点击按钮自动输入密码与外围设备建立绑定。

是否可以使用Swift编程来实现自动绑定和解除绑定?


3
用户需要自己回答配对提示弹窗,您无法干预。 - Larme
我该如何使用Swift启动配对过程? - Mysterious_android
3
您需要读取一个需要加密的属性(包括CBCharacteristicPropertyIndicateEncryptionRequired)。 - Larme
@神秘的安卓 你找到了同样的答案吗? - Kudos
2个回答

6
当您尝试在BLE设备上写入或读取特征时,将启动配对。但是,如果设备未设置为需要身份验证和/或绑定,则不会看到请求PIN码的iOS弹出窗口。
我曾经因为可以使用Core Bluetooth (via Swift) function writeValue()向特征写入数据而没有看到配对弹出窗口而与我的HM-10抗争。
直到我仔细阅读了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?

我不知道这是否是正确的地方,但我在stackoverflow上提出了一个问题,关于如何知道配对/绑定何时完成。我一直在研究CBPeripheralDelegate,但在绑定完成后没有任何调用。我想知道何时绑定完成,以便我可以开始读取/写入安全特征。https://stackoverflow.com/questions/56814487/ios-bluetooth-how-to-know-when-pairing-is-done?noredirect=1#comment100183530_56814487 - Yogurt
1
@Biclops 我也遇到了一些麻烦,因为在iOS中找不到一个方法来告诉我配对是否完成或成功。在我的测试过程中,尽管用户已经在配对对话框上点击取消,但我仍然能够通过我的iOS应用程序向我的BLE设备发送数据。这对我来说似乎是iOS API的一个漏洞,但我不确定。 - raddevus

-3

按照以下步骤将Ble设备连接到iOS程序中。

1)导入

import CoreBluetooth

2) 在类或视图控制器中声明变量。

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

var cbManger: CBCentralManager!

3) 在viewController的ViewDidLoad函数或类的初始化函数中初始化cbManger。

  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 {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接