• Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу