Skip to content

Commit c52491d

Browse files
committed
Initial commit
0 parents  commit c52491d

14 files changed

+1003
-0
lines changed

BleCombo.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#include "BleCombo.h"
2+
3+
BleComboKeyboard Keyboard;
4+
BleComboMouse Mouse(&Keyboard);

BleCombo.h

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef ESP32_BLE_COMBO_H
2+
#define ESP32_BLE_COMBO_H
3+
#include "BleComboKeyboard.h"
4+
#include "BleComboMouse.h"
5+
6+
extern BleComboMouse Mouse;
7+
extern BleComboKeyboard Keyboard;
8+
9+
#endif

BleComboKeyboard.cpp

+583
Large diffs are not rendered by default.

BleComboKeyboard.h

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#ifndef ESP32_BLE_COMBO_KEYBOARD_H
2+
#define ESP32_BLE_COMBO_KEYBOARD_H
3+
#include "sdkconfig.h"
4+
#if defined(CONFIG_BT_ENABLED)
5+
6+
#include "BleConnectionStatus.h"
7+
#include "BLEHIDDevice.h"
8+
#include "BLECharacteristic.h"
9+
#include "Print.h"
10+
11+
12+
const uint8_t KEY_LEFT_CTRL = 0x80;
13+
const uint8_t KEY_LEFT_SHIFT = 0x81;
14+
const uint8_t KEY_LEFT_ALT = 0x82;
15+
const uint8_t KEY_LEFT_GUI = 0x83;
16+
const uint8_t KEY_RIGHT_CTRL = 0x84;
17+
const uint8_t KEY_RIGHT_SHIFT = 0x85;
18+
const uint8_t KEY_RIGHT_ALT = 0x86;
19+
const uint8_t KEY_RIGHT_GUI = 0x87;
20+
21+
const uint8_t KEY_UP_ARROW = 0xDA;
22+
const uint8_t KEY_DOWN_ARROW = 0xD9;
23+
const uint8_t KEY_LEFT_ARROW = 0xD8;
24+
const uint8_t KEY_RIGHT_ARROW = 0xD7;
25+
const uint8_t KEY_BACKSPACE = 0xB2;
26+
const uint8_t KEY_TAB = 0xB3;
27+
const uint8_t KEY_RETURN = 0xB0;
28+
const uint8_t KEY_ESC = 0xB1;
29+
const uint8_t KEY_INSERT = 0xD1;
30+
const uint8_t KEY_DELETE = 0xD4;
31+
const uint8_t KEY_PAGE_UP = 0xD3;
32+
const uint8_t KEY_PAGE_DOWN = 0xD6;
33+
const uint8_t KEY_HOME = 0xD2;
34+
const uint8_t KEY_HOME1 = 0x0004;
35+
const uint8_t KEY_END = 0xD5;
36+
const uint8_t KEY_CAPS_LOCK = 0xC1;
37+
const uint8_t KEY_F1 = 0xC2;
38+
const uint8_t KEY_F2 = 0xC3;
39+
const uint8_t KEY_F3 = 0xC4;
40+
const uint8_t KEY_F4 = 0xC5;
41+
const uint8_t KEY_F5 = 0xC6;
42+
const uint8_t KEY_F6 = 0xC7;
43+
const uint8_t KEY_F7 = 0xC8;
44+
const uint8_t KEY_F8 = 0xC9;
45+
const uint8_t KEY_F9 = 0xCA;
46+
const uint8_t KEY_F10 = 0xCB;
47+
const uint8_t KEY_F11 = 0xCC;
48+
const uint8_t KEY_F12 = 0xCD;
49+
const uint8_t KEY_F13 = 0xF0;
50+
const uint8_t KEY_F14 = 0xF1;
51+
const uint8_t KEY_F15 = 0xF2;
52+
const uint8_t KEY_F16 = 0xF3;
53+
const uint8_t KEY_F17 = 0xF4;
54+
const uint8_t KEY_F18 = 0xF5;
55+
const uint8_t KEY_F19 = 0xF6;
56+
const uint8_t KEY_F20 = 0xF7;
57+
const uint8_t KEY_F21 = 0xF8;
58+
const uint8_t KEY_F22 = 0xF9;
59+
const uint8_t KEY_F23 = 0xFA;
60+
const uint8_t KEY_F24 = 0xFB;
61+
62+
typedef uint8_t MediaKeyReport[2];
63+
64+
const MediaKeyReport KEY_MEDIA_NEXT_TRACK = {1, 0};
65+
const MediaKeyReport KEY_MEDIA_PREVIOUS_TRACK = {2, 0};
66+
const MediaKeyReport KEY_MEDIA_STOP = {4, 0};
67+
const MediaKeyReport KEY_MEDIA_PLAY_PAUSE = {8, 0};
68+
const MediaKeyReport KEY_MEDIA_MUTE = {16, 0};
69+
const MediaKeyReport KEY_MEDIA_VOLUME_UP = {32, 0};
70+
const MediaKeyReport KEY_MEDIA_VOLUME_DOWN = {64, 0};
71+
const MediaKeyReport KEY_MEDIA_WWW_HOME = {128, 0};
72+
const MediaKeyReport KEY_MEDIA_LOCAL_MACHINE_BROWSER = {0, 1}; // Opens "My Computer" on Windows
73+
const MediaKeyReport KEY_MEDIA_CALCULATOR = {0, 2};
74+
const MediaKeyReport KEY_MEDIA_WWW_BOOKMARKS = {0, 4};
75+
const MediaKeyReport KEY_MEDIA_WWW_SEARCH = {0, 8};
76+
const MediaKeyReport KEY_MEDIA_WWW_STOP = {0, 16};
77+
const MediaKeyReport KEY_MEDIA_WWW_BACK = {0, 32};
78+
const MediaKeyReport KEY_MEDIA_CONSUMER_CONTROL_CONFIGURATION = {0, 64}; // Media Selection
79+
const MediaKeyReport KEY_MEDIA_EMAIL_READER = {0, 128};
80+
81+
82+
// Low level key report: up to 6 keys and shift, ctrl etc at once
83+
typedef struct
84+
{
85+
uint8_t modifiers;
86+
uint8_t reserved;
87+
uint8_t keys[6];
88+
} KeyReport;
89+
extern BLECharacteristicCallbacks* globalCallbacks;
90+
class BleComboKeyboard : public Print
91+
{
92+
private:
93+
BleConnectionStatus* connectionStatus;
94+
BLEHIDDevice* hid;
95+
BLECharacteristic* inputKeyboard;
96+
BLECharacteristic* outputKeyboard;
97+
BLECharacteristic* inputMediaKeys;
98+
99+
KeyReport _keyReport;
100+
MediaKeyReport _mediaKeyReport;
101+
static void taskServer(void* pvParameter);
102+
103+
public:
104+
BleComboKeyboard(std::string deviceName = "coco-ble-hid", std::string deviceManufacturer = "Espressif", uint8_t batteryLevel = 100);
105+
void begin(void);
106+
void end(void);
107+
void sendReport(KeyReport* keys);
108+
void sendReport(MediaKeyReport* keys);
109+
size_t press(uint8_t k);
110+
size_t press(const MediaKeyReport k);
111+
size_t release(uint8_t k);
112+
size_t release(const MediaKeyReport k);
113+
size_t write(uint8_t c);
114+
size_t write(const MediaKeyReport c);
115+
size_t write(const uint8_t *buffer, size_t size);
116+
void setCallbacks(BLECharacteristicCallbacks *callbacks);
117+
118+
void releaseAll(void);
119+
bool isConnected(void);
120+
void setBatteryLevel(uint8_t level);
121+
uint8_t batteryLevel;
122+
std::string deviceManufacturer;
123+
std::string deviceName;
124+
125+
BLECharacteristic* inputMouse;
126+
127+
};
128+
129+
#endif // CONFIG_BT_ENABLED
130+
#endif // ESP32_BLE_COMBO_KEYBOARD_H

BleComboMouse.cpp

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "BleComboMouse.h"
2+
3+
4+
#define LSB(v) ((v >> 8) & 0xff)
5+
#define MSB(v) (v & 0xff)
6+
void BleComboMouse::click(uint8_t b)
7+
{
8+
_buttons = b;
9+
move(0,0,0,0);
10+
_buttons = 0;
11+
move(0,0,0,0);
12+
}
13+
14+
void BleComboMouse::move(signed char x, signed char y, signed char wheel, signed char hWheel)
15+
{
16+
if (_keyboard->isConnected())
17+
{
18+
uint8_t m[5];
19+
m[0] = _buttons;
20+
m[1] = x;
21+
m[2] = y;
22+
m[3] = wheel;
23+
m[4] = hWheel;
24+
_keyboard->inputMouse->setValue(m, 5);
25+
_keyboard->inputMouse->notify();
26+
}
27+
}
28+
29+
void BleComboMouse::send(int state, int16_t x, int16_t y)
30+
{
31+
if (_keyboard->isConnected())
32+
{
33+
uint8_t m[5];
34+
m[0] = state;
35+
m[1] = MSB(x);
36+
m[2] = LSB(x);
37+
m[3] = MSB(y);
38+
m[4] = LSB(y);
39+
_keyboard->inputMouse->setValue(m, 5);
40+
_keyboard->inputMouse->notify();
41+
}
42+
}
43+
44+
45+
void BleComboMouse::buttons(uint8_t b)
46+
{
47+
if (b != _buttons)
48+
{
49+
_buttons = b;
50+
move(0,0,0,0);
51+
}
52+
}
53+
54+
void BleComboMouse::press(uint8_t b)
55+
{
56+
buttons(_buttons | b);
57+
}
58+
59+
void BleComboMouse::release(uint8_t b)
60+
{
61+
buttons(_buttons & ~b);
62+
}
63+
64+
bool BleComboMouse::isPressed(uint8_t b)
65+
{
66+
if ((b & _buttons) > 0)
67+
return true;
68+
return false;
69+
}

BleComboMouse.h

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef ESP32_BLE_COMBO_MOUSE_H
2+
#define ESP32_BLE_COMBO_MOUSE_H
3+
#include "BleComboKeyboard.h"
4+
5+
#define MOUSE_LEFT 1
6+
#define MOUSE_RIGHT 2
7+
#define MOUSE_MIDDLE 4
8+
#define MOUSE_BACK 8
9+
#define MOUSE_FORWARD 16
10+
#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE) # For compatibility with the Mouse library
11+
12+
class BleComboMouse {
13+
private:
14+
BleComboKeyboard* _keyboard;
15+
uint8_t _buttons;
16+
void buttons(uint8_t b);
17+
public:
18+
BleComboMouse(BleComboKeyboard* keyboard) { _keyboard = keyboard; };
19+
void begin(void) {};
20+
void end(void) {};
21+
void click(uint8_t b = MOUSE_LEFT);
22+
void move(signed char x, signed char y, signed char wheel = 0, signed char hWheel = 0);
23+
void send(int state, int16_t x, int16_t y);
24+
void press(uint8_t b = MOUSE_LEFT); // press LEFT by default
25+
void release(uint8_t b = MOUSE_LEFT); // release LEFT by default
26+
bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default
27+
};
28+
29+
#endif // ESP32_BLE_COMBO_MOUSE_H

BleConnectionStatus.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "BleConnectionStatus.h"
2+
3+
BleConnectionStatus::BleConnectionStatus(void) {
4+
}
5+
6+
void BleConnectionStatus::onConnect(BLEServer* pServer)
7+
{
8+
this->connected = true;
9+
BLE2902* desc = (BLE2902*)this->inputKeyboard->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
10+
desc->setNotifications(true);
11+
desc = (BLE2902*)this->inputMouse->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
12+
desc->setNotifications(true);
13+
}
14+
15+
void BleConnectionStatus::onDisconnect(BLEServer* pServer)
16+
{
17+
this->connected = false;
18+
BLE2902* desc = (BLE2902*)this->inputKeyboard->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
19+
desc->setNotifications(false);
20+
desc = (BLE2902*)this->inputMouse->getDescriptorByUUID(BLEUUID((uint16_t)0x2902));
21+
desc->setNotifications(false);
22+
}

BleConnectionStatus.h

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#ifndef ESP32_BLE_CONNECTION_STATUS_H
2+
#define ESP32_BLE_CONNECTION_STATUS_H
3+
#include "sdkconfig.h"
4+
#if defined(CONFIG_BT_ENABLED)
5+
6+
#include <BLEServer.h>
7+
#include "BLE2902.h"
8+
#include "BLECharacteristic.h"
9+
10+
class BleConnectionStatus : public BLEServerCallbacks
11+
{
12+
public:
13+
BleConnectionStatus(void);
14+
bool connected = false;
15+
void onConnect(BLEServer* pServer);
16+
void onDisconnect(BLEServer* pServer);
17+
BLECharacteristic* inputKeyboard;
18+
BLECharacteristic* outputKeyboard;
19+
BLECharacteristic* inputMouse;
20+
};
21+
22+
#endif // CONFIG_BT_ENABLED
23+
#endif // ESP32_BLE_CONNECTION_STATUS_H

KeyboardOutputCallbacks.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "KeyboardOutputCallbacks.h"
2+
3+
#if defined(CONFIG_ARDUHAL_ESP_LOG)
4+
#include "esp32-hal-log.h"
5+
#define LOG_TAG ""
6+
#else
7+
#include "esp_log.h"
8+
static const char* LOG_TAG = "BLEDevice";
9+
#endif
10+
11+
KeyboardOutputCallbacks::KeyboardOutputCallbacks(void) {
12+
}
13+
14+
void KeyboardOutputCallbacks::onWrite(BLECharacteristic* me) {
15+
uint8_t* value = (uint8_t*)(me->getValue().c_str());
16+
ESP_LOGI(LOG_TAG, "special keys: %d", *value);
17+
}
18+

KeyboardOutputCallbacks.h

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef ESP32_BLE_KEYBOARD_OUTPUT_CALLBACKS_H
2+
#define ESP32_BLE_KEYBOARD_OUTPUT_CALLBACKS_H
3+
#include "sdkconfig.h"
4+
#if defined(CONFIG_BT_ENABLED)
5+
6+
#include <BLEServer.h>
7+
#include "BLE2902.h"
8+
#include "BLECharacteristic.h"
9+
10+
class KeyboardOutputCallbacks : public BLECharacteristicCallbacks
11+
{
12+
public:
13+
KeyboardOutputCallbacks(void);
14+
void onWrite(BLECharacteristic* me);
15+
};
16+
17+
#endif // CONFIG_BT_ENABLED
18+
#endif // ESP32_BLE_KEYBOARD_OUTPUT_CALLBACKS_H

README.md

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# ESP32 BLE HID Keyboard, Abs Mouse, and Two-Way Communication Library
2+
This library enables ESP32 development boards to function as Bluetooth HID devices, supporting features such as keyboard input, absolute mouse control, and two-way communication.
3+
4+
## Installation
5+
- In the Arduino IDE go to "Sketch" -> "Include Library" -> "Add .ZIP Library..." and select the file you just downloaded.
6+
- You can now go to "File" -> "Examples" -> "ESP32 BLE HID" and select any of the examples to get started.
7+
## Contact Me
8+
- QQ Group: 710985269
9+
10+
## Example
11+
```
12+
#include <BleCombo.h>
13+
BleComboKeyboard keyboard("cheese-ble-hid", "Espressif", 100);
14+
BleComboMouse mouse(&keyboard);
15+
class MyCallbacks: public BLECharacteristicCallbacks {
16+
void onRead(BLECharacteristic* pCharacteristic) { }
17+
void onWrite(BLECharacteristic *pCharacteristic) { }
18+
};
19+
void setup() {
20+
Serial.begin(115200);
21+
Serial.println("Starting work!");
22+
MyCallbacks myCallbacks;
23+
keyboard.setCallbacks(&myCallbacks);
24+
keyboard.begin();
25+
mouse.begin();
26+
}
27+
void loop() {
28+
if(Keyboard.isConnected()) {
29+
mouse.click();
30+
}
31+
delay(2000);
32+
}
33+
```
34+
- 本库仅供学习使用,请勿用于非法用途,否则后果自负。
35+
- 用户明确理解并同意,任何违反法律法规、侵犯他人合法权益的行为,均与本项目及其开发者无关,后果由用户自行承担。
36+
37+
## Credits
38+
This project is heavily based on their work:
39+
- [ESP32-BLE-Mouse](https://github.com/T-vK/ESP32-BLE-Mouse)
40+
- [ESP32-BLE-Keyboard](https://github.com/T-vK/ESP32-BLE-Keyboard)
41+
- [ESP32-BLE-Abs-Mouse](https://github.com/sobrinho/ESP32-BLE-Abs-Mouse)
42+
- [ESP32-BLE-Combo](https://github.com/blackketter/ESP32-BLE-Combo)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <BleCombo.h>
2+
BleComboKeyboard keyboard("cheese-ble-hid", "Espressif", 100);
3+
BleComboMouse mouse(&keyboard);
4+
class MyCallbacks: public BLECharacteristicCallbacks {
5+
void onRead(BLECharacteristic* pCharacteristic) { }
6+
void onWrite(BLECharacteristic *pCharacteristic) { }
7+
};
8+
void setup() {
9+
Serial.begin(115200);
10+
Serial.println("Starting work!");
11+
MyCallbacks myCallbacks;
12+
keyboard.setCallbacks(&myCallbacks);
13+
keyboard.begin();
14+
mouse.begin();
15+
}
16+
void loop() {
17+
if(Keyboard.isConnected()) {
18+
mouse.click();
19+
}
20+
delay(2000);
21+
}

0 commit comments

Comments
 (0)