# ESP32 BLE
**Repository Path**: walkline/esp32-ble
## Basic Information
- **Project Name**: ESP32 BLE
- **Description**: MicroPython for ESP32 开发板低功耗蓝牙(BLE)研究学习项目
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 42
- **Forks**: 11
- **Created**: 2020-02-13
- **Last Updated**: 2025-07-03
## Categories & Tags
**Categories**: hardware
**Tags**: None
## README
ESP32 BLE

### 项目介绍
MicroPython for ESP32 开发板低功耗蓝牙(BLE)研究学习项目
### 名词解释
写的比较乱,所以需要规范以下名词解释
* BLE:低功耗蓝牙设备(Bluetooth Low Energy、Bluetooth LE)
* Peripheral、BLE 设备、外围设备、设备:代表 `ESP32 开发板`
* Central、中心设备:代表`手机、电脑等`可以连接蓝牙外设的设备
### 制定目标
使用 BLE 实现蓝牙键盘控制器功能,也就是自制蓝牙(小)键盘(HID)
要自制(小)蓝牙键盘,需要完成下列功能:
* 开发板实现 HID 功能,即作为外围设备,可以被中心设备扫描连接
* 制作(小)键盘硬件,编写键盘驱动,实现通过开发板向中心设备输入内容
* 硬件还包括灯光效果,用一个按键进行灯效切换:
* 全灭(默认)
* 全亮
* 全部呼吸闪烁
* ~~按键点击闪烁~~
* 设计字符映射表统一规范,方便对应按键和输入内容
### 进度情况
* [视频演示](https://www.bilibili.com/video/av91982504/)
* 已完成开发板作为外围设备的功能,可以被手机扫描连接并简单输入一些字母和数字
* 已完成(小)键盘硬件电路设计,等待合适时机打板制作,目前有 2 种方案
* 打了若干次板子但是验证功能均失败了,目前硬件已经更新到`v0.2.5`,准备打板继续验证
* 目前[`v0.2.6`](https://gitee.com/walkline/esp32-ble/tree/master/hardware/v026)按键部分硬件已经验证成功,终于可以继续后续开发了。。。
### 已知问题
* ~~BLE 设备在第一次绑定连接成功后,处于连接状态时,复位设备,或者关闭再打开`中心设备`的蓝牙功能后,设备会处于已连接状态,但是`中心设备`没有任何反应,既不会连接成功也不会连接失败,此处怀疑是因为缺少连接超时设置,但是当前版本的设备固件并不支持设置超时~~
* ~~在 Windows 10 系统上可以搜索到 BLE 设备并进行连接,但是很快会出现`驱动程序错误`的提示,暂时无解~~
* 导致以上已知问题的原因为,`MicroPython ubluetooth`**不支持**设备间的配对和绑定操作,这个问题只能等
* 自己尝试给固件增加配对功能,目前在`iOS`上测试成功了
### 分支项目
在等待打板的这段时间里又继续研究了 BLE 的其它玩法,总结一下:
* [MicroPython Beacon Library](https://gitee.com/walkline/micropython-beacon-library):这个库适用于实现包括谷歌的`Eddystone`和苹果的`iBeacon`在内的 2 种信标,还包括了不是很精确的信标测距功能
* [ESP32 BLE - Remote Controller](https://gitee.com/walkline/ESP32-BLE-Remote_Controller):这个项目用于制作蓝牙自拍按钮,可惜目前还不支持苹果的设备
* [ESP32 BLE - MI Temperature Humidity 2 Reader](https://gitee.com/walkline/ESP32-BLE-MI_Temperature_Humidity_2_Reader):这个就有点无聊了,用于读取`小米温湿度计2`的温湿度数据
* [MicroPython BLE Library](https://gitee.com/walkline/micropython-ble-library):根据之前研究学习到的 Micropython BLE 相关知识,将相关代码模块封装成为类库,方便以后使用
* [ESP32 BLE - 机械小键盘](https://gitee.com/walkline/ESP32-BLE-Mechanical_Keypad):重点项目,制作机械轴小键盘
* [ESP32 BLE - UART](https://gitee.com/walkline/esp32-ble-uart):使用`UART`与其它设备交换数据
### BLE 知识
> 非业内人士,以下内容纯属个人理解,如有偏差欢迎斧正
* BLE 设备遵循 HOGP 规范(HID over GATT Profile)
* `Profile`包扩很多`Services`
* `Services`包扩很多`Characteristics`
* `Characteristics`包扩很多`Descriptors`
例如蓝牙键盘就是一个`Profile`,它包括了至少(**必要的**)3 个`Services`:
* `Battery Service`
* `Device Information`
* `Human Interface Device`
`Battery Service`又包括了 1 个`Characteristics`:
* `Battery Level`
`Battery Level`还可以包括 1 个`Descriptors`:
* `Client Characteristic Configuration`
### 软件部分
首先参考`HOGP 规范`,配置好所有的`Services`、`Characteristics`和`Descriptors`
BLE 设备作为`外围设备(GATT Server)`,本地注册所有`Services`,生成`payload`,等待`中心设备(GATT Client)`连接
然后作为`广播者`将`payload`进行广播,包括:
* 本地名称(显示名称)
* 所有的`Services`
* 外观(显示名称旁边的图标)
`中心设备`扫描到广播后进行内容分析、展示,用户点击展示内容后开始和`外围设备`进行绑定连接,并读取保存在 BLE 设备本地的`Characteristics`和`Descriptors`信息,最终完成连接,等待接收数据
此过程中我们只负责`外围设备(GATT Server)`的开发
### 硬件部分(按键)
已完成电路设计的(小)键盘 2 种方案,分别是:
* ADC 采样方案
* 键盘矩阵方案
#### ADC 采样方案
ADC 采样方案使用的是同型号电阻串联的方式,如图:

优点:
* 占用 IO 口少,一个 IO 口至少可以采集 10 个按键输入(未验证)
* 电阻型号一致,方便管理购买
缺点:
* 电阻串联方案导致只有 1 个按键的优先级别最高,也就是同时只能检测到 1 个按键按下
这种方案能想到的用途有 2 个:
* 作为小键盘使用,因为小键盘不需要多个按键同时按下
* 使用 2 路 ADC,其中一路作为控制键(Ctrl、Alt、Shift等),配合另外一路进行简单输入
#### 键盘矩阵方案
键盘矩阵方案是常规键盘方案,连接方式如图:

优点:
* 可以做到全键无冲
* 电路简单,几乎只用到按键
缺点:
* 占用 IO 口较多,`row * column`个按键需要`row + column`个 IO,例如`4 * 5`的 20 键键盘需要 9 个 IO
### 硬件部分(灯效)
灯效也将使用矩阵方案(待验证)并使用按键切换 4 种不同灯效

### 相关链接
* [Walkline Hardware](https://gitee.com/walkline/walkline-wardware):今后所有的开源硬件的`生产文件`和`BOM 表`都会放在这个项目中,包括本项目用到的 3 种方案
* [ESP32 自定义固件下载](https://gitee.com/walkline/esp32_firmware)
### 参考资料
* [MicroPython 官方文档](http://docs.micropython.org/en/latest/library/ubluetooth.html)
* [MicroPython 项目示例](https://github.com/micropython/micropython/tree/master/examples/bluetooth)
* Bluetooth GATT
* [Services](https://www.bluetooth.com/specifications/gatt/services/)
* [Human Interface Device](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Services/org.bluetooth.service.human_interface_device.xml)
* [Battery Service](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Services/org.bluetooth.service.battery_service.xml)
* [Device Information](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Services/org.bluetooth.service.device_information.xml)
* [Characteristics](https://www.bluetooth.com/specifications/gatt/characteristics/)
* [Descriptors](https://www.bluetooth.com/specifications/gatt/descriptors/)
* [Generic Attributes](https://www.bluetooth.com/specifications/gatt/)
* [HID over GATT Profile.pdf](https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=245141):HOGP 规范
* [Appearance](https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.gap.appearance.xml):蓝牙设备外观对应表
* [USB HID Usage Table](http://www.freebsddiary.org/APC/usb_hid_usages):键盘按键键值对应表
* [HID Descriptor Tool](https://www.usb.org/document-library/hid-descriptor-tool):用于生成`Report Map Data`
### 好文推荐
* [广播包解析(作者:强光手电)](https://www.cnblogs.com/aikm/p/5022502.html)
* [扫描请求和扫描响应(作者:强光手电)](https://www.cnblogs.com/aikm/p/5144209.html)
### 合作交流
* 联系邮箱:
* QQ 交流群:
* 走线物联:163271910
* 扇贝物联:31324057

