• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLE модули TB-04/TB-03F (TLSR8253F512)

pvvx

Активный участник сообщества
Quuppa также может быть настроена на использование собственных каналов, на которых метки Quuppa могут быть настроены на передачу с частотой до 50 Гц.
А это для pvvx - cкока скока это микросекунд?
В BLE несколько каналов и реклама от маяка может идти на любом через интервал передачи фрейма описанный вам ранее :p
50 Гц - это псего 20 ms. В режиме соединения BLE имеет тайминг в 7.5 ms и не жужжит, а успевает обмениваться сообщениями и прыгать по каналам, выбирая незашумлённый :p.
 

pvvx

Активный участник сообщества
Для реализации "прыгания" в BLE c версий 5.0 вроде, введена новая метода CSA.
Текущая SDK Support Bluetooth5.0+ PHY (1 and 2 Mbps), CSA1/CSA2 (Channel Selection Algorithm) (уже включено в custom прошивке для термометров)
а так-же LongRange (там ещё 2 типа модуляции). Но с LongRange беда на конечных приемных устройствах.
Футбольное поле, т.е. стадион, LongRange покрывает без проблем. Там прямая видимость, а не коридоры с рабами-грузчиками :)
И если используется свой чип, то нет никаких сложностей включить LongRange.
 

pvvx

Активный участник сообщества
LongRange - это почти тот-же ZigBee. Но чипы ZigBee, к примеру от nRF имеют масенькую выходную мощность и требуют дополнительного чипа усилителя чтобы сравняться с тем-же TLSR825x. Может в новых nRF и повысят выходную мощю, но по текущей ситуации с самосанкциями-самоликвидацией оптимизма нет ...
 
Скорее всего нарушена последовательность исполнения команд.
Таки да, оно скорее всего было. Какой-то странный пример у flutter_blue на гитхабе дан. Посмотрел пакету в кишки и переписал свой пример с await на Stream и все вроде побежало. Свой пример сделал на скорую руку, без проверки переменных на null и поэтому он сыплет в лог ошибками во время коннекта, не обращайте внимания. Зато цепляется он за характеристику замечательно. Прикладываю исходник к сообщению.

Появились новые вопросы.

1) Итак подписываемся на характеристику 00001f11-0000 выводим данные которые пришли. Данные с термометра приходят исправно, а вот данных других рядом расположенных устройств нет (например С8478CACE53E). А на страничке AdScanerTrg2.html они есть . Я что то делаю не так?

Подписываюсь я на прослушку так

C-like:
_advC = _advS!.characteristics.firstWhere(
      (e) => e.uuid == Guid('00001f11-0000-1000-8000-00805f9b34fb'),
    );
    print('Advert - $_advC');
    _advC!.setNotifyValue(true).then((value) {
      print('set notify');
      _advC!.value.listen(
        _onNewData,
        onError: _onMsg,
        onDone: _onDone,
      );
    });

sshot-14.jpg

2) Второй вопрос уже по логике самого TLSR825xScaner

Как я понял основная работа производится в файле scanning .c в методе scan_task?
На каждое обнаружение нового девайса выдается свой pushNotifyData ?
Так?
Мне бы хотелось сначала собрать все обнаруженные девайсы (числом до 32?) и запихать их в одну adv notification (вместо расширенных данных термометра).
Не подскажете какие файлы и методы мне надо для этого изучить и модифицировать, а какие лучше не трогать? :)
 

Вложения

pvvx

Активный участник сообщества
Таки да, оно скорее всего было. Какой-то странный пример у flutter_blue на гитхабе дан.
Где-то там люди прикручивают модуль синхронизации и пишут что многое не работает при методах перечисления данных из массивов и т.д. Меняют на for :)
а вот данных других рядом расположенных устройств нет (например С8478CACE53E). А на страничке AdScanerTrg2.html они есть .
С8478CACE53E дает структуру UUD16 0x181D и она не дешифрируется. Вообще программа AdScanerTrg заточена только на определенные данные/форматы в рекламе, те, которые могут быть применимы для переключения её выходов.
Мне бы хотелось сначала собрать все обнаруженные девайсы (числом до 32?) и запихать их в одну adv notification (вместо расширенных данных термометра).
Не подскажете какие файлы и методы мне надо для этого изучить и модифицировать, а какие лучше не трогать? :)
Там простой СИ и никаких "методов" или объектов не используется.
Да, вам надо выкинуть всё в scaning.c, очистить scanning_event_callback() до минимума - сравнения с MAC и создания таблицы RSSI...
 

pvvx

Активный участник сообщества
Вообще такая фигня пишется на любом чипе. К примеру на BL702.
Вот - что-то подобное тестировал (bl_mcu_sdk\examples\ble\ble_ad_repeater):
 

Вложения

pvvx

Активный участник сообщества
Возможно и на ESP32, но BL70x проще - у него и USB есть и легко программируется, да в наличии и за дешево на всех китайских контрактных производствах печатных плат со сборкой для чайников-частников...
 

pvvx

Активный участник сообщества
HTML к тесту bl_mcu_sdk\examples\ble\ble_ad_repeater , не доделанный (не парсит рекламу на структуры)
1647874534740.png
 

Вложения

С8478CACE53E дает структуру UUD16 0x181D и она не дешифрируется.
Мне и не надо ее дешифровывать. Мне нужен просто mac и RSSI. AdScanerTrg их выводит, а я подписавшись на
Сharacteristics '00001f11-0000-1000-8000-00805f9b34fb' их не вижу. Или неподходящие устройства отправляются в другую Сharacteristics?
 

pvvx

Активный участник сообщества
Мне и не надо ее дешифровывать. Мне нужен просто mac и RSSI. AdScanerTrg их выводит, а я подписавшись на
Сharacteristics '00001f11-0000-1000-8000-00805f9b34fb' их не вижу. Или неподходящие устройства отправляются в другую Сharacteristics?
Ещё раз - отправляются только структуры из рекламы имеющие заголовок GAP_ADTYPE_SERVICE_DATA_UUID_16BIT
Остальные данному устройству не нужны, т.к. это ретранслятор данных с конкретных термометров (устройств с известными форматами). Лишнее там затесалось случайно, т.к. так проще было написать. Скоро во внутреннее обслуживание для переключения выводов чипа туда добавлю формат 'HA-BLE'...
 

pvvx

Активный участник сообщества
bl_mcu_sdk\examples\ble\ble_ad_repeater передает полный принятый рекламный пакет, но пытается исключить дублирования (канал соединения не безграничен по пропускной способности и каждая передача выбивает прием рекламы). Пока это кое-как реализовано. Надо вписать нормальный FIFO, для исключения передачи дублирующихся рекламных пакетов...
А вам нужен другой алгоритм обработки принятых пакетов.
 

pvvx

Активный участник сообщества
Если отправлять все рекламные пакеты - это будет сплошной поток.
USB свисток в компе обычно передает 2 рекламы в 100 мс. Телефон с включенным BLE - аналогично. Какой Apple - дык там вообще по 20 рекламных пакетов в секунду... BLE лампочки - тоже десятку реклам в секунду. И ещё особенно MESH... и так каждое устройство с BLE. В итоге в эфире сплошной спам и канал передачи будет постоянно занят на всю 1Mbit/s, аналогично каналу приема. Когда тогда принимать нужные рекламы?
 

pvvx

Активный участник сообщества
BLE cниффер у меня принимает к сотне рекламных пакетов в секунду. Это поток уже за 0.5 Mбит/c..
По этому без фильтрации этот спам передавать нет смысла.
 

pvvx

Активный участник сообщества
И ещё – каждая реклама передается на 3-х каналах. TLSR825x успевает захватить прием по трем каналам – результат = 3 принятых одинаковых рекламы. И реклама ещё дублируется каждые N периодов. В итоге, если приемник качественный, то кол-во принятых пакетов с рекламных каналов будет равно полосе приемника = 1Mbit/s. Хорошо что BLE ограничен по расстоянию, что дает возможность принимать только ближайших (селективность), а удаленные не создают коллизий из-за ослабевания сигнала…
А с WiFi всё гораздо хуже.
 

pvvx

Активный участник сообщества
Какой-то странный пример у flutter_blue на гитхабе дан.
Ныне всё open-source опасно и неизвестна причина по чему не работает - там может кто-то быть занятым борьбой за место $ под солнцем...
ПО для ESP32 с BLE уже пишет лозунги и не только :)
 
Вопрос тут возник, а если зашить проект TLSR825xScaner (как он есть, ничего не меняя) в термомометр он будет работать?
И как долго он продержится от встроенной в термометр батарейки?
 

pvvx

Активный участник сообщества
Вопрос тут возник, а если зашить проект TLSR825xScaner (как он есть, ничего не меняя) в термомометр он будет работать?
Будет, но вывод на LCD не дописан.
И как долго он продержится от встроенной в термометр батарейки?
Не знаю, там постоянный ток за 6 мА только при приеме...
 
С flutter_blue разобрался, рекомендованный ими в примере flutterBlue.startScan();как то замысловато работает, продолжая сканировать в фоне даже тогда, когда дана команда stopScan.
А вот имеющийся в библиотеке flutterBlue.scan(); работает нормально. В спойлере полный пример работы если вдруг кому надо.
C:
  final List<String> _edgeDev = [   // "лузы"
    "a4:c1:38:67:7d:4c",   
  ];

  final List<String> _beaconDev = [ // "шарики"
    "a4:c1:38:32:f0:d0"   
  ];

  final List<String> _rssi = ['', '', '', '']; // для прорисовки результата

  dynamic _startScan() async {
    FlutterBlue.instance.scan().listen((e) {
      if (isEdgeDev(e.device)) {
        _processScanResult(e);
      }
    });
  }

  bool isEdgeDev(BluetoothDevice d) {
    return _edgeDev.contains(d.id.id.toLowerCase());
  }

  void _onNewData(BluetoothCharacteristic _advC, List<int> l) {
    // print('=data====== $l');
    if (l.length > 11 && l[8].toUnsigned(8) == 0x16) {
      var rssi = l[0].toSigned(8);
      var mac = l.sublist(1, 7).reversed;
      String s = '';
      for (var b in mac) {
        s += b.toRadixString(16) + ":";
      }
      s = s.substring(0, s.length - 1);
      var indx = _beaconDev.indexOf(s);
      print('=data====== $s  $rssi');

      if (indx >= 0 && indx <= _rssi.length) {
        setState(
          () => _rssi[indx] = rssi.toString(),
        );
      }
    }
  }

  void _processScanResult(ScanResult e) {
    e.device.state.listen(
      (state) async {
        if (state == BluetoothDeviceState.connected) {
          print('===== device connected');
          e.device.mtu.listen((value) async {
            print('=mtu====== $value');
            e.device.discoverServices();
          });
          e.device.services.listen((services) {
            var _advS = services.firstWhere(
              (e) => e.uuid == Guid('00001f10-0000-1000-8000-00805f9b34fb'),
            );
            var _advC = _advS.characteristics.firstWhere(
              (e) => e.uuid == Guid('00001f11-0000-1000-8000-00805f9b34fb'),
            );
            _advC.setNotifyValue(true).then((value) {
              _advC.value.listen((l) {
                _onNewData(_advC, l);
              });
            });
          });
          await e.device.requestMtu(63);
        } else if (state == BluetoothDeviceState.disconnected) {
          print('===== device disconnected');
        }
      },
    );
    e.device.connect();
  }

По умолчанию реклама приходит очень редко, где-то раз в одну две секунды. Решил "разогнать" ее побыстрее.
Нашел и исправил в ble.h следующие константы (уменьшил интервалы примерно в 10 раз)

C:
#define MY_ADV_INTERVAL_MIN    ADV_INTERVAL_100MS // ADV_INTERVAL_1S
#define MY_ADV_INTERVAL_MAX    (ADV_INTERVAL_100MS+ADV_INTERVAL_5MS)    // (ADV_INTERVAL_1S+ADV_INTERVAL_35MS)
Также в файле ble.c в методе blc_ll_setScanParameter исправил SCAN_INTERVAL_100MS на SCAN_INTERVAL_10MS
C:
void start_adv_scanning(void) {
    //scan setting
    blc_ll_initScanning_module(mac_public);
    //bluetooth low energy(LE) event
    blc_hci_le_setEventMask_cmd(HCI_LE_EVT_MASK_ADVERTISING_REPORT);
    blc_hci_registerControllerEventHandler(scanning_event_callback); //controller hci event to host all processed in this func
    //set scan parameter and scan enable
    blc_ll_setScanParameter(SCAN_TYPE_PASSIVE, SCAN_INTERVAL_10MS, SCAN_INTERVAL_10MS, //SCAN_INTERVAL_100MS, SCAN_INTERVAL_100MS,
                              OWN_ADDRESS_PUBLIC, SCAN_FP_ALLOW_ADV_ANY);
    blc_ll_setScanEnable(BLC_SCAN_ENABLE, DUP_FILTER_DISABLE);

    blc_ll_addScanningInAdvState();  //add scan in adv state
    blc_ll_addScanningInConnSlaveRole();  //add scan in conn slave role
}

Скорость обмена с приложением особо не изменилась. Я что-то забыл?

ps: сейчас пришло в голову, что любая веревочка имеет два кончика и помимо сканнера на TB-03 есть и "маячок" в роли которого выступает термометр с вашей прошивкой. Его же наверно тоже "разогнать" нужно?
 

pvvx

Активный участник сообщества
Также в файле ble.c в методе blc_ll_setScanParameter исправил SCAN_INTERVAL_100MS на SCAN_INTERVAL_10MS
А это пофигу - на скорость не влияет. Это тайминги переключения сканирования по каналам...

Скорость обмена с приложением особо не изменилась. Я что-то забыл?
Для connection свои connection interval и latency.
ps: сейчас пришло в голову, что любая веревочка имеет два кончика и помимо сканнера на TB-03 есть и "маячок" в роли которого выступает термометр с вашей прошивкой. Его же наверно тоже "разогнать" нужно?
Для термометров есть настройки в TelinkMiFlasher.html.
 
Сверху Снизу