ios - 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)")
}
}
解决方案
要发现所有外围设备的服务,您应该传递nil
给discoverServices
,而不是一个空数组。
heartRatePeripheral.discoverServices(nil)
通过传递一个空数组,您表示您不想发现任何服务。
推荐阅读
- image - 在不调整大小的情况下制作长图像
- android - 无法使用 Kotlin 在 Android 上初始化 Visualizer
- c# - DirectoryEntry Invoke("Members", null) 未检索所有成员
- gpu - 为什么logical_gpus = tf.config.experimental.list_logical_devices('GPU') 会导致一个空列表?
- php - 使用供应商文件夹之外的一些作曲家包部署 GAE 应用程序
- java - 如何修复非线程安全的延迟初始化 CXF 客户端工厂?
- php - Laravel 6.x VerifiesEmails.php 以 $request->route('hash') 失败,通过 $request->get('hash')
- java - 从对象的父类数组中提取子类属性
- javascript - 使用 javascript 发送删除请求
- javascript - 将两个变量合并为一个变量并与另一个变量相等