我有一个OBD2加密狗,需要通过它来获取车辆的速度(使用BLE和iOS设备)。加密狗随附的文档没有提及服务和特性,但是通过一些调试,我发现了一些。我们称它们为服务1、2、3。

  • 服务1具有一个具有Read属性和WriteWithoutResponse属性的特征
  • 服务2具有“读取”属性和“通知”属性
  • 的一个特征
  • 服务3具有两个特征:具有读取属性和通知属性的特征A和具有写入属性和WriteWithoutResponse属性的特征B

  • 如何知道我需要发送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)
                }
            }
    
        }
    }
    

    然后期待一些东西:
    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)
        }
    
    }
    

    最佳答案

    首先,如果您正在通过ELM327进行通信-这是最常见的OBD2芯片之一-最好不要以PID开头(如010D),而应使用适当的AT命令序列对其进行初始化(请参见相应的手册以获取更多信息)。详细信息)。

    接下来,peripheralDidUpdateNotificationState是错误的委托方法。每当您订阅或取消订阅特征时(而不是其值更改时)就会触发此操作。您想改为实现委托方法peripheralDidUpdateValueForCharacteristic

    也就是说,问题在于:OBD2 BLE适配器不使用任何固定的GATT配置文件。大多数(如果不是全部)BLE OBD2适配器的工作方式是,它们提供一种或两种特性的服务:

  • 写特征。这是移动设备可以在其中写入其AT命令(例如在ELM327中)和PID的地方。
  • 通知特征。这是从汽车(ECU)返回结果的地方。

  • 一旦获得了这些特征,就可以实现OBD2串行协议(例如,使用写入并等待响应的命令队列,然后将完成的命令传输到应用程序层)。

    一些BLE适配器将这两者合并为一个特征。如果要支持任意适配器,则必须添加“选择适配器”屏幕,以在其中探测找到的适配器,记住其特征,然后进行通信。

    这样,就可以编写适用于各种BLE OBD2适配器的应用程序,并且不仅支持少数选定的供应商,例如OBD2 Expert(免责声明:我是该软件的作者)。

    10-07 20:07