【问题标题】:Apple iOS Swift5 BLE - How to send 1 byte to a characteristic (write function expects Data type, but one byte is "UInt8" type)Apple iOS Swift5 BLE - 如何向特征发送 1 个字节(写入函数需要数据类型,但一个字节是“UInt8”类型)
【发布时间】:2021-02-25 05:08:41
【问题描述】:

我正在开发将浮点数据类型和 8、16、32 位整数写入现有 BLE GATT 外设的代码。外围特性是针对这些特定尺寸构建的。对于浮点数和 32 位整数,创建数据类型往往会在缓冲区中创建无关的 0,并使其成为 5 字节对象,我的外围设备拒绝。所以我把它切成这样:

let int32Value = Int32(fieldValue)
let data = withUnsafeBytes(of: int32Value) { Data($0) }
let data_slice = data[0...3]
peripheral.writeValue(data_slice, for: characteristic, type: writeType)

对于 16 位 Ints,我只是将其切片:

let int16Value = Int16(fieldValue)
let data = withUnsafeBytes(of: int16Value) { Data($0) }
let data_slice = data[0...1]
peripheral.writeValue(data_slice, for: characteristic, type: writeType)

所有这些都有效,我可以看到设备上已经设置了数据。但是使用 8 位整数,我尝试:

let int8Value = Int8(fieldValue)
let data = withUnsafeBytes(of: int8Value) { Data($0) }
let data_slice = data[0]
peripheral.writeValue(data_slice, for: characteristic, type: writeType)

我得到一个编译时错误 - writeValue 方法需要 Data 类型作为第一个参数,但从上面的代码中,它将 data_slice 解释为 Bytes 对象并且不会编译。如果我不执行“data_slice”操作,那么data 的长度为 2 个字节,而我在此处创建它的方式会被我的外围设备拒绝。我收到“不正确的特征数据长度”错误。

我似乎在 Catch-22 中。我需要用来发送 BLE 外设值的系统级 writeValue 函数不允许将单个 8 位 Int 作为参数。但是我的外围设备上的特性不会接受除此之外的任何东西。发送单个 8 位 Int 在 Android 等其他平台上对我有用。遇到这种情况怎么办?

显示 Int8 和 Int32 情况的图像:

【问题讨论】:

  • "那么按照我在这里创建的方式,数据的长度是 2 个字节" 考虑到 Int8 是一个单字节,这没有任何意义。
  • 顺便说一句,你没有切片任何东西。您的 data_slice 与您的数据对象的大小完全相同
  • @LeoDabus,检查编辑,我添加了显示我看到的图像。让我知道可能出了什么问题。
  • 问题是你的 Int 是可选的。这就是为什么你得到一个额外的字节。您所需要的只是在将其转换为 Data 之前打开您的可选项
  • @LeoDabus,哦,这完全正确,并且修复了它。非常感谢!如果你想写一个解决方案,我会给你答案,或者如果这是一个愚蠢的错误,我可以删除这个问题。

标签: ios swift types integer bluetooth-lowenergy


【解决方案1】:

问题在于您的Int8 是可选的。这就是为什么你得到一个额外的字节。您只需要在将可选选项转换为数据之前对其进行解包即可。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2012-11-28
    • 1970-01-01
    • 2019-11-27
    • 2021-08-27
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多