walker2048 发表于 2024-7-26 17:06

全能小网关|CH32V208--8、小白初学蓝牙BLE(运行Demo和学习相关知识)

#### 前言
其实我也只是个菜鸡,不懂蓝牙开发和无线开发,现在手上有这个板子,就先学习一下吧。

我们先来学习一下蓝牙的一些常见名词。蓝牙技术中定义了几种不同的角色,每种角色都有其特定的功能和特性。以下是一些主要的蓝牙角色及其特性:

1. GAP (Generic Access Profile):
负责设备发现、连接建立、连接参数管理和安全。
定义了设备如何相互发现、配对和连接的基本规则。

1. GATT (Generic Attribute Profile):
定义了设备间数据交换的属性和协议。
用于构建服务和特征,实现数据的读取、写入和通知。

1. HID (Human Interface Device):
用于键盘、鼠标、游戏控制器等输入设备。
支持设备发现、连接和控制。

1. MESH (Bluetooth Mesh):
用于创建大规模的设备网络,适合智能家居和工业自动化。
支持网络扩展和设备管理。

除了这些,还有其他不少角色,我们没必要一下子就学习这么多,先来了解一下 GAP(Generic Access Profile)。

#### 蓝牙ble设备的发现和连接
GAP(Generic Access Profile)设备发现和连接过程是蓝牙技术中的基本组成部分,它允许设备之间相互发现并建立连接。以下是一般步骤:

1. **设备发现(Discovery)**:
   - **广播(Advertising)**:设备通过广播信号来宣布自己的存在。这些广播信号可以是有限发现服务的广播(Limited Discoverable Mode)或一般发现服务的广播(General Discoverable Mode)。
   - **扫描(Scanning)**:设备通过扫描来查找其他设备的广播信号。扫描可以是被动的(Passive Scanning),即仅监听广播信号;或主动的(Active Scanning),即发送扫描请求并监听响应。

2. **设备信息交换**:
   - 在发现过程中,设备会交换一些基本信息,如设备名称、类、服务等。这些信息通常通过广播数据包中的服务发现协议(SDP)记录来传递。

3. **设备配对(Pairing)**:
   - 一旦设备发现彼此,它们可以通过配对过程建立安全连接。配对过程可能涉及用户确认(如通过PIN码或通过设备上的提示进行确认)。
   - 配对可以是一次性的,也可以是持久的,后者会将配对信息存储在设备的存储中,以便未来自动连接。

4. **建立连接(Connection Establishment)**:
   - 配对成功后,设备会建立一个连接。这个连接可以是点对点(P2P)连接,也可以是广播连接。
   - 连接参数(如连接间隔、超时时间等)可以在连接建立时协商。

5. **服务发现(Service Discovery)**:
   - 连接建立后,设备可以通过服务发现协议(SDP)查询对方支持的服务。这允许设备了解对方提供的功能和能力。

6. **数据传输**:
   - 一旦服务发现完成,设备就可以开始数据传输。数据可以通过蓝牙低功耗(BLE)或其他蓝牙协议传输。

7. **连接维护和终止**:
   - 在连接期间,设备可以调整连接参数以优化性能和功耗。如果不再需要连接,设备可以主动终止连接。

这个过程可能会因蓝牙版本和具体实现而有所不同,但基本的发现和连接流程大致相同。在实际应用中,开发者需要根据具体需求和设备的能力来设计和实现这些步骤。

#### 实际案例代码
这个例子并不复杂,在SDK的EVT\EXAM\BLE\HeartRate路径可以找到,编译下载后,就可以使用Linux开发板或者手机的ble app助手之类的工具,发现设备和查看服务和属性了。
我们在Linux开发板上运行bluetoothctl来扫描设备并连接,在扫描前可能需要开启蓝牙设备电源,这里就不说明了。

#### 配对密码
由于配对连接时,需要输入配对密码,这时候我们可以把完整的代码发送给AI,让AI帮我们找到配对密码,这里我用的是Kimi。
发送给kimi.ai后,它分析出来对应的代码就是以下内容,那我们直接输入0,完成配对即可连接上设备。
在提供的代码中,配对密码是通过调用 `GAPBondMgr_SetParameter` 函数设置的。具体地,配对密码通过 `GAPBOND_PERI_DEFAULT_PASSCODE` 参数进行设置。在代码中,配对密码设置为 `0`,这是一个 32 位的值,表示的是一个简单的配对密钥(passkey),在这种情况下,它被设置为 `"000000"`。

以下是设置配对密码的相关代码片段:

```c
// Setup the GAP Bond Manager
{
    uint32_t passkey = 0; // passkey "000000"
    uint8_tpairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    uint8_tmitm = FALSE;
    uint8_tioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
    uint8_tbonding = TRUE;
    GAPBondMgr_SetParameter(GAPBOND_PERI_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
    GAPBondMgr_SetParameter(GAPBOND_PERI_PAIRING_MODE, sizeof(uint8_t), &pairMode);
    GAPBondMgr_SetParameter(GAPBOND_PERI_MITM_PROTECTION, sizeof(uint8_t), &mitm);
    GAPBondMgr_SetParameter(GAPBOND_PERI_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
    GAPBondMgr_SetParameter(GAPBOND_PERI_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}
```
#### 查看服务和属性
连接上设备后,我们可以先使用info mac地址命令来查看设备信息,如下图


然后可以使用menu gatt来查看服务和属性,然后我们可以通过list-attribution命令显示设备支持的所有属性。这包括服务的UUID和特征的UUID,以及它们的属性值和权限。选择某个属性后,可以对其进行读取(read)、写入(write)或开启通知(notify)操作。


对这个心跳案例来说,大部分的属性都是只读的,这也符合心跳设备的特性,上报心跳信息给app,由于我对蓝牙ble开发并不是很熟悉,只能一边运行demo,一边跟着AI学习一遍。
页: [1]
查看完整版本: 全能小网关|CH32V208--8、小白初学蓝牙BLE(运行Demo和学习相关知识)