【发布时间】: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