从 OBD 2 读取数据时遇到问题
Posted
技术标签:
【中文标题】从 OBD 2 读取数据时遇到问题【英文标题】:Trouble reading data from OBD 2 【发布时间】:2017-06-23 11:40:34 【问题描述】:我正在使用 OBD2 设备从不同的车辆获取数据。应用程序和 OBD2 之间的通信是使用蓝牙 LE 完成的。 当我使用 OBD2 设备时,我得到服务 UUID = FFE0 和特征 UUID = FFE1。我可以使用这个特性来编写 PID,并且我可以毫无问题地从我的汽车中获取数据。 但是当我使用不同的 OBD2 时,我会得到服务 UUID = FFF0 和 UUID FFE1(带有属性 .write)和 FFE2(带有属性 .read)的两个特征。当我尝试使用 write 属性将 PID 写入特征时,我收到错误为
Error Domain=CBATTErrorDomain Code=10 "找不到属性。"
会出现什么问题?
【问题讨论】:
【参考方案1】:虽然BLE本身是标准化的,但是BLE中的OBD2服务并没有官方标准。为了使用多个适配器,您的应用程序应该包含适当的设备扫描。
为此,您需要探测设备,连接到您找到的所有内容,然后启动服务扫描并遍历所有服务及其特征。
如果您找到可写的特征,那么这将是您可以写入的通道。如果您找到一个可读的特征,那么这将是从哪里读取的通道。这不一定会导致两个特性,一些适配器在读取和写入时使用相同的特性。
使用满足您期望的第一个服务,然后尝试发送ATZ\r\n
(或您在传输级别支持的任何内容)并查看这是否是有效的 OBD2 适配器响应。
这样您就不需要预先知道服务 UUID,并且可以使您的应用程序与大多数 BLE 适配器一起工作。
(当然,下次你可以记住服务的 UUID,所以除非用户告诉你,否则你不必再次探测。)
【讨论】:
【参考方案2】:正如您已经写的“当我使用不同的 OBD2 [设备]”...不同的设备 = BLE 协议的不同实现。
所以这取决于您使用的 ODB2 设备。市场上有各种各样的质量。有些可能只读取值,有些也可能写入它们。有些获得了基础市场的认证,有些则没有。更糟糕的是,ODB2 协议标准也有不同的实现(超过汽车制造商,有时甚至是汽车类型)。只有标准中定义的基本值基本相同。汽车制造商仅将其用于汽车维修,他们不考虑像您这样的其他用例。
另请注意:特斯拉等较新的电动汽车甚至不再有 ODB2 端口。
我不是 ODB2 和 ODB2 设备方面的专家,但我通过与两位同事的讨论了解到一些问题,他们针对我们的业务用例调查了几个 ODB2 BLE 设备和不同的汽车。我们更改了范围以避免 ODB2 设备和打开 Pandora 盒子。
请分享一些代码。也许您没有正确地使用 discoverCharacteristics 从 CPPeripheral 请求特征。
【讨论】:
以上是关于从 OBD 2 读取数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章