• 0
chaplin.u@gmail.com

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

Вопрос

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

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

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

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


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

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

  • 0

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

 

Pax Beach и Kitty понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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

Rusland понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 байт.

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

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

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

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

 

Pax Beach, Rusland и Евгений Корепов понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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)

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

Rusland понравилось это

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


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

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

Равиль Зарипов (ZuBy) и Pax Beach понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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
Kitty понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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

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


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

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

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

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

 

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу