swift iOS BLE:连接事件时间戳

ukxgm1gy  于 2023-03-16  发布在  Swift
关注(0)|答案(1)|浏览(143)

我有一个iOS应用程序,使用BLE连接远程设备,iOS应用程序基于Nordic Semiconductor的“nRF Connect”应用程序,可以进行扫描,然后允许用户选择连接哪个设备等。
我想访问实际BLE连接事件的时间戳。
我对自己的XCode / Swift知识一点信心都没有,但我想我已经找到了发生Connect事件时调用的代码:

func CentralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)

如果这是正确的函数,谁能告诉我如何才能访问连接事件时间戳。
如果它的功能不正确,有人能给我指一下正确的方向吗?
我不想自己修改代码,我想请我认识的另一个开发人员来做,但首先我想确保(a)可以获得连接事件时间戳,(b)我可以为开发人员指出他们应该从哪里开始等等。
谢谢

wkyowqbh

wkyowqbh1#

Apple提供CoreBluetooth与您当前使用的BLE设备进行通信,非常可靠。当BLE设备在扫描后连接并且用户选择要连接的设备时,无论设备是否需要配对码,都会调用以下函数:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
// handle BLE device connect
}

要在连接BLE设备后调用此函数,需要使用以下代码行调用CBCentralManager的delegate函数:

CBCentralManager(delegate: self, queue: nil, options: nil)

如果要扫描特定类型的BLE设备,则应传递BLE设备的serviceID。
调用didConnect函数后,它会返回一个CBPeripheral示例,您需要将其分配给CBPeripheral的全局示例以进一步使用它。如果不这样做,它将丢失,您将无法进一步使用它。与此沿着,您还必须使用以下命令调用CBPeripheral的委托:

globalPeripheral.delegate = self

在此之后,您需要调用以下函数:

globalPeripheral.discoverServices(nil)

这将发现外设的服务,并使您能够与BLE设备通信。之后,您的函数将如下所示:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    globalPeripheral = peripheral // assign the connected peripheral to a global instance 
    globalPeripheral.delegate = self
    globalPeripheral.discoverServices(nil)
}

如果BLE设备无法连接,您可以在此处进行检查:

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

如果器械断开连接:

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
        
    }

一旦你调用globalPeripheral.discoverServices(nil),就会调用CBPeripheral的以下委托:

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

}

它将返回一个服务数组,其中每个服务将被迭代和外围。discoverCharacteristics(nil,for:service)将被调用,最终函数将如下所示:

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

外围设备。discoverCharacteristics(无,用于:service)将进一步为特定CBService的每个发现的特征调用以下函数:

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

}

这些特性用于与BLE通信,或者我们可以说是对BLE设备读/写数据,特性属性可以包含读、写、通知、广播等,因此在此函数中,您可以根据如下要求使用/忽略这些特性:

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

您要使用的每个特性都将被预先定义,最后当您与BLE设备通信时,您将在以下函数中接收数据:

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
// here you can check the characteristic and access data accordingly
}

注:您需要BLE设备的适当文档才能与其通信,因为它将包含与命令和数据相关的所有信息。
如果你想得到时间戳当你的设备是连接然后你可以做这在这下面的方式:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    let timestamp = Date().timeIntervalSince1970
    print("Connected to \(peripheral.name ?? "Unknown peripheral") at timestamp \(timestamp)")
    // ...
}

相关问题