如何在 Swift 中使用 CoreBluetooth 迭代 OBD-II 写入/读取请求

问题描述 投票:0回答:0

我正在尝试不断迭代写/读请求,以从车辆上的 OBD-II 总线获取实时数据。我正在 Swift 中使用 CoreBluetooth 来与我的 OBD-II BLE 适配器连接和通信。

我可以成功连接到适配器并请求不同的 PID。我可以收到响应并对其进行解码。我遇到的问题是,如果我尝试循环 PID 请求,它不会执行任何操作,或者会使适配器陷入停止状态,适配器重新启动,然后再次用请求轰炸它。

我的目标是当用户位于 LiveDataView() 时不断更新 4 个不同传感器的实时数据,然后停止询问他们是否离开视图,或者应用程序设置为后台/关闭。

我尝试遵循本文中的逻辑:https://punchthrough.com/core-bluetooth-basics/ 这提到您可以使用peripheral.writeValue(type: CBCharacteristicWriteType.withResponse)或peripheral.writeValue(type: CBCharacteristicWriteType.withoutResponse)。我尝试了有回应和无回应两种写作方式。由于我会在用户处于 LiveDataView() 中时随时请求此数据,因此我决定尝试使用 withoutResponse 写入类型,并调用 func PeripheralIsReady(),如本文中所建议的。文章指出,这个 func PeripheralIsReady() 的可靠性时好时坏,对于我的用例来说,它似乎没有帮助(不断地发送垃圾邮件写入请求)。

我还想,也许我可以使用计时器。这似乎有效,但看起来很笨拙。我注意到,当我反复询问 PID“0105”(发动机冷却液温度)时,一切似乎都正常。但它实际上并没有在 LiveDataView() 中更新我的发动机冷却液温度。它正在更新我的调试控制台中车辆的十六进制响应,但不是应用程序视图中的温度。我正在使用 @Published var 来保存计算出的温度值,但即使温度在增加,它也只会保持原始读数。

Code for Timer

Code for function I'm calling

是否有比使用计时器更好的方法来持续从 CoreBluetooth 中的 OBD-II BLE 设备写入/读取信息?有没有更好的方法来控制外设特性的写/读? CoreBluetooth 一直很痛苦,我不确定我做错了什么。任何帮助将不胜感激。

swift swiftui bluetooth-lowenergy core-bluetooth obd-ii
© www.soinside.com 2019 - 2024. All rights reserved.