IDF环境下ESP32蓝牙模拟鼠标点击、键盘输入操作

前面几节,都是通过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起航,打完收工!

          发表评论

          此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据