You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为GATT Sensor Data App示例应用添加双击检测并配置DFU以广播/System/State数据

解决Movesense GATT固件添加System/States资源(用于双击检测)的步骤

作为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:52:38