• 0
chaplin.u@gmail.com

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

Вопросы

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

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

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

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


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

50 ответов на этот вопрос

  • 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 вообще не находит ни одно устройство, ни на ноуте, ни на телефоне.

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

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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