BLE特征写入值偶尔会跳转到随机值

时间:2017-12-14 11:12:39

标签: swift bluetooth-lowenergy core-bluetooth

将核心蓝牙与Swift 3一起使用,我使用CBPeripheral.writeValue()向中心写一个特征,并在UISlider的值发生变化时执行此操作。我注意到,即使在缓慢拖动滑块时,中央也会偶尔看到跳跃值。我想也许正在发生一些空中腐败,所以我改变了特性来写三次相同的值。现在,只有当Central匹配的所有值都将对它们起作用时。这是当前的代码:

@IBAction func slideValChanged(_ sender: UISlider)
{
    let sliderVal = UInt8(sender.value.rounded(FloatingPointRoundingRule.down))
    if (sliderVal != self.sliderVal)
    {
        self.sliderVal = sliderVal
        self.bytes.removeAll()
        self.bytes = [self.sliderVal, self.sliderVal, self.sliderVal]
        DispatchQueue.global(qos: .userInitiated).async
        {
            self.data = Data(bytes: self.bytes)
            self.peripheral.writeValue(self.data, for: self.writeCharacteristic!, type: CBCharacteristicWriteType.withResponse)
            print("Write values sent:", self.bytes[0], self.bytes[1], self.bytes[2])
        }
    }
}

即便如此,我仍然看到价值跳跃,而不是任何特别的东西。 print()语句始终打印相同(和正确)的数字三次。同样,在Central上,当值跳转时,我会收到三个相等但不正确的值。怎么会这样?我所能想到的是,核心蓝牙中的某些东西在播出之前正在改变它的价值,但我不确定,我也不知道应该把注意力集中在哪里。

1 个答案:

答案 0 :(得分:0)

当您使用CBCharacteristicWriteType.withResponse时,即使您的滑块缓慢移动也会发送到许多数据包。 当您写入writeCharacteristic命令时,您需要在再次调用writeCharacteristic之前等待回调。回调将指示您的数据已在中央BLE堆栈中缓冲,并且堆栈已准备好接收其他数据。如果没有这个,您的数据可能会损坏甚至丢失连接。