Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BLE
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Kalyan
Добрый день.
Работаю с BLE - создаю BLE peripheral device. В GATT профайле определен один сервис в котором определена одна характеристика со свойством read.
Эта характеристика описана двумя атрибутами (Declaration - uuid -0x2803 и само value c 16 байтным uuid).
Вопрос относительно длины данных для атрибута value этой характеристики. Возможно ли как то указать что длина данных у этой характеристики переменная?
Например инит длинна = 0 и максимальная длина = 2 байта.
Axel
Цитата(Kalyan @ Aug 28 2018, 21:22) *
...Работаю с BLE...

Здесь как-то бсе больше про ARMы... А по сути: если только "read" - то нет. Для жтого нужно "notification". И минимальная длина "0" для "read" выглядит несколько странно...
Kalyan
Цитата
Здесь как-то бсе больше про ARMы...

Да, извиняюсь, не нашел более подходящего места.

Цитата
И минимальная длина "0" для "read" выглядит несколько странно...

Да, тут такая логика необходима:
Центральное устройство периодически читает эту характеристику, там содержится статус некой операции. Если операция еще не завершилась, то эта характеристика должна быть пустая (data len = 0), то есть центральное устройство не должно получать вообще данных, а уже если операция завершилась, то в этой характеристике должен быть 2-х байтный статус. Вот исходя с этой логики хотел менять длину данных в характеристике.
Axel
Цитата(Kalyan @ Aug 29 2018, 09:56) *
Центральное устройство периодически читает эту характеристику...

Так вроде для этого есть "indication". Хотя в Вашем случае восможно проще было-бы ввести статусный байт (передавать 2 или 3 байта - разница не драматическая).
AlexandrY
Цитата(Kalyan @ Aug 28 2018, 21:22) *
Возможно ли как то указать что длина данных у этой характеристики переменная?

Задаете соответствующий дескриптор - https://www.bluetooth.com/specifications/gatt/descriptors
Axel
Цитата(AlexandrY @ Aug 29 2018, 13:47) *
Задаете соответствующий дескриптор...

В дескрипторе вроде как можно только ограничить размер (сверху и снизу). Длину конкретной транзакции все равно надо сообщать через "notification"
Alechek
Цитата(Kalyan @ Aug 28 2018, 23:22) *
Возможно ли как то указать что длина данных у этой характеристики переменная?
Например инит длинна = 0 и максимальная длина = 2 байта.

Сферический конь в вакууме? Или чип nRF52?
Вообще что клиент сколько имеет, столько и выдаст, в рамках MTU-1

Цитата("BLUETOOTH SPECIFICATION Version 4.2 |Vol 3 @ Part G|")
4.8 CHARACTERISTIC VALUE READ
4.8.1 Read Characteristic Value
The Read Response only contains a Characteristic Value that is less than or
equal to (ATT_MTU – 1) octets in length. If the Characteristic Value is greater
than (ATT_MTU – 1) octets in length, the Read Long Characteristic Value
procedure may be used if the rest of the Characteristic Value is required.


Цитата(Axel @ Aug 29 2018, 17:19) *
Длину конкретной транзакции все равно надо сообщать через "notification"

Ничего подобного.
Более того, Notification опять таки ограничен MTU. Чтобы вычитать полную характеристику, нужно следом вызывать Read Long

Цитата(Kalyan @ Aug 29 2018, 11:56) *
Да, извиняюсь, не нашел более подходящего места.

Более подходящее место тут: Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Wireless/Optic

AlexandrY
Цитата(Axel @ Aug 29 2018, 15:19) *
В дескрипторе вроде как можно только ограничить размер (сверху и снизу). Длину конкретной транзакции все равно надо сообщать через "notification"

Если хочется менять длину переменной в пакете, то надо ее обновить в базе данных GATT дивайса.
Для этого база должна храниться в RAM. Что редко кто делает, ибо она большая.
А клиент перед чтением характеристики должен заново перечитать содержимое сервисов.
Новый смысл характеристики клиент узнает читая дескрипторы.
Нотификации тут только может быть можно использовать для того чтобы уведомить клиента о необходимости перечитать сервисы.
Короче много действий надо совершить.
Axel
Цитата(AlexandrY @ Aug 30 2018, 10:58) *
...Нотификации тут только может быть можно использовать для того чтобы уведомить клиента о необходимости перечитать сервисы.

Может оно и так... Я недавно соорудил что-то типа "bulk" сервиса на базе примера UART (Nordic). Там все нормально работает: notification сообщает объем, и все, что приготовил, нормально прилетает , естественно в пределах MTU (244 байта). Со стороны телефона использовал для отладки nRF connect. В том, что происходит внутри нее, не разбирался (пока).
Alechek
Цитата(Axel @ Aug 30 2018, 15:29) *
естественно в пределах MTU (244 байта).

BLE 4.2? Так вроде MTU 251 байт. И максимум объем данных в нотификации 248 байт.
Axel
Цитата(Alechek @ Aug 31 2018, 10:04) *
BLE 4.2? Так вроде MTU 251 байт. И максимум объем данных в нотификации 248 байт.

BLE5.0. В SDK от Nordic MTU определена 247 байт. Объяснение где-то видел (но где - сейчас не помню). Минус три служебных байта (opcode и connection handle)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.