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