BLE Serial и BLE HidKeyboard на ESP32 одновременно

Всем привет. Я пользуюсь ESP32 и PlatformIO и хочу сделать Bluetooth устройство в котором будет и Serial и HIDKeyboard. Я пробывал следовать этой инструкции - https://github.com/espressif/arduino-esp32/issues/1150, но в результате появляется 2 разных устройства - каждое со своей функцией. Я хочу сделать 1 устройство которое будет поддерживать и SerialPort, и HIDKeyboard. Я пробывал это - https://gist.github.com/manuelbl/66f059effc8a7be148adb1f104666467 и это - https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLETests/Arduino/BLE_uart/BLE_uart.ino по отдельности и это работало. Если подключится к устройству и зайти в Панель управления - устройства и принтеры - свойства - оборудование, там появляются HIDKeyboard и UART соответственно. НО я не могу запустить обе эти части одновременно.

(Я подразумеваю, что UART и Serial это "синонимы" в моём случае, если я не прав, то поправьте меня. В любом случае мне пока принципиально не важно как передавать информацию между устройствами, по UART, Serial, (или я ещё слышал можно через сам HIDProtocol). Дайте мне наводку на любой вариант!)

Это фото демонстрирует как работает мой код сейчас. Там где я выделил красным - это строка появляется при добавлении части примера по UART, но похоже я что-то упустил из-за чего эта служба не опознаётся как UART

Инициализация BLE*

void bluetoothTask(void*) {

// initialize the device
BLEDevice::init(DEVICE_NAME);
BLEServer* server = BLEDevice::createServer();
server->setCallbacks(new ServerCallbacks());

// create an HID device
hid = new BLEHIDDevice(server);
input = hid->inputReport(1); // report ID
output = hid->outputReport(1); // report ID
output->setCallbacks(new KeyboardOutputCallbacks());

// set manufacturer name
hid->manufacturer()->setValue("Maker Community");
// set USB vendor and product ID
hid->pnp(0x02, 0xe502, 0xa111, 0x0210);
// information about HID device: device is not localized, device can be connected
hid->hidInfo(0x00, 0x02);

// Security: device requires bonding
BLESecurity* security = new BLESecurity();
security->setAuthenticationMode(ESP_LE_AUTH_BOND);

// set report map
hid->reportMap((uint8_t*)REPORT_MAP, sizeof(REPORT_MAP));
hid->startServices();

// set battery level to 100%
hid->setBatteryLevel(100);



BLEService *pService = server->createService(SERVICE_UUID);

// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(
                                    CHARACTERISTIC_UUID_TX,
                                    BLECharacteristic::PROPERTY_NOTIFY
                                );
                  
pTxCharacteristic->addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
                                          CHARACTERISTIC_UUID_RX,
                                          BLECharacteristic::PROPERTY_WRITE
                                      );

pRxCharacteristic->setCallbacks(new UARTRXCallbacks());

// Start the service
pService->start();




// advertise the services
BLEAdvertising* advertising = server->getAdvertising();
advertising->setAppearance(HID_KEYBOARD);
advertising->addServiceUUID(hid->hidService()->getUUID());
advertising->addServiceUUID(hid->deviceInfo()->getUUID());
advertising->addServiceUUID(hid->batteryService()->getUUID());
advertising->addServiceUUID(pService->getUUID());
advertising->start();

Serial.println("BLE ready");
delay(portMAX_DELAY);
};

(Полный код - https://pastebin.com/6WNb0228)

Если вы не знаете, как решить мою проблему - я буду рад ссылкам на статьи и документации для изучения.

Спасибо!


Ответы (0 шт):