Перейти к содержанию
    

Добрый день.

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Работаю с BLE...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь как-то бсе больше про ARMы...

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Центральное устройство периодически читает эту характеристику...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Задаете соответствующий дескриптор - https://www.bluetooth.com/specifications/gatt/descriptors

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задаете соответствующий дескриптор...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Например инит длинна = 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

естественно в пределах MTU (244 байта).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...