第一次读取外围设备(带react-native的OBDII)

在上一个工作的项目中,我必须从外围设备读取信息。 该设备是OBDII或车载诊断设备,该设备用于获取汽车的状态并进行系统诊断。


对于这个项目,我决定使用react-native制作使用BLE(蓝牙低功耗)连接到设备的移动应用程序。

这是我第一次读取外围设备,因此首先搜索一些读取该设备的库。 我找到了一个反应式本机库,该库已不再维护,它有两年没有任何支持,而且有很多问题。 它仅适用于android版本,所以我认为这不是最佳选择,因为我正在使用react-native,并且它用于制作android和IOS应用程序。

我决定使用一个名为react-native-ble-plx的库来手动读取设备。 为了确保这是一个正确的决定,我问一个老人是否是正确的决定。 他告诉我,我有两种选择:将库制成可读取设备的版本,或对库进行更新以获取不受支持的信息。

我决定创建新库,因为支持其他库似乎有点困难。


我将告诉您我为制作该库所做的工作以及从此经验中学到的知识。 我想告诉您制作该库需要知道哪些步骤:

  • 首先,您需要了解BLE库的工作方式。 我阅读了非常容易阅读和学习的文档。
  • 其次,您需要了解BLE标准的工作原理。 我搜索GATT标准,即BLE使用的标准。 我建议使用一种应用程序来发现设备的服务和特性,然后再开始使用该设备,我使用一种称为BLE扫描仪的设备。 在阅读BLE库之前,也许最好先阅读一下GATT标准。
  • 第三,您需要了解设备的工作方式。 我在寻找设备的信息后发现,OBDII使用自己的PID标准。 不满意,我搜索了更多有关OBDII的信息,发现它们使用类似于终端交互的ELM327命令来读取实时数据。

我完成研究后,开始编写代码并测试所做的工作。 真的很有趣,因为我从来没有使用过真正的外部设备,因此要使用它,我必须将设备连接到汽车上,但是要保持这种状态确实很难。 因此,我从办公桌上得到了一个仿真器来使用该设备。


我发现使用BLE扫描仪应用程序,该设备具有以下结构:

定制服务 ”的特点是:


他们只有一项服务来请求设备信息。 而且该服务只有两个特征:一个用于编写代码,另一个用于读取代码。 因此,如果我想获得五个代码,则需要在写入特性中先发送一个代码。

对于发送代码,我发现一个重要的问题是,OBDII需要在代码的末尾带回车符来接收代码,例如,用于RPM引擎的代码010C必须像这样“ 010C \ r ”发送。 另一个问题是,OBDII需要在base64中接收每个代码,因此必须将代码从ASCII转换为base64。

为了读取代码的答案,我必须从读取的特性变化时读取值,因此我必须监视特性并保存每个响应。 就像读取特性一样,base64中的设备响应也是如此,因此我不得不将数据从base64转换为ASCII。 然后,从完整的响应中,我必须分离出具有以下结构的答案: codevalidation_code value> ,例如010C 410C 0FA0>

最后,要从代码中获取正确的值,我必须将ASCII形式的值转换为正确的值(实际上是十六进制),并且该值与每个代码不同,例如,在RPM中,该值为0FA0 = > 0x0FA0 => 4000 => 4000/4 => 1000且对于SPEED值FF => 0xFF => 255


这次经历真的很好,因为我从来没有那样做过。 尽管我发现了很多问题,例如文档很少,库不支持或设备受限制,但并非总能完成所有工作,有时您需要了解这种情况以及在特定情况下如何采取行动。