首页 > 解决方案 > IOS 应用程序在与蓝牙设备连接后未收到来自蓝牙设备的火灾事件

问题描述

我有一个蓝牙设备。当我触发设备时,IOS 应用程序在func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)方法中从它接收触发事件但是当我通过centralManager.connect(heartRatePeripheral)advertisementData["kCBAdvDataLocalName"]方法将 BLE 蓝牙设备与我的应用程序连接时,它没有在任何CBPeripheralDelegate方法中接收到触发事件。请帮助我在将 BLE 设备与 IOS 应用程序连接后如何获取事件。下面是我的完整代码。

import UIKit
import CoreBluetooth

let heartRateServiceCBUUID = CBUUID(string: "FFC2")

class HRMViewController: UIViewController {

   @IBOutlet weak var heartRateLabel: UILabel!
   @IBOutlet weak var bodySensorLocationLabel: UILabel!

   var centralManager: CBCentralManager!
   var heartRatePeripheral: CBPeripheral!

   override func viewDidLoad() {
      super.viewDidLoad()

      centralManager = CBCentralManager(delegate: self, queue: nil)
      heartRateLabel.font = UIFont.monospacedDigitSystemFont(ofSize: 
      heartRateLabel.font!.pointSize, weight: .regular)
   }

   func onHeartRateReceived(_ heartRate: Int) {
       heartRateLabel.text = String(heartRate)
       print("BPM: \(heartRate)")
   }
}

extension HRMViewController: CBCentralManagerDelegate {
   func centralManagerDidUpdateState(_ central: CBCentralManager) {
   }

   func centralManager(_ central: CBCentralManager, didDiscover  
   peripheral: CBPeripheral, advertisementData: [String : Any], rssi 
   RSSI: NSNumber) {
       if advertisementData["kCBAdvDataLocalName"] as? String == 
           "SPS026A" {
           print(advertisementData["kCBAdvDataLocalName"])
           let data = 
            advertisementData[CBAdvertisementDataManufacturerDataKey]
            print("data ==\(data)")
            heartRatePeripheral = peripheral
            centralManager.connect(heartRatePeripheral)
        }
   }

   func centralManager(_ central: CBCentralManager, didConnect 
   peripheral: CBPeripheral) {
        print("Connected!")
        heartRatePeripheral.discoverServices([])
        heartRatePeripheral.delegate = self
    }
}

extension HRMViewController: CBPeripheralDelegate {
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices 
    error: Error?) {
         guard let services = peripheral.services else { return }
         for service in services {
             print(service)
             peripheral.discoverCharacteristics(nil, for: service)
         }
     }

     func peripheralDidUpdateName(_ peripheral: CBPeripheral) {

     }

     func peripheral(_ peripheral: CBPeripheral, 
     didDiscoverCharacteristicsFor service: CBService, error: Error?) 
     {
          guard let characteristics = service.characteristics else { 
          return }
          for characteristic in characteristics {
               if characteristic.properties.contains(.read) {
                    print("\(service): service : \ . 
                    (characteristic.uuid): properties contains .read")
                    peripheral.readValue(for: characteristic)
                }
               if characteristic.properties.contains(.notify) {
                     print("\(service): service : \ 
                     (characteristic.uuid): properties contains 
                     .notify")
                      peripheral.setNotifyValue(true, for: 
                      characteristic)
                }
            }
       }

       func peripheral(_ peripheral: CBPeripheral, didOpen channel: 
       CBL2CAPChannel?, error: Error?) {

       }

       func peripheralIsReady(toSendWriteWithoutResponse peripheral: 
       CBPeripheral) {

       }

       func peripheral(_ peripheral: CBPeripheral, 
       didUpdateNotificationStateFor characteristic: CBCharacteristic, 
       error: Error?) {
             print("Unhandled Characteristic UUID: \(characteristic)")
       }

       func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor 
       characteristic: CBCharacteristic, error: Error?) {
             print("Unhandled Characteristic UUID: \(characteristic)")
       }
   }

标签: iosswiftbluetooth

解决方案


要发现所有外围设备的服务,您应该传递nildiscoverServices,而不是一个空数组。

heartRatePeripheral.discoverServices(nil)

通过传递一个空数组,您表示您不想发现任何服务。


推荐阅读