Прежде всего, если вы говорите, например, с помощью ELM327 - который является одним из самых распространенных чипов OBD2 - вам лучше не начинать с PID (например, 010D
), а скорее инициализировать его с помощью правильной команды AT
последовательность (подробности см. в соответствующем руководстве).
Далее, peripheralDidUpdateNotificationState
- неправильный метод делегата.Это срабатывает всякий раз, когда вы подписываетесь или отменяете подписку на признак, а не когда его значение изменяется.Вместо этого вы хотите реализовать метод делегата peripheralDidUpdateValueForCharacteristic
.
При этом проблема заключается в том, что адаптеры BLE OBD2 не используют фиксированные профили GATT.Большинство (если не все) адаптеры BLE OBD2 работают так, что они предлагают одну услугу с одной или двумя характеристиками:
- Характеристика записи.В этом случае мобильное устройство может записывать свои AT-команды (в случае, например, ELM327) и PID в.
- Характеристика уведомления.Это тот, где возвращаются результаты из автомобиля (ECU).
Получив доступ к этим характеристикам, вы можете реализовать последовательный протокол OBD2 (например, используя очередь команд, которая записывает и ожидаетдля ответа перед передачей готовой команды на прикладной уровень).
Некоторые адаптеры BLE объединяют эти два в одну характеристику.Если вы хотите поддерживать произвольные адаптеры, вам нужно будет добавить экран «выберите свой адаптер», где вы будете проверять найденные адаптеры, запоминать характеристики и затем общаться.
Таким образом, можно писать приложения, которые работаютсо всеми видами адаптеров BLE OBD2, а не только с поддержкой нескольких поставщиков, например OBD2 Expert (отказ от ответственности: я являюсь автором этого программного обеспечения).