• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

pecherskih

Member
Тогда еще немного глупых вопросов, если позволите :))

Там, куда Вы меня направили рассмотрен формат сообщения.
043E1B02010000A5808FE648540F0201060B161C182302C4090303BF13CC
И сказано, что длина содержится в 3 байте и далее разложено на составляющие. Но нигде не говорится, про первый два байта. Что они означают?

Так, как я понял, Вы являетесь автором этого формата, то сишные хедеры можно посмотреть только тут - ATC_MiThermometer ?

Про MAC адрес не очень понял. Вроде в примере его озвучили, а дельше идет, что он не обязателен ...
Привет. Может я влезаю не к месту, но формат передачи данных в BLE следующий: Всё сообщение разбивается на блоки. Вначале каждого блока идет байт длины этого блока, второй байт - это указатель на то что блок содержит. Ну а дальше идет наполнение этого блока. Я привел пример из спецификации, а так же сервисы с описанием чего могут блоки содержать.

Всё это хорошо смотреть при помощи программы nRF Connect на телефоне. Я вот к примеру немного модифицировал прошивку B25x_ble_sample и получил устройство с Вашим именем :) Ну а так же показываю что содержат сырые данные в advertising-e. Думаю теперь станет понятно на счет содержимого посылок.
 

Вложения

  • 141.7 KB Просмотры: 24
  • 230.4 KB Просмотры: 23

Slacky

Member
О, сайт отлип. Можно еще пару глупых вопросов?

Если мы попали в main_loop() - то пока не дернем PM и не выйдем из этого main_loop, модуль не уснет?

Еще не могу настроить whitelist. Т.е. делаю все по инструкции (вроде), код возврата ll_whiteList_add() 0, т.е. отработала правильно. Но, перестает соединяться с данным устройством. Как и где (может функция callback какая есть) причину отказа? А то и в логах андроида тишина, просто код 135 - что-то там GATT_ERROR ...

А, вот еще. Что делает вот эта запись (последняя строка), для чего нужен это InССС?

C:
//////////////////////// Battery /////////////////////////////////////////////////
static const u16 my_batServiceUUID        = SERVICE_UUID_BATTERY;
static const u16 my_batCharUUID             = CHARACTERISTIC_UUID_BATTERY_LEVEL;
_attribute_data_retention_ uint16_t batteryValueInCCC;

attribute_data_retention_ attribute_t my_Attributes[] = {
    ////////////////////////////////////// Battery Service /////////////////////////////////////////////////////
    // 0018 - 002d
    {4,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), (u8*)(&my_batServiceUUID), 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_batCharVal),(u8*)(&my_characterUUID), (u8*)(my_batCharVal), 0},                //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(battery_level),(u8*)(&my_batCharUUID), (u8*)(&battery_level), 0},    //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(batteryValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&batteryValueInCCC), 0},   //value
}
Спасибо.
 

pvvx

Активный участник сообщества
О, сайт отлип. Можно еще пару глупых вопросов?

Если мы попали в main_loop() - то пока не дернем PM и не выйдем из этого main_loop, модуль не уснет?
main_loop() вызывается в цикле в "main.c":
C:
    while (1) {
#if (MODULE_WATCHDOG_ENABLE)
        wd_clear(); //clear watch dog
#endif
        main_loop();
    }
В main_loop() вызывается blt_sdk_main_loop() - в нем проверяются флаги SuspendMask:
C:
void main_loop(void) {
    blt_sdk_main_loop();
    if (ota_is_working) {
        bls_pm_setSuspendMask (SUSPEND_ADV | SUSPEND_CONN);
        bls_pm_setManualLatency(0);
    } else {
        if(Sleep) { // ваше условие спать или нет
            bls_pm_setSuspendMask(
                SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN);
        } else {
             bls_pm_setSuspendMask(SUSPEND_DISABLE);
    }
}
Если флаги вариантов сна не выставили (был вызов с SUSPEND_DISABLE), то не заснет.
Еще не могу настроить whitelist. Т.е. делаю все по инструкции (вроде), код возврата ll_whiteList_add() 0, т.е. отработала правильно. Но, перестает соединяться с данным устройством. Как и где (может функция callback какая есть) причину отказа? А то и в логах андроида тишина, просто код 135 - что-то там GATT_ERROR ...
Мне не понятен вопрос. Не описано что хотите получить. Я не пользовался whitelist, но там должно быть всё просто...
А, вот еще. Что делает вот эта запись (последняя строка), для чего нужен это InССС?
Для того, чтобы узнать, что выставлен Notify.
Если batteryValueInCCC != 0 -> Notify enable. Проверяете этот флаг и если он не равен нулю и соединение активно, то через какй-то шаг времени или событие передаете данные (батарейки).
 

pecherskih

Member
О, сайт отлип. Можно еще пару глупых вопросов?

Если мы попали в main_loop() - то пока не дернем PM и не выйдем из этого main_loop, модуль не уснет?

Еще не могу настроить whitelist. Т.е. делаю все по инструкции (вроде), код возврата ll_whiteList_add() 0, т.е. отработала правильно. Но, перестает соединяться с данным устройством. Как и где (может функция callback какая есть) причину отказа? А то и в логах андроида тишина, просто код 135 - что-то там GATT_ERROR ...

А, вот еще. Что делает вот эта запись (последняя строка), для чего нужен это InССС?

C:
//////////////////////// Battery /////////////////////////////////////////////////
static const u16 my_batServiceUUID        = SERVICE_UUID_BATTERY;
static const u16 my_batCharUUID             = CHARACTERISTIC_UUID_BATTERY_LEVEL;
_attribute_data_retention_ uint16_t batteryValueInCCC;

attribute_data_retention_ attribute_t my_Attributes[] = {
    ////////////////////////////////////// Battery Service /////////////////////////////////////////////////////
    // 0018 - 002d
    {4,ATT_PERMISSIONS_READ,2,2,(u8*)(&my_primaryServiceUUID), (u8*)(&my_batServiceUUID), 0},
    {0,ATT_PERMISSIONS_READ,2,sizeof(my_batCharVal),(u8*)(&my_characterUUID), (u8*)(my_batCharVal), 0},                //prop
    {0,ATT_PERMISSIONS_READ,2,sizeof(battery_level),(u8*)(&my_batCharUUID), (u8*)(&battery_level), 0},    //value
    {0,ATT_PERMISSIONS_RDWR,2,sizeof(batteryValueInCCC),(u8*)(&clientCharacterCfgUUID),(u8*)(&batteryValueInCCC), 0},   //value
}
Спасибо.
Посмотри здесь: https://habr.com/ru/post/505078/ в конце статьи небольшой пункт с заголовком Дескриптор. В двух словах, это что бы ты с телефона (клиента), смог включить на блоке (сервере) нотификацию.
 

Slacky

Member
Мне не понятен вопрос. Не описано что хотите получить. Я не пользовался whitelist, но там должно быть всё просто...
Да в том-то и дело, вроде просто, но не работает. А как проверить, может я адрес криво прописал, не понятно.

C:
#define MAC1                    {0x88, 0x10, 0x8F, 0x2D, 0x06, 0x16}

uint8_t mac1[6] = MAC1;

void user_init_normal(void) {
    ...
    ///////////////////// USER application initialization ///////////////////

    if (whitelist_enable) {
        ll_whiteList_reset();
        ll_whiteList_add(BLE_ADDR_PUBLIC, mac1);
    }
    bls_ll_setAdvParam(ADV_INTERVAL_MIN, ADV_INTERVAL_MAX,
            ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL,
            BLT_ENABLE_ADV_ALL,
            whitelist_enable?ADV_FP_ALLOW_SCAN_ANY_ALLOW_CONN_WL:ADV_FP_NONE);
    
    bls_ll_setScanRspData((uint8_t *) ble_name, ble_name[0]+1);
    bls_ll_setAdvEnable(BLC_ADV_ENABLE);  //ADV enable

}
Screenshot_20220725_111233_com.android.settings.jpg
 

Slacky

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

pecherskih

Member
Коллеги, добрый день. Хочу запустить пример 825x_module из b85m_ble_single_connection_sdk.
Сначала он не хотел собираться, но почитав Q&A документа AN-21112300-E_Telink B85m BLE Single Connection SDK Developer Handbook разобрался как увеличить память до 32к. Проект собрался. Прочитал как передавать данные через модуль на телефон с компа и обратно вот здесь: 12. BLE SPP Module файла AN_19112700-E_Telink 8232 BLE SDK Developer Handbook. Данные с телефона на комп передаются согласно протокола, а вот обратно не получается. Делаю всё как надо, ножки UARTa инициализированы правильно, но передать данные на телефон не получается. Никто не занимался этим протоколом? В описании пишется, что модуль должеy отвечать на посылку с компа, но у меня ответа не приходит и передача по BLE не идет. Вот пример посылки: 1C FF 07 00 11 00 01 02 03 04 05
 

aloika

Active member
Коллеги, добрый день. Хочу запустить пример 825x_module из b85m_ble_single_connection_sdk.
Сначала он не хотел собираться, но почитав Q&A документа AN-21112300-E_Telink B85m BLE Single Connection SDK Developer Handbook разобрался как увеличить память до 32к. Проект собрался. Прочитал как передавать данные через модуль на телефон с компа и обратно вот здесь: 12. BLE SPP Module файла AN_19112700-E_Telink 8232 BLE SDK Developer Handbook. Данные с телефона на комп передаются согласно протокола, а вот обратно не получается. Делаю всё как надо, ножки UARTa инициализированы правильно, но передать данные на телефон не получается. Никто не занимался этим протоколом? В описании пишется, что модуль должеy отвечать на посылку с компа, но у меня ответа не приходит и передача по BLE не идет. Вот пример посылки: 1C FF 07 00 11 00 01 02 03 04 05
Я делал проект свой на основе этого примера, всё там работает. А что значит "передать данные на телефон"? Вы соединяете модуль с телефоном, так? Модуль у вас слейв (сервер), телефон - мастер (клиент), так? На телефоне пишите данные в вашу характеристику, на модуле в соответствующем обработчике - получаете. И обратно - на модуле вызываете что-то типа bls_att_pushNotifyData(SPP_SERVER_TO_CLIENT_DP_H, (u8 *) &data_array, data_length); - на телефоне в вашей характеристике получаете.
 

pecherskih

Member
Я делал проект свой на основе этого примера, всё там работает. А что значит "передать данные на телефон"? Вы соединяете модуль с телефоном, так? Модуль у вас слейв (сервер), телефон - мастер (клиент), так? На телефоне пишите данные в вашу характеристику, на модуле в соответствующем обработчике - получаете. И обратно - на модуле вызываете что-то типа bls_att_pushNotifyData(SPP_SERVER_TO_CLIENT_DP_H, (u8 *) &data_array, data_length); - на телефоне в вашей характеристике получаете.
Это только половина истории. После того как модуль примет данные от телефона, он передает их в СОМ порт. И я эти данные получаю через преобразователь UART/USB в терминале. А обратно команды от компа модуль не обрабатывает. В этом и проблема.
 

aloika

Active member
Возьмите пример про UART и из него сделайте. Я делал BLE-UART "переходник", работает в обе стороны.

Т.е. в прерывании от UART-а просто пишите в характеристику и всё.

Но есть один момент. Если просто писать в прерывании, то программа падает. Поэтому я делал через софт-таймер: blt_soft_timer_add(&UARTtoBLE, 1); Т.е. не пишем вот прямо сейчас, а планируем таймер, а он уж запустит функцию, когда можно будет.
И работает до 1000000 бод стабильно, да и выше скорость можно поставить, но там уже будет USB-UART переходник влиять, не все вытягивают высокие скорости.

C:
// UART->BLE
int UARTtoBLE(void)
{

    LED2_TOGGLE;


    if(blc_ll_getCurrentState() == BLS_LINK_STATE_CONN )

    {
    ble_sts_t status=0;
    status=bls_att_pushNotifyData(SPP_SERVER_TO_CLIENT_DP_H, rec_buff.data, rec_buff.dma_len);


    }

return -1;

}








#define rec_buff_Len    16
#define trans_buff_Len    16
volatile unsigned int cnt=0;



void app_uart_test_irq_proc(void)
{

#if (UART_MODE==UART_DMA)

    unsigned char uart_dma_irqsrc;
    //1. UART irq
    uart_dma_irqsrc = dma_chn_irq_status_get();///in function,interrupt flag have already been cleared,so need not to clear DMA interrupt flag here


    if(uart_dma_irqsrc & FLD_DMA_CHN_UART_RX){
        dma_chn_irq_status_clr(FLD_DMA_CHN_UART_RX);

        uart_dmairq_rx_cnt++;

        //Received uart data in rec_buff, user can copy data here

        blt_soft_timer_add(&UARTtoBLE, 1);

    }
    if(uart_dma_irqsrc & FLD_DMA_CHN_UART_TX){
        dma_chn_irq_status_clr(FLD_DMA_CHN_UART_TX);

        uart_dmairq_tx_cnt++;
    }

#elif(UART_MODE==UART_NDMA)

   ...


#endif
 

pecherskih

Member
Спасибо, сейчас буду пробовать. А что вы имели ввиду, говоря про пример с UART-ом? Это как раз пример 825х_module или что то другое?
 

Slacky

Member
А вот такой еще вопрос, понимаю, что скорей всего внятного ответа не получу, но вдруг :))

Почему модуль BT-04 может не конектиться с телефоном (допустим с программой nRF Connect от Нордика)? Т.е. он может законектися, но раза с 10. Причем устройство с именем и самим RAW пакетом прекрасно видно.

Сперва я думал, что это я чего-то не правильно накодил. Но пример из SDK b85m_ble_sample вообще без какой-либо переделки ведет себя точно также.

Есть идеи?
 

aloika

Active member
А вот такой еще вопрос, понимаю, что скорей всего внятного ответа не получу, но вдруг :))

Почему модуль BT-04 может не конектиться с телефоном (допустим с программой nRF Connect от Нордика)? Т.е. он может законектися, но раза с 10. Причем устройство с именем и самим RAW пакетом прекрасно видно.

Сперва я думал, что это я чего-то не правильно накодил. Но пример из SDK b85m_ble_sample вообще без какой-либо переделки ведет себя точно также.

Есть идеи?
А что в логах NRF Connect'а ?
 

Slacky

Member
А что в логах NRF Connect'а ?
Да собственно ничего полезного

Код:
nRF Connect, 2022-07-22
Watermeter_B70845 (A4:C1:38:B7:08:45)
V    19:16:40.652    Connecting to A4:C1:38:B7:08:45...
D    19:16:40.652    gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, preferred PHY = LE 1M)
D    19:16:43.377    [Callback] Connection state changed with status: 133 and new state: DISCONNECTED (0)
E    19:16:43.377    Error 133 (0x85): GATT ERROR
I    19:16:43.377    Disconnected
Причем вот только сейчас специально проверил, а он, скотина, прекрасно соединяется. А потом бац и перестал ...
 

pecherskih

Member
А вот такой еще вопрос, понимаю, что скорей всего внятного ответа не получу, но вдруг :))

Почему модуль BT-04 может не конектиться с телефоном (допустим с программой nRF Connect от Нордика)? Т.е. он может законектися, но раза с 10. Причем устройство с именем и самим RAW пакетом прекрасно видно.

Сперва я думал, что это я чего-то не правильно накодил. Но пример из SDK b85m_ble_sample вообще без какой-либо переделки ведет себя точно также.

Есть идеи?
Я думаю приложение на телефоне проверяет номера сервисов. Однако почему иногда работает - не понятно. Я вот у tlsr8258 переписал имя в рекламе и переобозначил сервис так же как у NUS (Nordic Uart Servise). Если к такому чуду приконнектиться через nRF Connect, то приложение узнает свой сервис NUS. Но через nRF Tools->UART увидеть сие чудо не захотело :)
 

pvvx

Активный участник сообщества
А вот такой еще вопрос, понимаю, что скорей всего внятного ответа не получу, но вдруг :))

Почему модуль BT-04 может не конектиться с телефоном (допустим с программой nRF Connect от Нордика)? Т.е. он может законектися, но раза с 10. Причем устройство с именем и самим RAW пакетом прекрасно видно.

Сперва я думал, что это я чего-то не правильно накодил. Но пример из SDK b85m_ble_sample вообще без какой-либо переделки ведет себя точно также.

Есть идеи?
1. ВТ модуль в телефоне старый, не дружит с соединениями у которых интервал менее 12 ms. К таким относятся большинство кирпичей от Apple...
2. Очень старый Android - там это частая ошибка.
3. Кривые описания в my_Attributes[].

На TLSR825x у меня такого не встречалось, кроме случая когда косячил в таблице Attributes.
 

pvvx

Активный участник сообщества
Ранее, несколько лет назад, было часто, но тогда были старые BT и Android изменение connection interval на от 12 ms в плюс помогало...
Ныне везде проходит минимальный интервал и громадный latency - всё и везде ok.
Но в термометрах "для народу" интервал увеличен - у массы пользователей огрызки и на них ОЧЕНЬ ЧАСТО не работает интервал менее 12 ms. Видимо в них ставят самые древние чипы BT или Яблоко как всегда против общих стандартов.
 

pvvx

Активный участник сообщества
Так-же смотрите установленный уровень RF-TX. Их 2 типа у TLSR825x: VANT и VBAT.
VANT - это питание от встроенного стабилизатора и там максимум +3.01 dbm, а VBAT+10.46 dbm.
СR2032 не тянет VBAT - реальный уровень RF-TX падает ужасно, батарейка не может дать пиковый ток более 15 мА при необходимом напряжении. И если выставили VBAT+10.46 dbm, то придется подносить устройство прямо к адаптеру в притык, чтобы как-то исправить - перезалить по ОTA или в опциях, если таковые есть у вас в ПО.

Без лога со сниффера более ничего не сказать.
 
Сверху Снизу