如何为GATT Sensor Data App示例应用添加双击检测并配置DFU以广播/System/State数据
作为Android开发者,不用太担心底层细节,跟着下面的步骤一步步来就行:
1. 完成头文件引入后的核心修改(GATTSensorDataClient.cpp)
你已经添加了#include "system_states/resources.h",接下来需要在这个文件里做以下修改:
a. 定义System/States的资源路径
在文件顶部的常量定义区域添加:
static const char* SYSTEM_STATES_RESOURCE = "/System/States";
b. 注册资源到GATT服务
找到GATTSensorDataClient::Init函数,在现有的传感器资源注册代码(比如IMU、心率、温度相关的)后面,添加注册System/States资源的代码:
// 注册System/States资源到GATT客户端,监听状态通知 mResourceClient.AddResourceObserver(SYSTEM_STATES_RESOURCE, *this); // 可选:主动读取初始系统状态 asyncRead(SYSTEM_STATES_RESOURCE);
c. 处理System/States的通知回调
找到GATTSensorDataClient::OnResourceNotification函数,在现有的数据处理分支(比如IMU、心率的逻辑)后面,添加处理System/States数据的逻辑:
else if (resource == SYSTEM_STATES_RESOURCE) { SystemStates::States state; if (protoParser.unpack(state, data) == ParseResult::SUCCESS) { // 调试用:打印双击状态(1表示触发了双击) DEBUGLOG("DoubleTap detected: %d", state.doubleTap); // 将状态打包成Protobuf格式,通过GATT发送到Android设备 uint8_t buffer[64]; size_t dataSize = protoParser.pack(state, buffer, sizeof(buffer)); if (dataSize > 0) { // 发送到预先定义的System/States GATT特征 mGattServer.SendNotification(mConnHandle, SYSTEM_STATES_CHAR_UUID, buffer, dataSize); } } }
2. 添加GATT特征UUID定义(GATTSensorDataClient.h)
打开头文件,在现有的特征UUID常量(比如IMU_CHAR_UUID、HR_CHAR_UUID)旁边,添加System/States对应的UUID:
// 自定义一个专属UUID,也可以用Movesense推荐的格式 static const bleUuid_t SYSTEM_STATES_CHAR_UUID = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}};
如果mGattServer、mConnHandle是私有成员,确保代码能正常访问它们(可以添加getter方法,或者调整成员访问权限)。
3. 在GATT服务中添加System/States特征
找到GATTSensorDataClient::CreateGattDatabase函数(如果没有,就在初始化GATT服务的代码块里),在现有特征的添加逻辑后面,加入System/States特征:
// 定义客户端特征配置描述符(用于订阅通知) ble_gatt_desc_def_t clientCharConfigDescriptor = { .uuid = BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG, .max_length = 2, .security_permissions = { .read_perm = ENC_NO_MITM, .write_perm = ENC_NO_MITM }, .flags = BLE_GATT_DESCR_FLAG_READ | BLE_GATT_DESCR_FLAG_WRITE }; // 添加System/States特征 ble_gatt_char_def_t systemStatesChar = { .uuid = SYSTEM_STATES_CHAR_UUID, .properties = BLE_GATT_CHAR_PROP_NOTIFY, .security_permissions = { .read_perm = ENC_NO_MITM, .write_perm = ENC_NO_MITM }, .descriptor_count = 1, .descriptors = &clientCharConfigDescriptor }; mGattServer.AddCharacteristic(systemStatesChar);
4. 确保System/States模块在固件中启用
检查项目的CMakeLists.txt配置文件,确认已经链接了System States模块:
target_link_libraries(${PROJECT_NAME} PRIVATE system_states)
如果使用movesense.cfg配置文件,确保模块列表里包含:
modules: - system_states
5. 重新编译生成DFU包
完成以上修改后,按照Movesense固件编译流程重新构建项目:
- 进入
gatt_sensordata_app项目目录 - 执行构建命令(可以用CMake+Make,或者直接用Movesense Studio的构建功能)
- 构建完成后,在
build目录下会生成新的DFU升级包(通常是.zip格式)
6. Android端补充说明
固件修改完成后,Android端需要订阅你定义的SYSTEM_STATES_CHAR_UUID特征,解析收到的Protobuf数据,通过判断doubleTap字段的值(1表示触发双击)来实现双击检测逻辑。
内容的提问来源于stack exchange,提问作者Mariah Sabioni

