Transmission from STM32 via BLE information to PC (Python, Bleak library)
We need a function in C for the NUCLEO-WB55RG STM32WB Nucleo-64 microcontroller that can reliably and quickly (within 1-5 seconds) transmit messages of around 15 KB. Message reception takes place on a PC in Python using the Bleak library.
We need:
1. Create a project in STM32CubeIDE. Provide us with an archive of the project. Record the screen with the project creation in STM32CubeIDE, including all settings, so that by following this recording, we can repeat all actions and create a similar project.
2. Provide a C function that reliably sends multiple messages with random data.
3. A Python function that receives this data and outputs it to the console.
Additional information:
We already have code that sends such messages via BLE. However, packets are often lost and messages frequently arrive invalid. We need code that supports packet retransmission to ensure valid message delivery.
-
Чат бот 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.
Будь ласка, зверніть увагу, що код, наведений вище, є загальним прикладом і має бути адаптований до вашої конкретної апаратної і програмної конфігурації.
-
Current freelance projects in the category Desktop Apps
Need an Airtable architect to build a relational schema and a new clean Airtable base.Need help rethinking and building a clean relational schema for an internal operational system on Airtable. The current database is already in use by the team, but it has grown organically: the structure is partially flat, some tables/views are actively used, while others are… Databases & SQL, Desktop Apps ∙ 2 days 16 hours back ∙ 9 proposals |
Creation of software for generating cutting files for wooden puzzlesWe are looking for a developer to create software that automates the process of building cutting files for wooden jigsaw puzzles. Current Process Currently, each file is created manually by a designer in Adobe Illustrator. The file contains: the outer contour of the puzzle in… Desktop Apps ∙ 2 days 21 hours back ∙ 14 proposals |
Small edit on the website
16 USD
Need to update the offer agreement in the footer to a new one, the company has changed its regulations Task will take 20 minutes Web Programming, Desktop Apps ∙ 3 days 22 hours back ∙ 110 proposals |
Account reconciliation tool with the bank, cards, and accountantTechnical Assignment: Tool for Reconciling Accounts with Bank, Cards, and AccountantGeneral Goal A local tool (script/small application in Python) is needed, which is manually run once every 1-2 months on my computer and performs reconciliation between: Invoices I issued to… Python, Desktop Apps ∙ 6 days 5 hours back ∙ 43 proposals |
Add pauses of 10-30 seconds between sending emails.Hello! I am looking for an experienced 1C / BAS (BAF) programmer to promptly resolve a technical issue with email distribution.Problem essence: We use the accounting program BAF (Business Automation Framework), version 2.0. Once a month, there is a need to send about 300 emails… Web Programming, Desktop Apps ∙ 11 days 21 hours back ∙ 10 proposals |