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

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

Translated3900 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.


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

Актуальные фриланс-проекты в категории Встраиваемые системы и микроконтроллеры

Исследовать электронный блок "генератор импульсного тока"

Необходимо исследовать электронный блок "генератор импульсного тока". Нужны измерения: частота импульсов, форма сигнала, длительность импульса, скважность, напряжение на выходе до катушки, ток через катушку, потребляемая мощность, сопротивление/индуктивность катушки, нагрев во…

Встраиваемые системы и микроконтроллеры ∙ 1 день 12 часов назад ∙ 1 ставка

Струмознімач

1000 UAH

Необходимо разработать Кольцевой токосъемник. Данные. Внутренний диаметр 20мм Наружный до 250мм 1-канальным разъемом Ethernet 4 канала по 25ампер 10 сигнальных каналов по 2а.

Встраиваемые системы и микроконтроллеры ∙ 2 дня 11 часов назад ∙ 1 ставка

Нам нужен специалист или команда для разработки полноценной экосистемы умного дома.

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

Веб-программированиеВстраиваемые системы и микроконтроллеры ∙ 2 дня 14 часов назад ∙ 23 ставки

Схема та PCB дизайн

4000 UAH

Это не сложная схема контроллера вентиляторов. Эскиз схемы предоставлю от руки. Нужно оформить в KiCad схему и реализовать дизайн платы. По схеме добавить реализацию небольшого Buck конвертера. Детали будут обсуждены еще по ходу. Ожидается BOM и Gerber пакет для подачи на…

Встраиваемые системы и микроконтроллерыЧертежи и схемы ∙ 3 дня 9 часов назад ∙ 8 ставок

Телеграм

7249 UAH

Предлагаю работу по восстановлению доступа к аккаунту Telegram. Мой аккаунт Telegram был взломан, в связи с чем ищу специалиста, который сможет помочь решить данную проблему и восстановить доступ к аккаунту. Готов рассмотреть ваши предложения по стоимости услуг.…

Встраиваемые системы и микроконтроллерыРазработка под iOS (iPhone и iPad) ∙ 3 дня 15 часов назад ∙ 9 ставок

Заказчик
Проект опубликован
2 года назад
42 просмотра