static T_APP_RESULT gatt_write_recv(uint8_t conn_id, T_SERVER_ID svc_id, uint16_t attrib_index, T_WRITE_TYPE write_type, uint16_t length, uint8_t *p_value, P_FUN_WRITE_IND_POST_PROC *p_write_post_proc) { for (int i = 0; i < g_svc_cnt; i++) { if (g_svc_tbl[i].svc_handle == svc_id) { for (int j = 0; j < g_svc_tbl[i].n_char; j++) { if (g_svc_tbl[i].chars[i].char_handle == attrib_index) { uint16_t att_handle = (g_svc_tbl[i].svc_handle << 8) | g_svc_tbl[i].chars[i].char_handle; struct aciga_ble_gatt_access_ctxt ctx = { .op = ACIGA_BLE_GATT_ACCESS_OP_WRITE_CHR, .data = p_value, .len = length, }; g_svc_tbl[i].chars[i].cb(conn_id, att_handle, &ctx); return APP_RESULT_SUCCESS; } } } } return APP_RESULT_SUCCESS; }
时间: 2024-02-14 20:36:02 浏览: 97
gatt_server.zip_Gatt server_between_gatt server_gatt服务_蓝牙gatt
这是一个用于处理 GATT 协议中写操作的回调函数。该函数的参数包括连接 ID,服务 ID,属性索引,写类型,数据长度和数据指针等信息,它首先会根据服务 ID 和属性索引查找对应的特征值,然后将数据传递给该特征值的回调函数进行处理。具体实现过程如下:
1. 使用 for 循环遍历所有已注册的服务,查找与服务 ID 匹配的服务;
2. 如果找到了相应的服务,则使用 for 循环遍历该服务中的所有特征值,查找与属性索引匹配的特征值;
3. 如果找到了相应的特征值,则将数据封装为一个 GATT 访问上下文结构体,其中包括操作类型、数据指针和数据长度等信息;
4. 调用该特征值的回调函数,并将连接 ID、属性句柄和 GATT 访问上下文结构体作为参数传递给回调函数;
5. 如果成功处理了写请求,则返回 APP_RESULT_SUCCESS;否则返回一个错误码。
需要注意的是,该函数的具体实现可能依赖于具体的应用场景和实现技术,需要根据实际情况进行实现和调试。
阅读全文