前面几节,都是通过ESP32进行各种点灯,没太大意思。本文在乐鑫ESP32的SDK提供的蓝牙示例基础上,做了修改,实现了ESP32模拟蓝牙鼠标+键盘的功能。实现了鼠标移动、鼠标点击、键盘输入等操作。
先看下官方的示例,打开SDK文件夹,examples下面的bluetooth文件夹,有几个示例:
打开esp_hid_device工程,编译下载后,使用电脑蓝牙搜索,可以看到一个HID设备(我这里已经连接过了)。
在这个示例工程中,ESP32的蓝牙模拟了鼠标、键盘、PC音量调节的功能。通过电脑连接这个HID设备后,你能看到你电脑的音量一直在变~~~~~~~
相关部分的代码在这里:
整个工程基于freertos系统运行,这里创建了一个任务:hid_demo_task,在这个任务中通过下面函数控制PC端的音量:
esp_hidd_send_consumer_value(hid_conn_id, HID_CONSUMER_VOLUME_UP, true);
从大到小,从小到大,好烦!!!没事的话,尽量不要下载这个程序。咱们改一下,把音量调节的功能去掉,把鼠标键盘的功能加上。步骤如下:
一、删除相关代码
操作音量相关的代码删掉,用不到。保留:if(sec_conn)架构,确保一切操作都是在蓝牙连接的前提下进行。
二、查找操作鼠标、键盘的源码
鼠标右键点击esp_hidd_send_consumer_value函数,查找其定义。定位到esp_hidd_prf_api.c文件中,在这里,我们可以看到操作鼠标和键盘的函数接口:
主要是这两个函数:
void esp_hidd_send_keyboard_value(uint16_t conn_id, key_mask_t special_key_mask, uint8_t *keyboard_cmd, uint8_t num_key);
void esp_hidd_send_mouse_value(uint16_t conn_id, uint8_t mouse_button, int8_t mickeys_x, int8_t mickeys_y);
因为我之前学习过STM32的USB鼠标、USB键盘的代码,所以看这些很容易就看懂了。
三、重写控制演示代码
我这里的ESP32开发板很小,没有足够多的外设模拟鼠标或者键盘的操作。所以通过向串口发送不同的字符,来实现不同的操作,定义如下:
- 发送字符:a,鼠标移动
- 发送字符:b,鼠标左键点击
- 发送字符:c,鼠标右键点击
- 发送字符:d,模拟键盘操作,输入“abc”
具体代码如下:
void hid_demo_task(void *pvParameters)
{
uint8_t dat_buf[20];
uint8_t key_vaule[6] = {4,5,6,0,0,0};
vTaskDelay(1000 / portTICK_PERIOD_MS);
while(1)
{
ESP_LOGI(HID_DEMO_TAG, "Input the cmd!");
vTaskDelay(2000 / portTICK_PERIOD_MS);
if (sec_conn)
{
if (scanf("%s", dat_buf) == 1)
{
if (dat_buf[0] == 'a')
{
ESP_LOGI(HID_DEMO_TAG, "Move the mouse!");
esp_hidd_send_mouse_value(hid_conn_id, 0, 20, 20);
}
else if(dat_buf[0] == 'b')
{
ESP_LOGI(HID_DEMO_TAG, "Click the left key of the mouse!");
esp_hidd_send_mouse_value(hid_conn_id, 1, 0, 0);
vTaskDelay(10 / portTICK_PERIOD_MS);
esp_hidd_send_mouse_value(hid_conn_id, 0, 0, 0);
}
else if(dat_buf[0] == 'c')
{
ESP_LOGI(HID_DEMO_TAG, "Click the right key of the mouse!");
esp_hidd_send_mouse_value(hid_conn_id, 2, 0, 0);
vTaskDelay(10 / portTICK_PERIOD_MS);
esp_hidd_send_mouse_value(hid_conn_id, 0, 0, 0);
}
else if(dat_buf[0] == 'd')
{
ESP_LOGI(HID_DEMO_TAG, "Input the keyboard!");
esp_hidd_send_keyboard_value(hid_conn_id, 0, key_vaule, 3);
vTaskDelay(10 / portTICK_PERIOD_MS);
esp_hidd_send_keyboard_value(hid_conn_id, 0, &key_vaule[3], 3);
}
else
{
printf("Invalid input.\n");
}
}
else
{
printf("Invalid input.\n");
}
}
}
}
四、编译、烧录验证
烧录成功后,先确保电脑已经连接到该蓝牙设备,使用VSCODE自带的串行监视器,依次输入字符:a、b、c、d。可以看到蓝牙设备按照程序设定的功能执行:
至此,完成ESP32蓝牙模拟鼠标、键盘操作,我是单片机爱好者-MCU起航,打完收工!