Switch to English?
Yes
Переключитись на українську?
Так
Переключиться на русскую?
Да
Przełączyć się na polską?
Tak
Розмістіть свій проєкт безплатно та почніть отримувати пропозиції від фрилансерів-виконавців уже через хвилини після публікації!

Передача c STM32 по BLE інформації на PC (Python, бібліотека Bleak)

3900 UAH

  • Олексій Мамонтов
    23 квітня 2024, 9:33 |

    Чат бот Sage  або GPT  вам допоможуть.

    Спробуйте) це не жарт.

  • Костянтин Корчагін
    23 квітня 2024, 12:02 |

    Зробіть це і заробіть 100$.

  • Алексей Присяжной
    24 квітня 2024, 6:33 |

    Возможность удаленной отладки на вашем устройстве возможна?

  • Олексій Мамонтов
    23 квітня 2024, 21:08 |

    https://poe.com  ))


    Нам потрібна функція на С для мікроконтролера NUCLEO-WB55RG STM32WB Nucleo-64, яка надійно і досить швидко (за 1-5 секунд) може передавати повідомлення розміром в районі 15 КБ. Прийом повідомлення відбувається на ПК у мові Python, бібліотека Bleak



    Assistant


    Poe

    Ось приклад функції на мові С, яка може передавати повідомлення розміром близько 15 КБ з мікроконтролера NUCLEO-WB55RG STM32WB Nucleo-64 до комп'ютера з використанням бібліотеки Bleak у мові Python:


    #include "ble.h"

    #include "ble_gattc.h"

    #include "ble_hci.h"

    #include "ble_srv_common.h"


    #define BLE_UUID_MY_CUSTOM_SERVICE 0x1234

    #define BLE_UUID_MY_CUSTOM_CHAR    0x5678


    static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;  // Зберігає дескриптор підключення


    // Ініціалізація BLE сервісів та характеристик

    static void services_init(void)

    {

        uint32_t            err_code;

        ble_uuid_t          service_uuid;

        ble_uuid128_t       base_uuid = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00};

        ble_gatts_service_t my_service;

        ble_uuid_t          char_uuid;

        ble_gatts_char_md_t char_md;

        ble_gatts_attr_md_t cccd_md;

        ble_gatts_attr_md_t attr_md;

        ble_gatts_attr_t    attr_char_value;


        // Ініціалізуємо сервіс

        memset(&my_service, 0, sizeof(my_service));

        service_uuid.uuid              = BLE_UUID_MY_CUSTOM_SERVICE;

        err_code = sd_ble_uuid_vs_add(&base_uuid, &service_uuid.type);

        APP_ERROR_CHECK(err_code);

        my_service.uuid                = service_uuid;

        my_service.type                = BLE_GATTS_SVC_TYPE_PRIMARY;

        my_service.char_num            = 1;

        my_service.chars               = &char_md;

        err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &my_service, &m_service_handle);

        APP_ERROR_CHECK(err_code);


        // Ініціалізуємо характеристику

        memset(&char_md, 0, sizeof(char_md));

        char_uuid.uuid                 = BLE_UUID_MY_CUSTOM_CHAR;

        err_code = sd_ble_uuid_vs_add(&base_uuid, &char_uuid.type);

        APP_ERROR_CHECK(err_code);

        char_md.char_props.read         = 1;

        char_md.char_props.write        = 1;

        char_md.p_char_user_desc        = NULL;

        char_md.p_char_pf               = NULL;

        char_md.p_user_desc_md          = NULL;

        char_md.p_cccd_md               = &cccd_md;

        char_md.p_sccd_md               = NULL;

        err_code = sd_ble_gatts_characteristic_add(m_service_handle, &char_md, &attr_char_value, &m_char_handles);

        APP_ERROR_CHECK(err_code);

    }


    // Обробник події BLE GATT зчитування

    static void on_read(ble_evt_t const * p_ble_evt)

    {

        uint32_t err_code;

        ble_gatts_evt_read_t const * p_evt_read = &p_ble_evt->evt.gatts_evt.params.read;


        if (p_evt_read->handle == m_char_handles.value_handle)

        {

            // Зчитування характеристики

            // Розмір повідомлення буде міститися у p_evt_read->len

        }

    }


    // Обробник події BLE GATT запису

    static void on_write(ble_evt_t const * p_ble_evt)

    {

        uint32_t err_code;

        ble_gatts_evt_write_t const * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;


        if (p_evt_write->handle == m_char_handles.value_handle)

        {

            // Запис характеристики

            // Повідомлення буде міститися у p_evt_write->data та його розмір у p_evt_write->len


            // Відправка повідомлення до ПК через Bleak

        }

    }


    //Продовження коду:


    // Функція ініціалізації BLE модуля

    static void ble_stack_init(void)

    {

        uint32_t err_code;


        err_code = nrf_sdh_enable_request();

        APP_ERROR_CHECK(err_code);


        err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);

        APP_ERROR_CHECK(err_code);


        err_code = nrf_sdh_ble_enable(&ram_start);

        APP_ERROR_CHECK(err_code);


        ble_conn_state_init();

    }


    // Обробник BLE подій

    static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)

    {

        switch (p_ble_evt->header.evt_id)

        {

            case BLE_GAP_EVT_CONNECTED:

                m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;

                break;


            case BLE_GAP_EVT_DISCONNECTED:

                m_conn_handle = BLE_CONN_HANDLE_INVALID;

                break;


            case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:

                on_rw_authorize_request(p_ble_evt);

                break;


            case BLE_GATTS_EVT_READ:

                on_read(p_ble_evt);

                break;


            case BLE_GATTS_EVT_WRITE:

                on_write(p_ble_evt);

                break;


            default:

                // Інші події можна обробити за необхідністю

                break;

        }

    }


    // Функція ініціалізації BLE модуля та сервісів

    void ble_init(void)

    {

        ble_stack_init();

        gap_params_init();

        gatt_init();

        services_init();

        advertising_init();

        conn_params_init();

        peer_manager_init();


        // Реєстрація обробника подій BLE

        NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);

    }


    // Основна функція

    int main(void)

    {

        // Ініціалізація мікроконтролера та BLE

        // ...


        // Очікування передачі повідомлення

        while (true)

        {

            // Отримання повідомлення для передачі до ПК

            // ...


            // Виконання передачі повідомлення

            // ...

        }

    }


  • Олексій Мамонтов
    23 квітня 2024, 21:11 |

    Нам потрібно:


    Створити проєкт у STM32Cube.


    Надати С-функцію, яка надійно відправляє кілька повідомлень із випадковими даними.


    Функція на Python, яка приймає ці дані та виводить їх у консоль.


    Додаткова інформація:


    У нас уже є код, який надсилає такі повідомлення по BLE. Але пакети часто губляться і повідомлення приходять часто невалідні. Нам потрібен код, який підтримує повторну передачу пакетів, щоб повідомлення приходили валідні.



    Assistant


    Poe

    Розумію ваші вимоги. Ось пояснення крок за кроком для виконання вашого завдання:


    Крок 1: Створення проєкту у STM32Cube


    Відкрийте STM32CubeIDE і створіть новий проєкт для вашого мікроконтролера NUCLEO-WB55RG.


    Виберіть потрібні налаштування для вашого проєкту, такі як тип мікроконтролера, системний тактовий джерело, налаштування GPIO, налаштування BLE і т.д. Виберіть бібліотеку STM32Cube HAL для роботи з BLE.


    Після створення проєкту ви отримаєте початковий код для створення програми на мікроконтролері.


    Крок 2: С-функція для надсилання повідомлень


    Ось приклад C-функції, яка надійно відправляє кілька повідомлень з випадковими даними через BLE:


    c

    Copy

    #include "ble.h"

    #include "ble_gattc.h"

    #include "ble_hci.h"

    #include "ble_srv_common.h"


    #define BLE_UUID_MY_CUSTOM_SERVICE 0x1234

    #define BLE_UUID_MY_CUSTOM_CHAR    0x5678


    static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;  // Зберігає дескриптор підключення


    // Функція для надсилання повідомлень через BLE

    void send_messages(void)

    {

        // Отримання випадкових даних для повідомлень

        // ...


        // Повторення надсилання повідомлень, поки не будуть надіслані всі повідомлення

        while (!all_messages_sent)

        {

            // Надсилання кожного повідомлення

            for (int i = 0; i < num_messages; i++)

            {

                bool message_sent = false;


                while (!message_sent)

                {

                    // Надсилання повідомлення

                    // ...


                    // Очікування підтвердження передачі

                    // ...


                    if (confirmation_received)

                    {

                        message_sent = true;

                    }

                    else

                    {

                        // Повторна передача повідомлення

                        // ...

                    }

                }

            }

        }

    }

    У цьому прикладі функція send_messages() використовує цикли для повторної передачі повідомлень, поки всі повідомлення не будуть успішно надіслані. Ви повинні додати власну логіку для отримання випадкових даних для повідомлень та надсилання повідомлень через BLE.


    Крок 3: Функція Python для прийому повідомлень


    Ось приклад функції на мові Python, яка приймає дані через BLE і виводить їх у консоль:


    python

    Copy

    import asyncio

    from bleak import BleakClient


    async def receive_messages():

        async with BleakClient("device_address") as client:

            while True:

                # Очікування отримання повідомлення

                message = await client.read_gatt_char("characteristic_uuid")


                # Обробка отриманого повідомлення

                process_message(message)


    asyncio.run(receive_messages())

    В цьому прикладі ви повинні замінити "device_address" на адресу вашого мікроконтролера та "characteristic_uuid" на UUID характеристики, через яку ви надсилаєте повідомлення.


    Цей код використовує бібліотеку bleak, яка надає можливість здійснювати з'єднання з BLE-пристроями та отримувати дані з характеристик. Ви повинні встановити цю бібліотеку, використовуючи pip install bleak.


    Будь ласка, зверніть увагу, що код, наведений вище, є загальним прикладом і має бути адаптований до вашої конкретної апаратної і програмної конфігурації.

Актуальні фриланс-проєкти в категорії Вбудовані системи та мікроконтролери

Tuya смарт проект

Для wi fi пристрою. В пошуку спеціаліста з Tuya IoT Platform / Tuya Panel Studio, Досвід роботи з CBU обов'язково! Необхідно виконати Реєстрація аккаунта 1. Налаштування продукту в Tuya IoT Platform 2.Налаштування Data Points (DP) 3. Розробка інтерфейсу в Tuya 4.Налаштування…

Вбудовані системи та мікроконтролериГібридні мобільні додатки ∙ 23 години 13 хвилин тому ∙ 4 ставки

Шукаю AI Automation Engineer

1000 UAH

Потрібен AI Automation Engineer, спеціаліст для створення системи активного пошуку клієнтів та розумного аутрічу (не звичайний чат-бот-автовідповідач) у В2В проект Збір даних: автоматичний парсинг контактів з «сліпих» баз за назвами. Розумна розсилка: інтеграція…

AI та машинне навчанняВбудовані системи та мікроконтролери ∙ 2 дні 20 годин тому ∙ 15 ставок

Консультація інженера мікро - електроніки / Embedded Developer

20 000 UAH

Шукаємо на проєкт - інженера електроніки / Embedded Developer. Потрібні - розробити електронну схему; Запрограмувати кілька мікроконтролерів C/C++ / Embedded-розробка логіки роботи і підключення апаратного обчислювального блоку та сенсорів тестування та налагодження електронних…

ІнжинірингВбудовані системи та мікроконтролери ∙ 6 днів 7 годин тому ∙ 2 ставки

Дослідити електронний блок “генератор імпульсного струму”

Потрібно дослідити електронний блок “генератор імпульсного струму”. Потрібні вимірювання: частота імпульсів, форма сигналу, тривалість імпульсу, шпаруватість, напруга на виході до котушки, струм через котушку, споживана потужність, опір/індуктивність котушки, нагрів під час…

Вбудовані системи та мікроконтролери ∙ 8 днів 2 години тому ∙ 2 ставки

Нам потрібен спеціаліст або команда для розробки повноцінної екосистеми розумного дому.

Нам потрібен спеціаліст або команда для розробки повноцінної екосистеми розумного дому. Ідея проекту: створити центральний пристрій/хаб, до якого можна підключати різні пристрої розумного дому: світло, розетки, клімат, опалення, датчики, камери, замки, побутову техніку,…

Веб-програмуванняВбудовані системи та мікроконтролери ∙ 9 днів 4 години тому ∙ 29 ставок

Замовник
Проєкт опублікований
2 роки тому
42 перегляди