Jump to content

    

BLE

Добрый день.

Работаю с BLE - создаю BLE peripheral device. В GATT профайле определен один сервис в котором определена одна характеристика со свойством read.

Эта характеристика описана двумя атрибутами (Declaration - uuid -0x2803 и само value c 16 байтным uuid).

Вопрос относительно длины данных для атрибута value этой характеристики. Возможно ли как то указать что длина данных у этой характеристики переменная?

Например инит длинна = 0 и максимальная длина = 2 байта.

Share this post


Link to post
Share on other sites
...Работаю с BLE...

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

Share this post


Link to post
Share on other sites
Здесь как-то бсе больше про ARMы...

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

 

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

Да, тут такая логика необходима:

Центральное устройство периодически читает эту характеристику, там содержится статус некой операции. Если операция еще не завершилась, то эта характеристика должна быть пустая (data len = 0), то есть центральное устройство не должно получать вообще данных, а уже если операция завершилась, то в этой характеристике должен быть 2-х байтный статус. Вот исходя с этой логики хотел менять длину данных в характеристике.

Share this post


Link to post
Share on other sites
Центральное устройство периодически читает эту характеристику...

Так вроде для этого есть "indication". Хотя в Вашем случае восможно проще было-бы ввести статусный байт (передавать 2 или 3 байта - разница не драматическая).

Share this post


Link to post
Share on other sites
Задаете соответствующий дескриптор...

В дескрипторе вроде как можно только ограничить размер (сверху и снизу). Длину конкретной транзакции все равно надо сообщать через "notification"

Share this post


Link to post
Share on other sites
Возможно ли как то указать что длина данных у этой характеристики переменная?

Например инит длинна = 0 и максимальная длина = 2 байта.

Сферический конь в вакууме? Или чип nRF52?

Вообще что клиент сколько имеет, столько и выдаст, в рамках MTU-1

 

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.

 

Длину конкретной транзакции все равно надо сообщать через "notification"

Ничего подобного.

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

 

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

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

 

 

Share this post


Link to post
Share on other sites
В дескрипторе вроде как можно только ограничить размер (сверху и снизу). Длину конкретной транзакции все равно надо сообщать через "notification"

Если хочется менять длину переменной в пакете, то надо ее обновить в базе данных GATT дивайса.

Для этого база должна храниться в RAM. Что редко кто делает, ибо она большая.

А клиент перед чтением характеристики должен заново перечитать содержимое сервисов.

Новый смысл характеристики клиент узнает читая дескрипторы.

Нотификации тут только может быть можно использовать для того чтобы уведомить клиента о необходимости перечитать сервисы.

Короче много действий надо совершить.

Share this post


Link to post
Share on other sites
...Нотификации тут только может быть можно использовать для того чтобы уведомить клиента о необходимости перечитать сервисы.

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

Share this post


Link to post
Share on other sites
естественно в пределах MTU (244 байта).

BLE 4.2? Так вроде MTU 251 байт. И максимум объем данных в нотификации 248 байт.

Share this post


Link to post
Share on other sites
BLE 4.2? Так вроде MTU 251 байт. И максимум объем данных в нотификации 248 байт.

BLE5.0. В SDK от Nordic MTU определена 247 байт. Объяснение где-то видел (но где - сейчас не помню). Минус три служебных байта (opcode и connection handle)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this