Передача c STM32 по BLE информации на PC (Python, библиотека Bleak)
Нам нужна функция на C для микроконтроллера NUCLEO-WB55RG STM32WB Nucleo-64, которая надежно и достаточно быстро (за 1-5 секунд) может передавать сообщения размером около 15 КБ. Прием сообщения происходит на ПК на языке Python, библиотека Bleak.
Нам нужно:
1. Создать проект в STM32CubeIDE. Предоставить нам архив с проектом. Сделать запись экрана с созданием проекта в STM32CubeIDE с установкой всех настроек, так, чтобы, руководствуясь этой записью, мы смогли повторить все действия и создать аналогичный проект.
2. Предоставить C-функцию, которая надежно отправляет несколько сообщений с случайными данными.
3. Функция на Python, которая принимает эти данные и выводит их в консоль.
Дополнительная информация:
У нас уже есть код, который отправляет такие сообщения по BLE. Но пакеты часто теряются и сообщения приходят часто невалидные. Нам нужен код, который поддерживает повторную передачу пакетов, чтобы сообщения приходили валидные.
-
Чат бот Sage або GPT вам допоможуть.
Спробуйте) це не жарт.
-
Нам потрібна функція на С для мікроконтролера 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)
{
// Отримання повідомлення для передачі до ПК
// ...
// Виконання передачі повідомлення
// ...
}
}
-
Нам потрібно:
Створити проєкт у 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 ставок |