【问题标题】:CBCharacteristic value in swift3CBCharacteristic value in swift3
【发布时间】:2017-01-22 02:08:48
【问题描述】:

我是快速开发的初学者。我正在研究基于 BLE 的应用程序。 今天我更新了 Xcode 8、iOS 10 并将我的代码转换为 swift3。然后我的一些语法需要转换。修复此问题后,我在 CBCharacteristic 上发现了一个问题。

问题

在 didUpdateValueforCharacteristic 里面,我可以得到更新的 CBCharacteristic 对象。 如果我打印出整个对象,它会正确显示。 -> 值 = 当我从 CBCharacteristic 检索值时,characteristic.value -> 2bytes(这个值的大小)

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic:     CBCharacteristic, error: Error?)
{
if (characteristic.uuid.description == LED_WAVELENGTH_CHARACTERISTIC_UUID)
{
            print("Characteristic - \(characteristic)")
            print("Data for characteristic  Wavelength - \  (characteristic.value)")
        }
 }

日志结果:

Characteristic - <CBCharacteristic: 0x1742a50a0, UUID = 2C14, properties = 0xE, value = <3a02>, notifying = NO>
Data for characteristic  Wavelength - Optional(2 bytes)

PS:这段代码在以前的版本上完全可以正常工作。

感谢关注,希望有人能帮我解决这个问题。

【问题讨论】:

  • 问题是什么?您有一个可选值。您已在上一行中强制展开它,但您打印的是可选值,而不是展开的值。
  • 我的问题是为什么我得到特征值的结果是 2 个字节。我应该根据 CBCharacteristic Object 得到 。
  • 因为是两个字节。数据不包含“3a02”作为字符串,它包含 0x3a(十进制 58) - 一个字节和 0x02(十进制 02)第二个字节。这是 570 作为 little-endian 16 位值,但您需要确认外围设备使用的格式
  • 是的,正确的。我也在我的问题中提到。这是价值的大小。在 swift2.2 中,返回结果是“”。现在在 swift 3 中,返回结果是值的大小。
  • 如果您在字符串上下文中解释 NSData,那么您将获得 description 方法的结果,但这仅用于调试/日志记录。你不应该依赖description 的返回值是一致的。如果您需要对数据值进行操作,请使用getBytes 根据需要访问字节

标签: ios bluetooth-lowenergy swift3 xcode8 cbperipheral


【解决方案1】:

您似乎一直在依赖NSDatadescription 返回一个&lt;xxxx&gt; 形式的字符串来检索数据的值。正如您所发现的,这很脆弱,因为description 函数仅用于调试,并且可以在没有警告的情况下更改。

正确的方法是访问包装在Data 对象中的字节数组。这变得有点棘手,因为 Swift 2 允许您将 UInt8 值复制到单个元素 UInt16 数组中。 Swift 3 不会让你这样做,所以你需要自己计算。

var wavelength: UInt16?
if let data = characteristic.value {
    var bytes = Array(repeating: 0 as UInt8, count:someData.count/MemoryLayout<UInt8>.size)

    data.copyBytes(to: &bytes, count:data.count)
    let data16 = bytes.map { UInt16($0) }
    wavelength = 256 * data16[1] + data16[0]
}

print(wavelength) 

【讨论】:

  • 正确!! Whoo hoo .. 最后我可以得到正确的结果。非常感谢..现在我知道我的问题是什么了。再次谢谢你 。 @Paulw11
【解决方案2】:

现在,您可以使用String(bytes: characteristic.value!, encoding: String.Encoding.utf8),获取特征的字符串值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多