我正在使用OBD2设备从不同的车辆获取数据。应用程序和OBD2之间的通信使用蓝牙LE完成。 当我使用OBD2设备时,我得到服务UUID = FFE0和特征UUID = FFE1。我可以使用这个特性来写PID,我从我的车里获取数据没有任何问题。 但是当我使用不同的OBD2时,我得到服务UUID = FFF0和UUID FFE1(具有属性.write)和FFE2(具有属性.read)的两个特征。当我尝试使用write属性将PID写入特性时,我收到错误
错误域= CBATTErrorDomain Code = 10“找不到该属性。”
会出现什么问题?
答案 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的特性。