无法从OBD 2读取数据

时间:2017-06-23 11:40:34

标签: ios swift bluetooth-lowenergy core-bluetooth obd-ii

我正在使用OBD2设备从不同的车辆获取数据。应用程序和OBD2之间的通信使用蓝牙LE完成。 当我使用OBD2设备时,我得到服务UUID = FFE0和特征UUID = FFE1。我可以使用这个特性来写PID,我从我的车里获取数据没有任何问题。 但是当我使用不同的OBD2时,我得到服务UUID = FFF0和UUID FFE1(具有属性.write)和FFE2(具有属性.read)的两个特征。当我尝试使用write属性将PID写入特性时,我收到错误

  

错误域= CBATTErrorDomain Code = 10“找不到该属性。”

会出现什么问题?

2 个答案:

答案 0 :(得分:1)

虽然BLE本身是标准化的,但BLE中没有OBD2服务的官方标准。为了使用多个适配器,您的应用程序应该包含正确的设备扫描。

为此,您可以探测设备,连接到您找到的所有内容,然后启动服务扫描并迭代所有服务及其特征。

如果您发现可写的特征,那么这将是您可以写入的频道。如果您发现可读的特征,那么这将是通道的读取位置。这不一定会导致两个特征,一些适配器在读取和写入时都使用相同的特性。

使用符合您期望的第一项服务,然后尝试发送ATZ\r\n(或您在传输级别支持的任何内容),并查看这是否是有效的OBD2适配器响应。

这样您就不需要事先知道服务UUID,并且可以使您的应用程序与大多数BLE适配器一起使用。

(当然,您可以记住下次的服务UUID,因此除非用户告诉您,否则您不必再次进行探测。)

答案 1 :(得分:0)

正如您已经写过“当我使用不同的OBD2 [设备]时”......不同的设备= BLE协议的不同实现。

所以它取决于您使用的ODB2设备。市场上有各种各样的质量。有些人可能只读取数值,有些人也可能会写。有些是基础市场认证,有些则不是。更糟糕的是,ODB2协议标准也有不同的实现(超过汽车制造商,有时甚至是汽车类型)。只有标准中定义的基本值大多相同。汽车制造商仅将其用于汽车维修,他们不会考虑像您这样的其他用例。

另请注意:较新的电动汽车,如特斯拉,甚至不再有ODB2端口。

我不是ODB2和ODB2设备的专家,但我知道与两位同事讨论的一些问题,他们调查了几个ODB2 BLE设备和不同的汽车用于我们的业务用例。我们更改了范围以避免使用ODB2设备并打开Pandora盒。

请分享一些代码。也许您没有正确地使用发现特性来请求CPPeripheral的特性。