sur*_*heW 2 ios bluetooth-lowenergy obd-ii
我有一个 OBD2 加密狗,需要通过它获取车辆的速度(使用 BLE 和 iOS 设备)。加密狗附带的文档没有提到服务和特性,但通过一些调试我发现了一些。我们将它们称为服务 1、2、3。
如何知道我需要哪些特性来发送AT命令并接收相应的数据,然后如何发起这个通信。我特别需要能够获得速度。先感谢您。
我已尝试以下操作但没有发生任何事情:
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
for characteristic in service.characteristics! {
if characteristic.properties.contains(.notify) {
peripheral.setNotifyValue(true, for: characteristic)
}
if characteristic.properties.contains(.write) {
let commandString = "010D\r"
if let commandData = commandString.data(using: .utf8) {
peripheral.writeValue(commandData, for: characteristic, type: .withoutResponse)
peripheral.writeValue(commandData, for: characteristic, type: .withResponse)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后期待以下内容:
func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
if let value = characteristic.value {
let text = String(data: value, encoding: String.Encoding.utf8)
self.onNotifyReceived(text)
}
}
Run Code Online (Sandbox Code Playgroud)
首先,如果您通过例如 ELM327 \xe2\x80\x93\xc2\xa0 进行交谈,这是最常见的 OBD2 芯片 \xe2\x80\x93 之一,您最好不要从 PID 开始(如 ),而是010D初始化它使用正确的AT命令序列(有关详细信息,请参阅相应的手册)。
接下来,peripheralDidUpdateNotificationState是错误的委托方法。每当您订阅或取消订阅某个特征时(而不是其值发生变化时)都会触发此操作。您想改为实现委托方法peripheralDidUpdateValueForCharacteristic。
也就是说,问题在于:OBD2 BLE 适配器不使用任何固定的 GATT 配置文件。大多数(如果不是全部)BLE OBD2 适配器的工作方式是,它们提供具有一两个特征的一项服务:
\n一旦您能够访问这些特性,您就可以实现 OBD2 串行协议(例如,在将完成的命令传输到应用程序层之前,使用写入并等待响应的命令队列)。
\n一些 BLE 适配器将这两种特性合并为一种特性。如果您想支持任意适配器,则必须添加“选择适配器”屏幕,您可以在其中探测找到的适配器,记住特征,然后进行通信。
\n这样就可以编写与各种 BLE OBD2 适配器配合使用的应用程序(并且不仅支持选定的少数供应商),例如 OBD2 Expert(免责声明:我是该软件的作者)。
\n| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |