А у этих двух характеристик одинаковый UUID?
В общий список такое вывалит и-то неизвестно на всех-ли реализациях, не закончится ли такое просто "ошибка" считывания характеристик?
По отдельному запросу найдет первую, т.к. оно единственное верное и должно было иметь ATT_PERMISSIONS_RDWR
У характеристик записи и чтения различный UUID. Если интересно, я приведу лог прошивки с комментариями.
В программе в ключевых точках стоит PrintF, а я дополнительно снабдил сообщения цифрами в начале сообщения.
Что бы лучше логику отслеживать. Вот что у меня получилось.
1 - старт считывания всех сервисов присоединенного устройства 2 - приложение получает от стека несколько
сообщений с диапазоном адресов сервисов в памяти стека 3 - запрос всех характеристик 4 - получаю из стека
указатели на эти характеристики. Тут надо пояснить, что на периферийном устройстве запущен только первый сервис
авторизации, второй сервис передачи данных пока пассивен. Здесь мы видим две характеристики с указателями 110 и 112.
Это как раз характеристики чтения и записи сервиса авторизации 10f ~ 11d. 5 - запрос к характеристике сервиса авторизации
для чтения кодового слова с периферического устройства 6 - его получение. Затем я обрабатываю случайное входящее число
при помощи секретного ключа и 7 - отправляю полученный результат обратно. После этого, если периферийное устройство
видит что ответ совпал с ожидаемым, оно поднимает второй сервис - сервис передачи данных. Я же хочу удостовериться, что
он поднят. Для этого 8 - заново делаю запрос всех сервисов на устройстве. И вижу что появился новый с диапазоном
100 ~ 10e. И вот далее самое интересное.
1 Start Discovery My
2 Found Profile Service handle : 1 ~ 5
2 Found Profile Service handle : 6 ~ 8
2 Found Profile Service handle : 10f ~ 11d
2 Found Profile Service handle : 206f ~ 500
3 Find all characteristics
4 Found Characteristic handle : 2
4 Found Characteristic handle : 110
4 Found Characteristic handle : 112
4 Found Characteristic handle : 206f
5 Read Data Characteristic
6 Read code : d1d20950
Param Update...
7 Write code : 581f66f9
8 Start Discovery New !!!!!
9 Found Profile Service handle : 1 ~ 5
9 Found Profile Service handle : 6 ~ 8
9 Found Profile Service handle : 100 ~ 10e
9 Found Profile Service handle : 10f ~ 11d
9 Found Profile Service handle : 206f ~ 500
Если я 10 - запускаю заново считывание всех характеристик, то я не вижу ничего нового.
10 Find All Characteristic
11 Found Characteristic handle : 2
11 Found Characteristic handle : 110
11 Found Characteristic handle : 112
11 Found Characteristic handle : 206f
Если я 10 - запускаю команду поиска в стеке характеристики (DT_Char) по её UUID (128 bit), то
стек отдает мне ссылку на эту характеристику (102) и я могу 12 - запросить данные с блока
и 13 - получаю их
10 Find Characteristic DT_Char
11 Found Characteristic handle : 102
12 Read Data Characteristic
13 Data = 79000000FF00000000FE83100E00
Бывает и наоборот. В общем запросе указатель на характеристику имеется, а при запросе
её по UUID стек её не находит. К логу есть ещё некоторые комментарии. Сервисы 1 ~ 5 и
6 ~ 8 - это стандартные сервисы BLE. Характеристика с точкой входа 2 - это характеристика
Имени устройства. Но вот что такое сервис диапазона 206f ~ 500 и характеристика 206f
мне не понятно. Но вроде бы они никак не мишают. В NRFConnect их не видно. Вот с этими
проблемами я столкнулся. В принципе их можно обойти, но осадочек остается.