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)
Если вы не знаете, как решить мою проблему - я буду рад ссылкам на статьи и документации для изучения.
Спасибо!
