gatt_handshake_state_t,gatt_upper_trans_msg_type_t,gatt_handshake_code_t这三个枚举类型各自有什么用
时间: 2023-09-09 08:11:50 浏览: 86
这三个枚举类型都是在蓝牙协议栈中使用的。
- gatt_handshake_state_t:表示GATT握手协议的状态,包括四种状态:GATT_HANDSHAKE_NONE、GATT_HANDSHAKE_WAIT_FOR_RSP、GATT_HANDSHAKE_WAIT_FOR_CONFIRM、GATT_HANDSHAKE_COMPLETE;
- gatt_upper_trans_msg_type_t:表示GATT上层传输类型,包括三种类型:GATT_UPPER_MSG_TYPE_REQ、GATT_UPPER_MSG_TYPE_RSP、GATT_UPPER_MSG_TYPE_IND;
- gatt_handshake_code_t:表示GATT握手协议的状态码,包括五种状态码:GATT_HANDSHAKE_SUCCESS、GATT_HANDSHAKE_FAIL、GATT_HANDSHAKE_CANCEL、GATT_HANDSHAKE_TIMEOUT、GATT_HANDSHAKE_BUSY。
这些枚举类型的定义是为了在代码中方便地使用这些状态、类型和状态码,可以避免使用数字或字符串表示,提高代码的可读性和可维护性。
相关问题
int aciga_gatt_tls_connect(int conn_id, const gatt_tls_ctx_t *ctx) { int rc = -1; aciga_gatt_tls_channel_t *channel = NULL; if (!ctx || !ctx->send_cb || !ctx->recv_cb) { BT_ERR("invalid parameter"); goto exit; } for (int i = 0; i < CONFIG_MAX_CONNECTION_COUNT; i++) { if (!gatt_tls_channel[i].used) { channel = gatt_tls_channel + i; break;//搜寻可用的通道 } } if (!channel) { BT_ERR("can not find avaliable channel"); goto exit; } memcpy(&channel->ctx, ctx, sizeof(*ctx)); rc = lower_trans_open(conn_id, ctx->mtu, ctx->send_cb); if (rc) { goto exit; } channel->conn_id = conn_id; channel->used = true; channel->state = HANDSHAKE_STATE_INIT; exit: return rc; }
这是一个函数 `aciga_gatt_tls_connect` 的代码实现,该函数用于建立 GATT TLS 连接。函数的输入参数为 `conn_id` 和 `ctx`,其中 `conn_id` 表示连接 ID,`ctx` 是一个指向 GATT TLS 上下文的指针。函数的返回值是一个整数,表示函数执行的结果。
函数实现的过程如下:
1. 初始化变量 `rc` 和 `channel`,将变量 `rc` 的值设为 -1,将变量 `channel` 的值设为 NULL。
2. 检查输入参数 `ctx` 和 `ctx->send_cb` 和 `ctx->recv_cb` 是否为空,如果为空则打印错误信息并跳转到函数的结束位置(`exit` 标签)。
3. 遍历 GATT TLS 通道的数组 `gatt_tls_channel`,查找未被使用的通道,将其赋值给变量 `channel`。
4. 如果没有找到可用的通道,则打印错误信息并跳转到函数的结束位置(`exit` 标签)。
5. 将 GATT TLS 上下文 `ctx` 的值复制到通道变量 `channel->ctx` 中。
6. 调用 `lower_trans_open` 函数打开一个下层传输通道,传递参数 `conn_id`、`ctx->mtu` 和 `ctx->send_cb`,将函数的返回值赋值给变量 `rc`。
7. 如果 `lower_trans_open` 函数的返回值不为 0,则跳转到函数的结束位置(`exit` 标签)。
8. 将连接 ID `conn_id`、标记使用状态为 true、标记状态为初始化状态的值分别赋值给通道变量 `channel->conn_id`、`channel->used` 和 `channel->state`。
9. 返回变量 `rc`。
对以下代码进行注释并给出可复制代码static void ble_tp_notify_task(void *pvParameters) { int err = -1; char data[244] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; while(1) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), data, (tx_mtu_size - 3)); BT_WARN("ble tp send notify : %d", err); } } static void ble_tp_not_ccc_changed(const struct bt_gatt_attr attr, u16_t value) { int err; BT_WARN("ccc:value=[%d]",value); if(tp_start) { if(value == BT_GATT_CCC_NOTIFY) { if(xTaskCreate(ble_tp_notify_task, (char)"bletp", 256, NULL, TP_PRIO, &ble_tp_task_h) == pdPASS) { created_tp_task = 1; BT_WARN("Create throughput tx task success."); } else { created_tp_task = 0; BT_WARN("Create throughput tx task fail."); } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } if(value == BT_GATT_CCC_NOTIFY) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), "notify", strlen("notify")); BT_WARN("ble tp send indatcate: %d", err); } } } static struct bt_gatt_attr attrs[]= { BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_BLE_TP), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_RD, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_tp_recv_rd, NULL, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_WR, BT_GATT_CHRC_WRITE |BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE|BT_GATT_PERM_PREPARE_WRITE, NULL, ble_tp_recv_wr, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_IND, BT_GATT_CHRC_INDICATE, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_ind_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_NOT, BT_GATT_CHRC_NOTIFY, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_not_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE) };
// 以下代码为BLE传输协议任务和相关函数的实现
// BLE传输协议任务函数,负责向BLE设备发送数据通知
static void ble_tp_notify_task(void *pvParameters) {
int err = -1; // 错误码
char data[244] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; // 待发送的数据
while(1) {
err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), data, (tx_mtu_size - 3)); // 发送数据通知
BT_WARN("ble tp send notify : %d", err); // 打印调试信息
}
}
// BLE传输协议通知CCC改变回调函数
static void ble_tp_not_ccc_changed(const struct bt_gatt_attr attr, u16_t value) {
int err; // 错误码
BT_WARN("ccc:value=[%d]",value); // 打印调试信息
if(tp_start) { // 如果传输已经开始
if(value == BT_GATT_CCC_NOTIFY) { // 如果CCC值为通知
if(xTaskCreate(ble_tp_notify_task, (char)"bletp", 256, NULL, TP_PRIO, &ble_tp_task_h) == pdPASS) { // 创建数据通知任务
created_tp_task = 1; // 标记任务已经创建
BT_WARN("Create throughput tx task success."); // 打印调试信息
} else {
created_tp_task = 0; // 标记任务未创建
BT_WARN("Create throughput tx task fail."); // 打印调试信息
}
} else { // 如果CCC值为非通知
if(created_tp_task) { // 如果任务已经创建
BT_WARN("Delete throughput tx task."); // 打印调试信息
vTaskDelete(ble_tp_task_h); // 删除数据通知任务
created_tp_task = 0; // 标记任务未创建
}
}
} else { // 如果传输未开始
if(created_tp_task) { // 如果任务已经创建
BT_WARN("Delete throughput tx task."); // 打印调试信息
vTaskDelete(ble_tp_task_h); // 删除数据通知任务
created_tp_task = 0; // 标记任务未创建
}
if(value == BT_GATT_CCC_NOTIFY) { // 如果CCC值为通知
err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), "notify", strlen("notify")); // 发送数据指示
BT_WARN("ble tp send indatcate: %d", err); // 打印调试信息
}
}
}
// 定义BLE传输协议的Gatt属性
static struct bt_gatt_attr attrs[]= {
BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_BLE_TP), // BLE传输协议服务
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_RD, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_tp_recv_rd, NULL, NULL), // BLE传输协议读特征
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_WR, BT_GATT_CHRC_WRITE |BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE|BT_GATT_PERM_PREPARE_WRITE, NULL, ble_tp_recv_wr, NULL), // BLE传输协议写特征
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_IND, BT_GATT_CHRC_INDICATE, 0, NULL, NULL, NULL), // BLE传输协议通知特征
BT_GATT_CCC(ble_tp_ind_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), // BLE传输协议通知CCC
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_NOT, BT_GATT_CHRC_NOTIFY, 0, NULL, NULL, NULL), // BLE传输协议指示特征
BT_GATT_CCC(ble_tp_not_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE) // BLE传输协议指示CCC
};
阅读全文