1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Jieli-Tech-fw-AC63_BT_SDK

 / Детали:

ЗАМЕЧАНИЕ: способ генерации MAC-адреса и динамическое его изменение

Предстоит сделать
Владелец
Создано  
05.03.2025

Раздел 1. Отношения по умолчанию SDK с MAC-адресами

  • Есть два MAC-адреса: адрес EDR и адрес BLE.
  • SDK хранит только адрес EDR, а адрес BLE генерируется путём преобразования адреса EDR.
  • Адрес BLE в коде и приложении отображается обратно.

Раздел 2. Программирование адреса EDR-MAC

Программируется адрес EDR, а не адрес BLE.
Программатор 1 на 8

Программатор 1 на 2

Раздел 3. Генерация случайного адреса EDR

Если программатор не программирует MAC-адрес, то при первом запуске устройства MAC-адрес не будет найден,
и будет сгенерирован случайный адрес, который будет сохранён в области VM внутренней флэшки.
При каждом последующем запуске устройство будет читать этот адрес.
Связанный код находится в user_cfg.c следующим образом:

u8 mac_buf_tmp[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
u8 mac_buf_tmp2[6] = {0, 0, 0, 0, 0, 0};
do {
    ret = syscfg_read(CFG_BT_MAC_ADDR, mac_buf, 6);
    if ((ret != 6) || !memcmp(mac_buf, mac_buf_tmp, 6) || !memcmp(mac_buf, mac_buf_tmp2, 6)) {
        get_random_number(mac_buf, 6);
        syscfg_write(CFG_BT_MAC_ADDR, mac_buf, 6);
    }
} while (0);
```### Раздел 4. Способ генерации адреса BLE
По умолчанию адрес BLE отличается от адреса EDR.
Адрес BLE генерируется согласно алгоритму отображения Джили, как другой адрес.
**Адрес BLE отображается наоборот на мобильном устройстве**
![](https://foruda.gitee.com/images/1687337490430391551/43ea59e4_515724.png)
Корреспондирующий код:
```c
lib_make_ble_address(tmp_ble_addr, (void *)bt_get_mac_addr()); //Используется метод отображения
#if 0 //Не использовать EDR, использовать EDR адрес как BLE адрес
    memcpy(tmp_ble_addr, bt_get_mac_addr(), 6); 
#endif
#if 0//Обратный BLE-MAC адрес
    u8 ble_addr[6];
    swapX(tmp_ble_addr, ble_addr, 6);
    memcpy(tmp_ble_addr, ble_addr, 6);
#endif
le_controller_set_mac((void *)tmp_ble_addr);
```### Раздел 5. Динамическое изменение MAC-адреса через код
Определите новый ID в syscfg_id.h
`#define CFG_USER_DEFINE_MAC 2`
```c
ble_module_enable(0);

u8 addr[6];
le_controller_get_mac(addr); // Получаем текущий адрес
put_buf(addr, 6);
addr[0]++; // Пример: увеличиваем на 1

// Для применения изменений после перезапуска системы, требуется определить новый ID VM для запоминания
// Наличие существующего поля CFG_BT_MAC_ADDR недопустимо, так как его можно записывать только один раз, поэтому требуется определить новый ID
/* int ret = syscfg_write(CFG_USER_DEFINE_MAC, addr, bcmMacAddrLen); */
/* r_printf("syscfg_write(CFG_USER_DEFINE_MAC):%d", ret); */
le_controller_set_mac((void *)addr); // Перезапись для нижележащего уровня

ble_module_enable(1);

Связанные ссылки

https://gitee.com/Jieli-Tech/fw-AC63_BT_SDK/issues/I52T43

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
蓝牙相关
label.
GitLife Service Account добавлено
 
工具相关
label.
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
git@api.gitlife.ru:oschina-mirror/Jieli-Tech-fw-AC63_BT_SDK.git
oschina-mirror
Jieli-Tech-fw-AC63_BT_SDK
Jieli-Tech-fw-AC63_BT_SDK