OBD2 BLE Communication - как отправлять AT команды и получать данные - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть ключ OBD2, и мне нужно получить скорость автомобиля (используя BLE и устройство iOS).В документации, поставляемой с ключом, не упоминались службы и характеристики, но при некоторой отладке я обнаружил несколько.Давайте назовем их службой 1, 2, 3.

  1. Служба 1 имеет одну характеристику со свойством Read и свойством WriteWithoutResponse
  2. Служба 2 имеет одну характеристику со свойством Read и свойством Notify
  3. Служба 3 имеет две характеристики: характеристика A со свойством Read и свойство Notify, а характеристика B со свойством Write и свойство WriteWithoutResponse

Как узнать, какую характеристику / и мне нужно отправлять и получать 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)
    }

} 

1 Ответ

0 голосов
/ 15 декабря 2018

Прежде всего, если вы говорите, например, с помощью ELM327 - который является одним из самых распространенных чипов OBD2 - вам лучше не начинать с PID (например, 010D), а скорее инициализировать его с помощью правильной команды ATпоследовательность (подробности см. в соответствующем руководстве).

Далее, peripheralDidUpdateNotificationState - неправильный метод делегата.Это срабатывает всякий раз, когда вы подписываетесь или отменяете подписку на признак, а не когда его значение изменяется.Вместо этого вы хотите реализовать метод делегата peripheralDidUpdateValueForCharacteristic.

При этом проблема заключается в том, что адаптеры BLE OBD2 не используют фиксированные профили GATT.Большинство (если не все) адаптеры BLE OBD2 работают так, что они предлагают одну услугу с одной или двумя характеристиками:

  • Характеристика записи.В этом случае мобильное устройство может записывать свои AT-команды (в случае, например, ELM327) и PID в.
  • Характеристика уведомления.Это тот, где возвращаются результаты из автомобиля (ECU).

Получив доступ к этим характеристикам, вы можете реализовать последовательный протокол OBD2 (например, используя очередь команд, которая записывает и ожидаетдля ответа перед передачей готовой команды на прикладной уровень).

Некоторые адаптеры BLE объединяют эти два в одну характеристику.Если вы хотите поддерживать произвольные адаптеры, вам нужно будет добавить экран «выберите свой адаптер», где вы будете проверять найденные адаптеры, запоминать характеристики и затем общаться.

Таким образом, можно писать приложения, которые работаютсо всеми видами адаптеров BLE OBD2, а не только с поддержкой нескольких поставщиков, например OBD2 Expert (отказ от ответственности: я являюсь автором этого программного обеспечения).

...