diff --git a/main/gatts_demo.c b/main/gatts_demo.c index 737623e..6d59899 100644 --- a/main/gatts_demo.c +++ b/main/gatts_demo.c @@ -39,7 +39,6 @@ bool parse_rxbuffer_and_validation_data(cJSON **json_tmp); bool parse_json_to_struct(cJSON *ch); void receipt_json_set_position(); void receipt_json_get_status(); -void gatts_profile_a_constructor(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); bluetooth_processer_t s_bluetooth_processer = { .bluetooth_processer_rx_buf = bluetooth_rx_buffer, @@ -113,6 +112,7 @@ void app_main(void) // motor_init(); // motor_encoder_init(); timer_group_init(TIMER_GROUP_0, TIMER_0, false, timer_group0_interval_num, timer_interval_ms); + // gatts_profile_a_constructor_s(); // uint8_t temp[5] = "hello"; // esp_gatt_rsp_t rsp; @@ -129,8 +129,8 @@ void app_main(void) // { // rsp.attr_value.handle = ble_gatts_a_str.attr_handle; // ESP_LOGI(GATTS_TAG, "%d,%d,%d", ble_gatts_a_str.attr_handle, ble_gatts_a_str.send_conn_id, ble_gatts_a_str.send_gatts_if); - // esp_ble_gatts_send_indicate(ble_gatts_a_str.send_gatts_if, ble_gatts_a_str.send_conn_id, - // ble_gatts_a_str.attr_handle, 5, temp, true); + // esp_ble_gatts_send_indicate(ble_gatts_a_str.send_gatts_if, ble_gatts_a_str.send_conn_id, + // ble_gatts_a_str.attr_handle, 5, temp, true); // esp_ble_gatts_send_response(ble_gatts_a_str.send_gatts_if, ble_gatts_a_str.send_conn_id, 1, // ESP_GATT_OK, &rsp); // ets_delay_us(1000000); diff --git a/main/t_bluetooth.c b/main/t_bluetooth.c index 8f0604d..8d30408 100644 --- a/main/t_bluetooth.c +++ b/main/t_bluetooth.c @@ -6,6 +6,10 @@ uint8_t bluetooth_rx_buffer_len = 0; +static uint8_t s_send_gatts_if; +static uint16_t s_send_conn_id; +static uint16_t s_attr_handle; + static ble_gatts_str_t *g_ble_gatts_a_structer; static bluetooth_processer_t *g_bluetooth_processer; @@ -116,100 +120,81 @@ static uint8_t raw_scan_rsp_data[] = { #endif /* CONFIG_SET_RAW_ADV_DATA */ -// static prepare_type_env_t a_prepare_write_env; +static prepare_type_env_t a_prepare_write_env; static prepare_type_env_t b_prepare_write_env; static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { - switch (event) - { + switch (event) { #ifdef CONFIG_SET_RAW_ADV_DATA case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: adv_config_done &= (~adv_config_flag); - if (adv_config_done == 0) - { + if (adv_config_done==0){ esp_ble_gap_start_advertising(&adv_params); } break; case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT: adv_config_done &= (~scan_rsp_config_flag); - if (adv_config_done == 0) - { + if (adv_config_done==0){ esp_ble_gap_start_advertising(&adv_params); } break; #else case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: adv_config_done &= (~adv_config_flag); - if (adv_config_done == 0) - { + if (adv_config_done == 0){ esp_ble_gap_start_advertising(&adv_params); } break; case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: adv_config_done &= (~scan_rsp_config_flag); - if (adv_config_done == 0) - { + if (adv_config_done == 0){ esp_ble_gap_start_advertising(&adv_params); } break; #endif case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: - // advertising start complete event to indicate advertising start successfully or failed - if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) - { + //advertising start complete event to indicate advertising start successfully or failed + if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { ESP_LOGE(GATTS_TAG, "Advertising start failed\n"); } break; case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT: - if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS) - { + if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS) { ESP_LOGE(GATTS_TAG, "Advertising stop failed\n"); - } - else - { + } else { ESP_LOGI(GATTS_TAG, "Stop adv successfully\n"); } break; case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT: - ESP_LOGI(GATTS_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d", - param->update_conn_params.status, - param->update_conn_params.min_int, - param->update_conn_params.max_int, - param->update_conn_params.conn_int, - param->update_conn_params.latency, - param->update_conn_params.timeout); + ESP_LOGI(GATTS_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d", + param->update_conn_params.status, + param->update_conn_params.min_int, + param->update_conn_params.max_int, + param->update_conn_params.conn_int, + param->update_conn_params.latency, + param->update_conn_params.timeout); break; default: break; } } -void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param) -{ +void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){ esp_gatt_status_t status = ESP_GATT_OK; - if (param->write.need_rsp) - { - if (param->write.is_prep) - { - if (prepare_write_env->prepare_buf == NULL) - { - prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t)); + if (param->write.need_rsp){ + if (param->write.is_prep){ + if (prepare_write_env->prepare_buf == NULL) { + prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t)); prepare_write_env->prepare_len = 0; - if (prepare_write_env->prepare_buf == NULL) - { + if (prepare_write_env->prepare_buf == NULL) { ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem\n"); status = ESP_GATT_NO_RESOURCES; } - } - else - { - if (param->write.offset > PREPARE_BUF_MAX_SIZE) - { + } else { + if(param->write.offset > PREPARE_BUF_MAX_SIZE) { status = ESP_GATT_INVALID_OFFSET; - } - else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) - { + } else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) { status = ESP_GATT_INVALID_ATTR_LEN; } } @@ -221,88 +206,71 @@ void example_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len); esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp); - if (response_err != ESP_OK) - { - ESP_LOGE(GATTS_TAG, "Send response error\n"); + if (response_err != ESP_OK){ + ESP_LOGE(GATTS_TAG, "Send response error\n"); } free(gatt_rsp); - if (status != ESP_GATT_OK) - { + if (status != ESP_GATT_OK){ return; } memcpy(prepare_write_env->prepare_buf + param->write.offset, param->write.value, param->write.len); prepare_write_env->prepare_len += param->write.len; - } - else - { + + }else{ esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL); } } } -void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param) -{ - if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC) - { +void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){ + if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC){ esp_log_buffer_hex(GATTS_TAG, prepare_write_env->prepare_buf, prepare_write_env->prepare_len); + }else{ + ESP_LOGI(GATTS_TAG,"ESP_GATT_PREP_WRITE_CANCEL"); } - else - { - ESP_LOGI(GATTS_TAG, "ESP_GATT_PREP_WRITE_CANCEL"); - } - if (prepare_write_env->prepare_buf) - { + if (prepare_write_env->prepare_buf) { free(prepare_write_env->prepare_buf); prepare_write_env->prepare_buf = NULL; } prepare_write_env->prepare_len = 0; } -static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) -{ - switch (event) - { +static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { + switch (event) { case ESP_GATTS_REG_EVT: ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id); gl_profile_tab[PROFILE_A_APP_ID].service_id.is_primary = true; gl_profile_tab[PROFILE_A_APP_ID].service_id.id.inst_id = 0x00; - // set unknown service uuid - gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_128; - memcpy(gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid128, adv_service_uuid128_test, 16); - // gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A; + gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A; esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name(TEST_DEVICE_NAME); - if (set_dev_name_ret) - { + if (set_dev_name_ret){ ESP_LOGE(GATTS_TAG, "set device name failed, error code = %x", set_dev_name_ret); } #ifdef CONFIG_SET_RAW_ADV_DATA esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data)); - if (raw_adv_ret) - { + if (raw_adv_ret){ ESP_LOGE(GATTS_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret); } adv_config_done |= adv_config_flag; esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data)); - if (raw_scan_ret) - { + if (raw_scan_ret){ ESP_LOGE(GATTS_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret); } adv_config_done |= scan_rsp_config_flag; #else - // config adv data + //config adv data esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data); - if (ret) - { + if (ret){ ESP_LOGE(GATTS_TAG, "config adv data failed, error code = %x", ret); } adv_config_done |= adv_config_flag; - // config scan response data + //config scan response data ret = esp_ble_gap_config_adv_data(&scan_rsp_data); - if (ret) - { + if (ret){ ESP_LOGE(GATTS_TAG, "config scan response data failed, error code = %x", ret); } adv_config_done |= scan_rsp_config_flag; @@ -310,84 +278,118 @@ static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_i #endif esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_A_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_A); break; - case ESP_GATTS_READ_EVT: - { - gatts_profile_a_constructor(event, gatts_if, param); + case ESP_GATTS_READ_EVT: { ESP_LOGI(GATTS_TAG, "GATT_READ_EVT, conn_id %d, trans_id %d, handle %d\n", param->read.conn_id, param->read.trans_id, param->read.handle); esp_gatt_rsp_t rsp; memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); rsp.attr_value.handle = param->read.handle; rsp.attr_value.len = 4; - rsp.attr_value.value[0] = 0x11; - rsp.attr_value.value[1] = 0x22; - rsp.attr_value.value[2] = 0x33; - rsp.attr_value.value[3] = 0x44; + rsp.attr_value.value[0] = 0xde; + rsp.attr_value.value[1] = 0xed; + rsp.attr_value.value[2] = 0xbe; + rsp.attr_value.value[3] = 0xef; + uint8_t temp[3] = {9,9,9}; + + esp_ble_gatts_send_indicate(gatts_if, param->read.conn_id, param->read.handle, 3, temp, true); esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &rsp); break; } - case ESP_GATTS_WRITE_EVT: - { - // example_write_event_env(gatts_if, &a_prepare_write_env, param); + case ESP_GATTS_WRITE_EVT: { + ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d", param->write.conn_id, param->write.trans_id, param->write.handle); + if (!param->write.is_prep){ + ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len); + esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len); + if (gl_profile_tab[PROFILE_A_APP_ID].descr_handle == param->write.handle && param->write.len == 2){ + uint16_t descr_value = param->write.value[1]<<8 | param->write.value[0]; + if (descr_value == 0x0001){ + if (a_property & ESP_GATT_CHAR_PROP_BIT_NOTIFY){ + ESP_LOGI(GATTS_TAG, "notify enable"); + uint8_t notify_data[15]; + for (int i = 0; i < sizeof(notify_data); ++i) + { + notify_data[i] = i%0xff; + } + //the size of notify_data[] need less than MTU size + esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, gl_profile_tab[PROFILE_A_APP_ID].char_handle, + sizeof(notify_data), notify_data, false); + } + }else if (descr_value == 0x0002){ + if (a_property & ESP_GATT_CHAR_PROP_BIT_INDICATE){ + ESP_LOGI(GATTS_TAG, "indicate enable"); + uint8_t indicate_data[15]; + for (int i = 0; i < sizeof(indicate_data); ++i) + { + indicate_data[i] = i%0xff; + } + //the size of indicate_data[] need less than MTU size + esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, gl_profile_tab[PROFILE_A_APP_ID].char_handle, + sizeof(indicate_data), indicate_data, true); + } + } + else if (descr_value == 0x0000){ + ESP_LOGI(GATTS_TAG, "notify/indicate disable "); + }else{ + ESP_LOGE(GATTS_TAG, "unknown descr value"); + esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len); + } + + } + } + example_write_event_env(gatts_if, &a_prepare_write_env, param); break; } case ESP_GATTS_EXEC_WRITE_EVT: - // ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT"); - // esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); - // example_exec_write_event_env(&a_prepare_write_env, param); + ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT"); + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); + example_exec_write_event_env(&a_prepare_write_env, param); break; case ESP_GATTS_MTU_EVT: - // ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu); + ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu); break; case ESP_GATTS_UNREG_EVT: break; case ESP_GATTS_CREATE_EVT: ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle); gl_profile_tab[PROFILE_A_APP_ID].service_handle = param->create.service_handle; - // Unknown Characteristic uuid + //Unknown Characteristic uuid gl_profile_tab[PROFILE_A_APP_ID].char_uuid.len = ESP_UUID_LEN_128; // gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128 = adv_service_uuid128; - memcpy(gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16); + memcpy(gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16); esp_ble_gatts_start_service(gl_profile_tab[PROFILE_A_APP_ID].service_handle); - // a_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY; - a_property = ESP_GATT_CHAR_PROP_BIT_READ; + a_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY; esp_err_t add_char_ret = esp_ble_gatts_add_char(gl_profile_tab[PROFILE_A_APP_ID].service_handle, &gl_profile_tab[PROFILE_A_APP_ID].char_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, a_property, &gatts_demo_char1_val, NULL); - if (add_char_ret) - { - ESP_LOGE(GATTS_TAG, "add char failed, error code =%x", add_char_ret); + if (add_char_ret){ + ESP_LOGE(GATTS_TAG, "add char failed, error code =%x",add_char_ret); } break; case ESP_GATTS_ADD_INCL_SRVC_EVT: break; - case ESP_GATTS_ADD_CHAR_EVT: - { + case ESP_GATTS_ADD_CHAR_EVT: { uint16_t length = 0; const uint8_t *prf_char; ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n", - param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle); + param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle); gl_profile_tab[PROFILE_A_APP_ID].char_handle = param->add_char.attr_handle; - gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_128; - memcpy(gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16); - esp_err_t get_attr_ret = esp_ble_gatts_get_attr_value(param->add_char.attr_handle, &length, &prf_char); - if (get_attr_ret == ESP_FAIL) - { + gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_16; + gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG; + esp_err_t get_attr_ret = esp_ble_gatts_get_attr_value(param->add_char.attr_handle, &length, &prf_char); + if (get_attr_ret == ESP_FAIL){ ESP_LOGE(GATTS_TAG, "ILLEGAL HANDLE"); } ESP_LOGI(GATTS_TAG, "the gatts demo char length = %x\n", length); - for (int i = 0; i < length; i++) - { - ESP_LOGI(GATTS_TAG, "prf_char[%x] =%x\n", i, prf_char[i]); + for(int i = 0; i < length; i++){ + ESP_LOGI(GATTS_TAG, "prf_char[%x] =%x\n",i,prf_char[i]); } esp_err_t add_descr_ret = esp_ble_gatts_add_char_descr(gl_profile_tab[PROFILE_A_APP_ID].service_handle, &gl_profile_tab[PROFILE_A_APP_ID].descr_uuid, - ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, NULL, NULL); - if (add_descr_ret) - { + ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, NULL, NULL); + if (add_descr_ret){ ESP_LOGE(GATTS_TAG, "add char descr failed, error code =%x", add_descr_ret); } break; @@ -405,21 +407,20 @@ static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_i break; case ESP_GATTS_STOP_EVT: break; - case ESP_GATTS_CONNECT_EVT: - { + case ESP_GATTS_CONNECT_EVT: { esp_ble_conn_update_params_t conn_params = {0}; memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t)); /* For the IOS system, please reference the apple official documents about the ble connection parameters restrictions. */ conn_params.latency = 0; - conn_params.max_int = 0x20; // max_int = 0x20*1.25ms = 40ms - conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms - conn_params.timeout = 400; // timeout = 400*10ms = 4000ms + conn_params.max_int = 0x20; // max_int = 0x20*1.25ms = 40ms + conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms + conn_params.timeout = 400; // timeout = 400*10ms = 4000ms ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:", param->connect.conn_id, param->connect.remote_bda[0], param->connect.remote_bda[1], param->connect.remote_bda[2], param->connect.remote_bda[3], param->connect.remote_bda[4], param->connect.remote_bda[5]); gl_profile_tab[PROFILE_A_APP_ID].conn_id = param->connect.conn_id; - // start sent the update connection parameters to the peer device. + //start sent the update connection parameters to the peer device. esp_ble_gap_update_conn_params(&conn_params); break; } @@ -428,10 +429,10 @@ static void gatts_profile_a_event_handler(esp_gatts_cb_event_t event, esp_gatt_i esp_ble_gap_start_advertising(&adv_params); break; case ESP_GATTS_CONF_EVT: - // ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT, status %d attr_handle %d", param->conf.status, param->conf.handle); - // if (param->conf.status != ESP_GATT_OK){ - // esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len); - // } + ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT, status %d attr_handle %d", param->conf.status, param->conf.handle); + if (param->conf.status != ESP_GATT_OK){ + esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len); + } break; case ESP_GATTS_OPEN_EVT: case ESP_GATTS_CANCEL_OPEN_EVT: @@ -486,9 +487,9 @@ static void gatts_profile_b_event_handler(esp_gatts_cb_event_t event, esp_gatt_i break; } case ESP_GATTS_EXEC_WRITE_EVT: - // ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT"); - // esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); - // example_exec_write_event_env(&b_prepare_write_env, param); + ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT"); + esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); + example_exec_write_event_env(&b_prepare_write_env, param); break; case ESP_GATTS_MTU_EVT: // ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu); @@ -572,33 +573,25 @@ static void gatts_profile_b_event_handler(esp_gatts_cb_event_t event, esp_gatt_i static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { /* If event is register event, store the gatts_if for each profile */ - if (event == ESP_GATTS_REG_EVT) - { - if (param->reg.status == ESP_GATT_OK) - { + if (event == ESP_GATTS_REG_EVT) { + if (param->reg.status == ESP_GATT_OK) { gl_profile_tab[param->reg.app_id].gatts_if = gatts_if; - } - else - { + } else { ESP_LOGI(GATTS_TAG, "Reg app failed, app_id %04x, status %d\n", - param->reg.app_id, - param->reg.status); + param->reg.app_id, + param->reg.status); return; } } /* If the gatts_if equal to profile A, call profile A cb handler, * so here call each profile's callback */ - do - { + do { int idx; - for (idx = 0; idx < PROFILE_NUM; idx++) - { + for (idx = 0; idx < PROFILE_NUM; idx++) { if (gatts_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ - gatts_if == gl_profile_tab[idx].gatts_if) - { - if (gl_profile_tab[idx].gatts_cb) - { + gatts_if == gl_profile_tab[idx].gatts_if) { + if (gl_profile_tab[idx].gatts_cb) { gl_profile_tab[idx].gatts_cb(event, gatts_if, param); } } @@ -610,8 +603,8 @@ void esp_ble_gatts_init(ble_gatts_str_t *ble_gatts_a_str, bluetooth_processer_t { esp_err_t ret; - g_ble_gatts_a_structer = ble_gatts_a_str; - g_bluetooth_processer = bluetooth_processer; + // g_ble_gatts_a_structer = ble_gatts_a_str; + // g_bluetooth_processer = bluetooth_processer; // Initialize NVS. ret = nvs_flash_init(); @@ -720,4 +713,11 @@ void buffer_all_init() { bluetooth_rx_buffer_len = 0; memset(g_bluetooth_processer->bluetooth_processer_rx_buf, 0, profile_b_buffer_size); +} + +void gatts_profile_a_constructor_s() +{ + g_ble_gatts_a_structer->attr_handle = s_attr_handle; + g_ble_gatts_a_structer->send_conn_id = s_send_conn_id; + g_ble_gatts_a_structer->send_gatts_if = s_send_gatts_if; } \ No newline at end of file diff --git a/main/t_bluetooth.h b/main/t_bluetooth.h index 4693bf7..f2ab1ef 100644 --- a/main/t_bluetooth.h +++ b/main/t_bluetooth.h @@ -128,4 +128,6 @@ void esp_ble_gatts_init(ble_gatts_str_t *ble_gatts_a_str, bluetooth_processer_t void gatts_profile_a_constructor(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); void start_receive_data_to_buffer(uint16_t length, uint8_t *value); -void buffer_all_init(); \ No newline at end of file +void buffer_all_init(); + +void gatts_profile_a_constructor_s(); \ No newline at end of file