Przesyłanie informacji z STM32 przez BLE do komputera PC (Python, biblioteka Bleak)
Potrzebujemy funkcji w języku C dla mikrokontrolera NUCLEO-WB55RG STM32WB Nucleo-64, która może niezawodnie i dość szybko (w ciągu 1-5 sekund) przesyłać wiadomości o rozmiarze około 15 KB. Odbiór wiadomości odbywa się na komputerze PC w języku Python, biblioteka Bleak.
Potrzebujemy:
1. Utwórz projekt w STM32CubeIDE. Prześlij nam archiwum z projektem. Nagraj ekran z tworzeniem projektu w STM32CubeIDE z ustawieniem wszystkich parametrów, abyśmy mogli powtórzyć wszystkie czynności i utworzyć analogiczny projekt, kierując się tą rejestracją.
2. Przedstaw funkcję w języku C, która niezawodnie wysyła kilka wiadomości z losowymi danymi.
3. Funkcja w języku Python, która przyjmuje te dane i wyświetla je w konsoli.
Dodatkowe informacje:
Mamy już kod, który wysyła takie wiadomości przez BLE. Jednak pakiety często się gubią i wiadomości często są nieprawidłowe. Potrzebujemy kodu, który obsługuje ponowne przesyłanie pakietów, aby wiadomości były poprawne.
-
Чат бот 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.
Будь ласка, зверніть увагу, що код, наведений вище, є загальним прикладом і має бути адаптований до вашої конкретної апаратної і програмної конфігурації.
-
Aktualne zlecenia dla freelancerów w kategorii Aplikacje desktopowe
Narzędzie do porównywania rachunków z bankiem, kartami i księgowymZadanie techniczne: narzędzie do porównywania rachunków z bankiem, kartami i księgowymOgólny cel Potrzebne jest lokalne narzędzie (skrypt/mała aplikacja w Pythonie), które uruchamiane ręcznie co 1-2 miesiące na moim komputerze i dokonuje porównania między: Rachunkami, które… Python, Aplikacje desktopowe ∙ 1 dzień 9 godzin temu ∙ 37 ofert |
Dodać przerwy 10-30 sekund między wysyłkami e-mailiWitam! Szukam doświadczonego programisty 1C / BAS (BAF) do szybkiego rozwiązania problemu technicznego z wysyłką maili.Istota problemu: Używamy programu księgowego BAF (Business Automation Framework), edycja 2.0. Raz w miesiącu pojawia się potrzeba masowego wysyłania klientom… Programowanie stron internetowych, Aplikacje desktopowe ∙ 7 dni 1 godzina temu ∙ 10 ofert |
Rewersowe inżynieria konsolowych narzędzi do ankietowania kontrolerów SSD (Flash ID)1. Cel pracy Wydzielenie interfejsu programowania aplikacji (API) do interakcji z kontrolerami SSD/NVMe z dostarczonego zestawu narzędzi konsolowych (Phison, Silicon Motion, Realtek, Maxiotek, Marvell, JMicron itd.). Wynikiem ma być działający kod w języku C/C++ lub dokładna… C i C++, Aplikacje desktopowe ∙ 7 dni 13 godzin temu ∙ 6 ofert |