Перейти к содержанию
  • Регистрация
  • 0
chaplin.u@gmail.com

баг в компоненте TBluetoothLE

Вопрос

Нашёл баг в компоненте TBluetoothLE. По каким-то причинам длина передаваемого массива ограничена 20 байтами. Если посылаешь больше - ничего не передаётся.

Причём в компоненте данные хранятся ( запускаю отсылку - потом читаю = всё есть)  а на устройство не посылается вообще. 

К кому обращаться ? 

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


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

Рекомендуемые сообщения

  • 0

Это не баг, а фича. Так и должно работать. При использовании протокола GATT, максимальные пользовательские данные в пакете составляет 20 байт.  Если нужно больше, дробите на пакеты.

 

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


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

позвольте с Вами не согласиться т.к. в технологии  BluetoothLE  максимальный размер пакета увеличен до 512 байт. Это не мои вымыслы а проверено на практике.

Я работаю с программой которая следит за этим и есть донгл для отладки который выполняет функцию смартфона. Я через этот отладчик гонял спокойно большие пакеты.

 

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


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

Вот в файле Winapi.BluetoothLE.pas написано что минимум 23 а максимум 525 байт 

 

{ MTU }

  BTHLEENUM_ATT_MTU_MIN = 23; 
  {$EXTERNALSYM BTHLEENUM_ATT_MTU_MIN}
  BTHLEENUM_ATT_MTU_MAX = $FFFF;
  {$EXTERNALSYM BTHLEENUM_ATT_MTU_MAX}
  BTHLEENUM_ATT_MTU_DEFAULT = BTHLEENUM_ATT_MTU_MIN; 
  {$EXTERNALSYM BTHLEENUM_ATT_MTU_DEFAULT}
  BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION = 525; 
  {$EXTERNALSYM BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION

кто-то знает где копать ?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 04.09.2016 в 17:07, Евгений Корепов сказал:

Это не баг, а фича. Так и должно работать. При использовании протокола GATT, максимальные пользовательские данные в пакете составляет 20 байт.  Если нужно больше, дробите на пакеты.

 

Вот читаю характеристики.

BLE Размер данных пакета, байт — От 8 до 47.

А лучше вот тут читать

2.4. Bluetooth LE Packet Sizes and MTU
Изменено пользователем Pax Beach

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 9/12/2016 в 23:40, chaplin.u@gmail.com сказал:

BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION = 525; 

докопался до истины и она посредине. 

стандартно обмен идёт по минимуму - 20 байт

но есть процесс переговоров (NEGOTIATION ) между телефоном и устройством который может привести к увеличению пакета до 525 байт.

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

как и полностью отсутствует обмен паролем для защиты от постороннего вмешательства. т.е. любой посторонний может получить полный контроль над вашим устройством.

Вывод : компонента поставляется в ознакомительных целях и для создания коммерческих приложений запрещена !

Ну и если кто знает где есть нормальная компонента - просьба сообщить.

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, chaplin.u@gmail.com сказал:

докопался до истины и она посредине. 

стандартно обмен идёт по минимуму - 20 байт

но есть процесс переговоров (NEGOTIATION ) между телефоном и устройством который может привести к увеличению пакета до 525 байт.

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

как и полностью отсутствует обмен паролем для защиты от постороннего вмешательства. т.е. любой посторонний может получить полный контроль над вашим устройством.

Вывод : компонента поставляется в ознакомительных целях и для создания коммерческих приложений запрещена !

Ну и если кто знает где есть нормальная компонента - просьба сообщить.

 

Неожиданные выводы.

А тебе под какую платформу нужно?

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, chaplin.u@gmail.com сказал:

Android   iOS 

Просто у  Андроида отличные документированные библиотеки, с которыми мы можем просто работать через обертки. Про яблоки не знаю, но надеюсь так же. Интерфейсы для работы с  бле есть.

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

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


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

В Андроиде функции есть : https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#requestMtu(int)

Нет её реализации в компоненте.

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


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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
27 минут назад, ZuBy сказал:

Ага, только перепроверьте обёртку, очень часто они неправильно сгенерены...

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


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

Ребята вы меня не за того принимаете. Чукча не писатель.Чукча - читатель. Я не дельфиец а бильдеровец и могу только пользоваться готовой компонентой а не переделывать Абракадабру.

скажем такой код на жабе можно закатать в студию ?

 public static void exchangeGattMtu(int mtu) {
        int retry = 5;
        boolean status = false;
        while (!status && retry > 0) {
            status = mBluetoothGatt.requestMtu(mtu);
            retry--;
        }

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 минут назад, chaplin.u@gmail.com сказал:

Ребята вы меня не за того принимаете. Чукча не писатель.Чукча - читатель. Я не дельфиец а бильдеровец и могу только пользоваться готовой компонентой а не переделывать Абракадабру.

скажем такой код на жабе можно закатать в студию ?

 public static void exchangeGattMtu(int mtu) {
        int retry = 5;
        boolean status = false;
        while (!status && retry > 0) {
            status = mBluetoothGatt.requestMtu(mtu);
            retry--;
        }

Можно, предварительно подключив модуль Androidapi.JNI.Bluetooth.pas,

и инициализировав объект класа TJBluetoothGatt.

UPD:

в Berlin точно

Изменено пользователем Pax Beach

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, chaplin.u@gmail.com сказал:

может кто-то помочь ?  

Конкретнее пожалуйста, что нужно получить?

 

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


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

как-то реализовать функцию по увеличению пакета.  вот её описание : https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#requestMtu(int)

в файле c:\Program Files (x86)\Embarcadero\Studio\18.0\source\rtl\android\Androidapi.JNI.Bluetooth.pas  есть её вызов  :  function requestMtu(mtu: Integer): Boolean; cdecl;
а в компоненте её нет.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 05.12.2016 в 16:49, chaplin.u@gmail.com сказал:

докопался до истины и она посредине. 

стандартно обмен идёт по минимуму - 20 байт

но есть процесс переговоров (NEGOTIATION ) между телефоном и устройством который может привести к увеличению пакета до 525 байт.

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

как и полностью отсутствует обмен паролем для защиты от постороннего вмешательства. т.е. любой посторонний может получить полный контроль над вашим устройством.

Вывод : компонента поставляется в ознакомительных целях и для создания коммерческих приложений запрещена !

Ну и если кто знает где есть нормальная компонента - просьба 

Я что-то не уловил, а ее в какой момент надо вызывать?

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


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

сразу после подключения. но я её сам буду вызывать. нужно только сделать возможность её вызывать.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, chaplin.u@gmail.com сказал:

сразу после подключения. но я её сам буду вызывать. нужно только сделать возможность её вызывать.

Товарищи, выручайте человека!
Совсем нет времени сейчас на написание кода.

Но вот что я накопал:

 

// в событии компонента TBluetoothLE onConnectDevice получаем сущность устройства BLE
procedure TForm1.BluetoothLE1ConnectedDevice(const Sender: TObject; const ADevice: TBluetoothLEDevice);
begin
// здесь создаем syncronise нить с запросом MTU, до пяти раз долбим устройство

//параметр ADevice - TBluetoothLEDevice → TAndroidBluetoothLEDevice → JBluetoothDevice (Androidapi.JNI.Bluetooth.pas)
// И так, добрались в JNI, что дальше?
// Наверное каким-то образом через объект TJBluetoothDevice нужно получить доступ к интерфейсу JBluetoothGatt
// Я вижу возможность через метод connectGatt(context: JContext; autoConnect: Boolean; callback: JBluetoothGattCallback): JBluetoothGatt; cdecl;
// понятно, что предварительно мы должны иметь объект класса TJBluetoothGattCallback, наверное вызвав метод init()
// после получения доступа к объекту TJBluetoothGatt вызываем в нити метод requestMtu()
end;

 

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


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

я думаю что ты глубоко копнул. методы для подключения и др. в стандартной компоненте есть. я могу подключиться, получить все данные . послать и т.д. 

BLEDevice->Connect();
BLEDevice->DiscoverServices();
....

нужно только после подключения послать запрос на увеличение размера пакета. т.е. наверное что-то типа вызова интента.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, chaplin.u@gmail.com сказал:

я думаю что ты глубоко копнул. методы для подключения и др. в стандартной компоненте есть. я могу подключиться, получить все данные . послать и т.д. 

BLEDevice->Connect();
BLEDevice->DiscoverServices();
....

нужно только после подключения послать запрос на увеличение размера пакета. т.е. наверное что-то типа вызова интента.

Не верь никому, только мне одному!

Интентом здесь дело не решишь ни как.

Каждый раз, когда коннектится какое-то BLE к твоей мобиле, ты запрашиваешь у него нетрадиционный MTU. Это делается, как я описал. Ну или читай developer.*, там тебя научат, но примерно так же, как я написал )

 

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


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

а нельзя ли перегрузить компоненту новым методом ? тобишь добавить к существующим и вызывать  BLEDevice-> requestMtu()

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, chaplin.u@gmail.com сказал:

а нельзя ли перегрузить компоненту новым методом ? тобишь добавить к существующим и вызывать  BLEDevice-> requestMtu()

 

Можно.

Но это то же самое, что я написал, только в промышленном масштабе.

Для Андроида будет вызов этого метода, а для остальных платформ будут заглушки, потому что мы пока не знаем как в других API  это реализовано.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 08.12.2016 в 12:56, chaplin.u@gmail.com сказал:

ок. путь есть. теперь нужно найти проводника ( желательно не Сусанина)...

Не знаю почему, но у меня компонент BluetoothLE вообще не находит ни одно устройство, ни на ноуте, ни на телефоне.

Трудно что-то тестировать без этого.

 

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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