Передача c STM32 по BLE інформації на PC (Python, бібліотека Bleak)
3900 UAHДобрий день
Нам потрібна функція на С для мікроконтролера NUCLEO-WB55RG STM32WB Nucleo-64, яка надійно і досить швидко (за 1-5 секунд) може передавати повідомлення розміром в районі 15 КБ. Прийом повідомлення відбувається на ПК у мові Python, бібліотека Bleak.
Нам потрібно:
1. Створити проєкт у STM32CubeIDE. Надати нам архів із проєктом. Зробити запис екрана зі створенням проєкту в STM32CubeIDE зі встановленням усіх налаштувань, так, щоб керуючись цим записом, ми змогли повторити всі дії і створити аналогічний проєкт.
2. Надати С-функцію, яка надійно відправляє кілька повідомлень із випадковими даними.
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.
Будь ласка, зверніть увагу, що код, наведений вище, є загальним прикладом і має бути адаптований до вашої конкретної апаратної і програмної конфігурації.
-
Актуальні фриланс-проєкти в категорії Вбудовані системи та мікроконтролери
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 ставок |