将核心蓝牙与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上,当值跳转时,我会收到三个相等但不正确的值。怎么会这样?我所能想到的是,核心蓝牙中的某些东西在播出之前正在改变它的价值,但我不确定,我也不知道应该把注意力集中在哪里。
答案 0 :(得分:0)
当您使用CBCharacteristicWriteType.withResponse时,即使您的滑块缓慢移动也会发送到许多数据包。 当您写入writeCharacteristic命令时,您需要在再次调用writeCharacteristic之前等待回调。回调将指示您的数据已在中央BLE堆栈中缓冲,并且堆栈已准备好接收其他数据。如果没有这个,您的数据可能会损坏甚至丢失连接。