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

BLE модуль JDY-10 на чипе TLSR8266

mikolainer

New member
Здравствуйте, товарищи! Продолжаю разбираться с BLE. Теперь столкнулся с проблемой описания сервисов...

что делаю:
C:
///////////////////////////////////// ATT  HANDLER define ///////////////////////////////////////
//...
typedef enum
{
    ATT_H_START = 0,

    //...

    //// switch ////
    /**********************************************************************************************/
    MySwitch_PS_H,                            //UUID: 2802,     VALUE: uuid mySer_ID
    MySwitch_val_CD_H,                        //UUID: 2803,     VALUE:              Prop: Read | Write
    MySwitch_val_DP_H,                        //UUID:    myID,    VALUE: sw

    ATT_END_H
}ATT_HANDLE;
//...
C:
//...

const u8 mySer_UUID[] =     {0x66, 0x9a, 0x0c, 0x20, 0x00, 0x08, 0x0d, 0x9d, 0xeb, 0x11, 0x60, 0xa7, 0x70, 0x12, 0x3f, 0x71};
const u8 myChar_UUID[] =         {0x66, 0x9a, 0x0c, 0x20, 0x00, 0x08, 0x0d, 0x9d, 0xeb, 0x11, 0x60, 0xa7, 0x71, 0x12, 0x3f, 0x71};
const u8 my_UUID[] =         {0x66, 0x9a, 0x0c, 0x20, 0x00, 0x08, 0x0d, 0x9d, 0xeb, 0x11, 0x60, 0xa7, 0x72, 0x12, 0x3f, 0x71};

//...

u8  sw[] = {0};

//...

// MY_SWITCH attribute values
static const u8 my_switchCharVal[] = {
    CHAR_PROP_READ | CHAR_PROP_WRITE,
    U16_LO(MySwitch_val_DP_H), U16_HI(MySwitch_val_DP_H),
    0x66, 0x9a, 0x0c, 0x20, 0x00, 0x08, 0x0d, 0x9d, 0xeb, 0x11, 0x60, 0xa7, 0x72, 0x12, 0x3f, 0x71 // my_UUID
};

//...

const attribute_t my_Attributes[] = {
//...
{3,ATT_PERMISSIONS_READ,
            2,128,
            (u8*)(&my_primaryServiceUUID),
            (u8*)(&mySer_UUID),
            0},

    {0,ATT_PERMISSIONS_READ,
            2,sizeof(my_switchCharVal),
            (u8*)(&my_characterUUID),
            (u8*)(&my_switchCharVal),
            0},

    {0,ATT_PERMISSIONS_READ,
            128,sizeof(sw),
            (u8*)(&my_UUID),
            (u8*)(sw),
            0}
};

//...

проблема:
в BLE сканнере на телефоне вижу только GAP, GATT и Device Information, в котором могу получить значение PnP ID.
делал свой switch по образу и подобию Device Information, но не только обращаться к sw[] не могу, а даже не вижу своих ни профиля, ни аттрибута, ни характеристики...
что не так? devHandbook кажется уже весь перекопал.
IMG_2415.PNG
 

pvvx

Активный участник сообщества

Вложения

aloika

Active member
Никак не могу понять, как работает Power Management в примере ble_module. Помогите разобраться, люди добрые.

Итак, главный цикл (лишнее в коде убрал для наглядности):

Код:
void main_loop ()
{
    ////////////////////////////////////// BLE entry /////////////////////////////////
    blt_sdk_main_loop();
    
    ////////////////////////////////////// UI entry /////////////////////////////////
    //  add spp UI task
    user_loop();

    app_power_management ();
}
app_power_management:

Код:
void app_power_management ()
{

    // pullup GPIO_WAKEUP_MODULE: exit from suspend
    // pulldown GPIO_WAKEUP_MODULE: enter suspend

    if (!tick_wakeup)
    {
        bls_pm_setSuspendMask(SUSPEND_ADV | SUSPEND_CONN);
        bls_pm_setWakeupSource(PM_WAKEUP_CORE);  // GPIO_WAKEUP_MODULE needs to be wakened
    }

    if (tick_wakeup && clock_time_exceed (tick_wakeup, 500))
    {
        GPIO_WAKEUP_MODULE_LOW;
        tick_wakeup = 0;
    }
}
И еще есть функция, которая запускается по событию выхода из режима suspend:

Код:
void app_suspend_exit ()
{
    GPIO_WAKEUP_MODULE_HIGH;  //module enter working state
    bls_pm_setSuspendMask(SUSPEND_DISABLE);
    tick_wakeup = clock_time () | 1;
}
Здесь
Код:
#define GPIO_WAKEUP_MODULE_HIGH                gpio_setup_up_down_resistor(GPIO_PE6, PM_PIN_PULLUP_10K);
#define GPIO_WAKEUP_MODULE_LOW                gpio_setup_up_down_resistor(GPIO_PE6, PM_PIN_PULLDOWN_100K);
Вопросы:
1. tick_wakeup = clock_time () | 1; - это то же, что tick_wakeup = clock_time () ? зачем " | 1 " ?
2. Зачем эти переключения GPIO?
3. И вообще - как это работает? Т.е. сначала tick_wakeup равно нулю. Срабатывает первый if в app_power_management(). На одной из следующих итераций (?) модуль засыпает. В какой-то момент просыпается, ставит маску, что не надо спать, взводит таймер (app_suspend_exit()). Далее, проходит несколько итераций, через 500 мкс срабатывает второй if в app_power_management(), сбрасываем таймер и на следующей итерации сработает снова первый if. Что такое эти 500 мкс? Что 500 мкс точно не спим?
 

pvvx

Активный участник сообщества
1. tick_wakeup = clock_time () | 1; - это то же, что tick_wakeup = clock_time () ? зачем " | 1 " ?
Чтобы отличить 0 от счета.
2. Зачем эти переключения GPIO?
Чтобы внешний контролер по уровню на пине знал, к примеру, что можно слать в UART - модуль активен.
3. И вообще - как это работает? Т.е. сначала tick_wakeup равно нулю. Срабатывает первый if в app_power_management(). На одной из следующих итераций (?) модуль засыпает. В какой-то момент просыпается, ставит маску, что не надо спать, взводит таймер (app_suspend_exit()). Далее, проходит несколько итераций, через 500 мкс срабатывает второй if в app_power_management(), сбрасываем таймер и на следующей итерации сработает снова первый if. Что такое эти 500 мкс? Что 500 мкс точно не спим?
Чтобы UART успел вывести свои сообщения до аппаратного отключения при входе в сон. Или чтобы успеть доделать какие-то делишки до перехода в сон.
 

pvvx

Активный участник сообщества
Слепил 'ретранслятор/сборщик' BLE рекламы для датчиков IoT.
1619711103826.png
Может применяться для увеличения расстояния до датчиков... или для Windows, т.к. брелки BT-USB и адаптеры BT в Windows не принимают рекламные пакеты нормально.
В UART передает рекламу всегда. При соединении с устройством передает данные рекламы c MAC и RSSI в сервис 0xffe1...
Можно вписать вылавливание какого датчика и делать переключение по значениям и другие сценарии.
К примеру custom прошивка Xiaomi LYWSD03MMC умеет переключать передаваемый бит в рекламе по назначенным температуре и/или влажности с гистерезисом. Т.е. там назначаем когда включать "обогреватель", а данное устройство будет его включать.
Исходники кину по требованию и/или когда будет время подчистить их...
 

aloika

Active member
Ещё раз: Когда SoC спит GPIO контролер отключен и никакие OUT push-pull и прочие не работают. Работают только "подтяжки".
Еще тут оказалось, что если задать выход из сна по GPIO и установить это GPIO в состояние, пробуждающее контроллер и при этом на каждой итерации уходить в сон/тут же пробуждаться по этому GPIO, то контроллер будет занят только этим и нарушатся тайминги BLE. И установленное соединение разорвется. Так что надо перед установкой режима сна проверять, в каком состоянии пробуждающие GPIO, и если они не в том, которое для сна - маску сна не ставить.
Хотя вроде как в книжке написано, что при GPIO не в положении для сна, то не должно уходить в сон, и выдавать STATUS_GPIO_ERR_NO_ENTER_PM. Но это во внутренней функции.

В общем, в целом понятно, как PM работает, "в мелочах" есть хитрые нюансы.
 

pvvx

Активный участник сообщества
В общем, в целом понятно, как PM работает, "в мелочах" есть хитрые нюансы.
Нюанс в том, где стоит проверка, назначение, включение/отключение флагов сна на пробуждающий gpio. Короче вся последовательность, включая процедуры срабатывающие по событиям в SDK. Если последовательность правильная, то пофигу проверка состояния gpio - просто не заснет...
Без постоянно подключенного PowerProfiler вообще ничего энергосберегающего для BLE не написать...
 
Купил на али десяток jdy-10. Половина изх них не шьется через uart.
"Error get version floader"
С этим что то можно поделать? Вторая половина зашилась без проблем.
 

volaltd

Member
Скоро лето, а это значит смену деятельности и хобби на весь сезон...
Во-во, как это знакомо когда напилят-напилят и пошли, сам так делаю ибо могу и ничего никому не должен :)))
А с новой ревизией JDY-10 как нам быть сенсей совсем не подскажет?
 

pvvx

Активный участник сообщества
Рискну предположить что следует попытаться ее прошить программатором на stm32. Как доберусь до паяльника проверю это предположение
Там вроде OTA и USB программирование было прошито. Какой ещё UART?
 
Там вроде OTA и USB программирование было прошито.
Уточню. "Там" - это в 5 штуках из 10 свежекупленных мной на aliexpress чипов JDY-10? Тех что видны среди устройств BT под именем JDY-10M-2.3 ?

Тот что через USB-COM на чипе cp2102 к ногам tx,rx и reset.
 
Сверху Снизу