You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

722 lines
32 KiB

3 years ago
3 years ago
  1. #include "t_bluetooth.h"
  2. /***********************************************************************************************************************
  3. * *******************************************************user******************************************************** *
  4. ***********************************************************************************************************************/
  5. uint8_t bluetooth_rx_buffer_len = 0;
  6. static uint8_t s_send_gatts_if;
  7. static uint16_t s_send_conn_id;
  8. static uint16_t s_attr_handle;
  9. static ble_gatts_str_t *g_ble_gatts_a_structer;
  10. static bluetooth_processer_t *g_bluetooth_processer;
  11. /***********************************************************************************************************************
  12. * ******************************************************************************************************************* *
  13. ***********************************************************************************************************************/
  14. /// Declare the static function
  15. 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);
  16. static void gatts_profile_b_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param);
  17. static uint8_t char1_str[] = {0x11, 0x22, 0x33};
  18. static esp_gatt_char_prop_t a_property = 0;
  19. static esp_gatt_char_prop_t b_property = 0;
  20. static esp_attr_value_t gatts_demo_char1_val =
  21. {
  22. .attr_max_len = GATTS_DEMO_CHAR_VAL_LEN_MAX,
  23. .attr_len = sizeof(char1_str),
  24. .attr_value = char1_str,
  25. };
  26. static uint8_t adv_config_done = 0;
  27. static uint8_t adv_service_uuid128[32] = {
  28. /* LSB <--------------------------------------------------------------------------------> MSB */
  29. // first uuid, 16bit, [12],[13] is the value
  30. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x33, //
  31. // second uuid, 32bit, [12], [13], [14], [15] is the value
  32. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //
  33. };
  34. static uint8_t adv_service_uuid128_test[16] = {
  35. /* LSB <--------------------------------------------------------------------------------> MSB */
  36. 0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E, //
  37. };
  38. // static uint16_t set_service_uuid128[32] = {
  39. // 0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0X00,
  40. // };
  41. // The length of adv data must be less than 31 bytes
  42. // static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56};
  43. // adv data
  44. static esp_ble_adv_data_t adv_data = {
  45. .set_scan_rsp = false,
  46. .include_name = true,
  47. .include_txpower = false,
  48. .min_interval = 0x0006, // slave connection min interval, Time = min_interval * 1.25 msec
  49. .max_interval = 0x0010, // slave connection max interval, Time = max_interval * 1.25 msec
  50. .appearance = 0x00,
  51. .manufacturer_len = 0, // TEST_MANUFACTURER_DATA_LEN,
  52. .p_manufacturer_data = NULL, //&test_manufacturer[0],
  53. .service_data_len = 0,
  54. .p_service_data = NULL,
  55. .service_uuid_len = sizeof(adv_service_uuid128),
  56. .p_service_uuid = adv_service_uuid128,
  57. .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
  58. };
  59. // scan response data
  60. static esp_ble_adv_data_t scan_rsp_data = {
  61. .set_scan_rsp = true,
  62. .include_name = true,
  63. .include_txpower = true,
  64. //.min_interval = 0x0006,
  65. //.max_interval = 0x0010,
  66. .appearance = 0x00,
  67. .manufacturer_len = 0, // TEST_MANUFACTURER_DATA_LEN,
  68. .p_manufacturer_data = NULL, //&test_manufacturer[0],
  69. .service_data_len = 0,
  70. .p_service_data = NULL,
  71. .service_uuid_len = sizeof(adv_service_uuid128),
  72. .p_service_uuid = adv_service_uuid128,
  73. .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
  74. };
  75. static esp_ble_adv_params_t adv_params = {
  76. .adv_int_min = 0x20,
  77. .adv_int_max = 0x40,
  78. .adv_type = ADV_TYPE_IND,
  79. .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
  80. //.peer_addr =
  81. //.peer_addr_type =
  82. .channel_map = ADV_CHNL_ALL,
  83. .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
  84. };
  85. /* One gatt-based profile one app_id and one gatts_if, this array will store the gatts_if returned by ESP_GATTS_REG_EVT */
  86. static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
  87. [PROFILE_A_APP_ID] = {
  88. .gatts_cb = gatts_profile_a_event_handler,
  89. .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
  90. },
  91. [PROFILE_B_APP_ID] = {
  92. .gatts_cb = gatts_profile_b_event_handler, /* This demo does not implement, similar as profile A */
  93. .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
  94. },
  95. };
  96. #ifdef CONFIG_SET_RAW_ADV_DATA
  97. static uint8_t raw_adv_data[] = {
  98. 0x02, 0x01, 0x06,
  99. 0x02, 0x0a, 0xeb, 0x03, 0x03, 0xab, 0xcd};
  100. static uint8_t raw_scan_rsp_data[] = {
  101. 0x0f, 0x09, 0x45, 0x53, 0x50, 0x5f, 0x47, 0x41, 0x54, 0x54, 0x53, 0x5f, 0x44,
  102. 0x45, 0x4d, 0x4f};
  103. #else
  104. #endif /* CONFIG_SET_RAW_ADV_DATA */
  105. static prepare_type_env_t a_prepare_write_env;
  106. static prepare_type_env_t b_prepare_write_env;
  107. static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
  108. {
  109. switch (event) {
  110. #ifdef CONFIG_SET_RAW_ADV_DATA
  111. case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT:
  112. adv_config_done &= (~adv_config_flag);
  113. if (adv_config_done==0){
  114. esp_ble_gap_start_advertising(&adv_params);
  115. }
  116. break;
  117. case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT:
  118. adv_config_done &= (~scan_rsp_config_flag);
  119. if (adv_config_done==0){
  120. esp_ble_gap_start_advertising(&adv_params);
  121. }
  122. break;
  123. #else
  124. case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
  125. adv_config_done &= (~adv_config_flag);
  126. if (adv_config_done == 0){
  127. esp_ble_gap_start_advertising(&adv_params);
  128. }
  129. break;
  130. case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT:
  131. adv_config_done &= (~scan_rsp_config_flag);
  132. if (adv_config_done == 0){
  133. esp_ble_gap_start_advertising(&adv_params);
  134. }
  135. break;
  136. #endif
  137. case ESP_GAP_BLE_ADV_START_COMPLETE_EVT:
  138. //advertising start complete event to indicate advertising start successfully or failed
  139. if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) {
  140. ESP_LOGE(GATTS_TAG, "Advertising start failed\n");
  141. }
  142. break;
  143. case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT:
  144. if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS) {
  145. ESP_LOGE(GATTS_TAG, "Advertising stop failed\n");
  146. } else {
  147. ESP_LOGI(GATTS_TAG, "Stop adv successfully\n");
  148. }
  149. break;
  150. case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
  151. ESP_LOGI(GATTS_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d",
  152. param->update_conn_params.status,
  153. param->update_conn_params.min_int,
  154. param->update_conn_params.max_int,
  155. param->update_conn_params.conn_int,
  156. param->update_conn_params.latency,
  157. param->update_conn_params.timeout);
  158. break;
  159. default:
  160. break;
  161. }
  162. }
  163. 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){
  164. esp_gatt_status_t status = ESP_GATT_OK;
  165. if (param->write.need_rsp){
  166. if (param->write.is_prep){
  167. if (prepare_write_env->prepare_buf == NULL) {
  168. prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE*sizeof(uint8_t));
  169. prepare_write_env->prepare_len = 0;
  170. if (prepare_write_env->prepare_buf == NULL) {
  171. ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem\n");
  172. status = ESP_GATT_NO_RESOURCES;
  173. }
  174. } else {
  175. if(param->write.offset > PREPARE_BUF_MAX_SIZE) {
  176. status = ESP_GATT_INVALID_OFFSET;
  177. } else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) {
  178. status = ESP_GATT_INVALID_ATTR_LEN;
  179. }
  180. }
  181. esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
  182. gatt_rsp->attr_value.len = param->write.len;
  183. gatt_rsp->attr_value.handle = param->write.handle;
  184. gatt_rsp->attr_value.offset = param->write.offset;
  185. gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
  186. memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
  187. esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp);
  188. if (response_err != ESP_OK){
  189. ESP_LOGE(GATTS_TAG, "Send response error\n");
  190. }
  191. free(gatt_rsp);
  192. if (status != ESP_GATT_OK){
  193. return;
  194. }
  195. memcpy(prepare_write_env->prepare_buf + param->write.offset,
  196. param->write.value,
  197. param->write.len);
  198. prepare_write_env->prepare_len += param->write.len;
  199. }else{
  200. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
  201. }
  202. }
  203. }
  204. void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){
  205. if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC){
  206. esp_log_buffer_hex(GATTS_TAG, prepare_write_env->prepare_buf, prepare_write_env->prepare_len);
  207. }else{
  208. ESP_LOGI(GATTS_TAG,"ESP_GATT_PREP_WRITE_CANCEL");
  209. }
  210. if (prepare_write_env->prepare_buf) {
  211. free(prepare_write_env->prepare_buf);
  212. prepare_write_env->prepare_buf = NULL;
  213. }
  214. prepare_write_env->prepare_len = 0;
  215. }
  216. 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) {
  217. switch (event) {
  218. case ESP_GATTS_REG_EVT:
  219. ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id);
  220. gl_profile_tab[PROFILE_A_APP_ID].service_id.is_primary = true;
  221. gl_profile_tab[PROFILE_A_APP_ID].service_id.id.inst_id = 0x00;
  222. gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16;
  223. gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A;
  224. esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name(TEST_DEVICE_NAME);
  225. if (set_dev_name_ret){
  226. ESP_LOGE(GATTS_TAG, "set device name failed, error code = %x", set_dev_name_ret);
  227. }
  228. #ifdef CONFIG_SET_RAW_ADV_DATA
  229. esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data));
  230. if (raw_adv_ret){
  231. ESP_LOGE(GATTS_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
  232. }
  233. adv_config_done |= adv_config_flag;
  234. esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data));
  235. if (raw_scan_ret){
  236. ESP_LOGE(GATTS_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret);
  237. }
  238. adv_config_done |= scan_rsp_config_flag;
  239. #else
  240. //config adv data
  241. esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data);
  242. if (ret){
  243. ESP_LOGE(GATTS_TAG, "config adv data failed, error code = %x", ret);
  244. }
  245. adv_config_done |= adv_config_flag;
  246. //config scan response data
  247. ret = esp_ble_gap_config_adv_data(&scan_rsp_data);
  248. if (ret){
  249. ESP_LOGE(GATTS_TAG, "config scan response data failed, error code = %x", ret);
  250. }
  251. adv_config_done |= scan_rsp_config_flag;
  252. #endif
  253. esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_A_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_A);
  254. break;
  255. case ESP_GATTS_READ_EVT: {
  256. 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);
  257. esp_gatt_rsp_t rsp;
  258. memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
  259. rsp.attr_value.handle = param->read.handle;
  260. rsp.attr_value.len = 4;
  261. rsp.attr_value.value[0] = 0x11;
  262. rsp.attr_value.value[1] = 0x22;
  263. rsp.attr_value.value[2] = 0x33;
  264. rsp.attr_value.value[3] = 0x44;
  265. uint8_t temp[3] = {67,68,69};
  266. esp_ble_gatts_send_indicate(gatts_if, param->read.conn_id, param->read.handle, 3, temp, true);
  267. esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
  268. ESP_GATT_OK, &rsp);
  269. break;
  270. }
  271. case ESP_GATTS_WRITE_EVT: {
  272. 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);
  273. if (!param->write.is_prep){
  274. ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
  275. esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
  276. if (gl_profile_tab[PROFILE_A_APP_ID].descr_handle == param->write.handle && param->write.len == 2){
  277. uint16_t descr_value = param->write.value[1]<<8 | param->write.value[0];
  278. if (descr_value == 0x0001){
  279. if (a_property & ESP_GATT_CHAR_PROP_BIT_NOTIFY){
  280. ESP_LOGI(GATTS_TAG, "notify enable");
  281. uint8_t notify_data[15];
  282. for (int i = 0; i < sizeof(notify_data); ++i)
  283. {
  284. notify_data[i] = i%0xff;
  285. }
  286. //the size of notify_data[] need less than MTU size
  287. esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, gl_profile_tab[PROFILE_A_APP_ID].char_handle,
  288. sizeof(notify_data), notify_data, false);
  289. }
  290. }else if (descr_value == 0x0002){
  291. if (a_property & ESP_GATT_CHAR_PROP_BIT_INDICATE){
  292. ESP_LOGI(GATTS_TAG, "indicate enable");
  293. uint8_t indicate_data[15];
  294. for (int i = 0; i < sizeof(indicate_data); ++i)
  295. {
  296. indicate_data[i] = i%0xff;
  297. }
  298. //the size of indicate_data[] need less than MTU size
  299. esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, gl_profile_tab[PROFILE_A_APP_ID].char_handle,
  300. sizeof(indicate_data), indicate_data, true);
  301. }
  302. }
  303. else if (descr_value == 0x0000){
  304. ESP_LOGI(GATTS_TAG, "notify/indicate disable ");
  305. }else{
  306. ESP_LOGE(GATTS_TAG, "unknown descr value");
  307. esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
  308. }
  309. }
  310. }
  311. example_write_event_env(gatts_if, &a_prepare_write_env, param);
  312. break;
  313. }
  314. case ESP_GATTS_EXEC_WRITE_EVT:
  315. ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT");
  316. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
  317. example_exec_write_event_env(&a_prepare_write_env, param);
  318. break;
  319. case ESP_GATTS_MTU_EVT:
  320. ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu);
  321. break;
  322. case ESP_GATTS_UNREG_EVT:
  323. break;
  324. case ESP_GATTS_CREATE_EVT:
  325. ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle);
  326. gl_profile_tab[PROFILE_A_APP_ID].service_handle = param->create.service_handle;
  327. //Unknown Characteristic uuid
  328. gl_profile_tab[PROFILE_A_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  329. // gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128 = adv_service_uuid128;
  330. memcpy(gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  331. esp_ble_gatts_start_service(gl_profile_tab[PROFILE_A_APP_ID].service_handle);
  332. a_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
  333. 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,
  334. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  335. a_property,
  336. &gatts_demo_char1_val, NULL);
  337. if (add_char_ret){
  338. ESP_LOGE(GATTS_TAG, "add char failed, error code =%x",add_char_ret);
  339. }
  340. break;
  341. case ESP_GATTS_ADD_INCL_SRVC_EVT:
  342. break;
  343. case ESP_GATTS_ADD_CHAR_EVT: {
  344. uint16_t length = 0;
  345. const uint8_t *prf_char;
  346. ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n",
  347. param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle);
  348. gl_profile_tab[PROFILE_A_APP_ID].char_handle = param->add_char.attr_handle;
  349. gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_16;
  350. gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG;
  351. esp_err_t get_attr_ret = esp_ble_gatts_get_attr_value(param->add_char.attr_handle, &length, &prf_char);
  352. if (get_attr_ret == ESP_FAIL){
  353. ESP_LOGE(GATTS_TAG, "ILLEGAL HANDLE");
  354. }
  355. ESP_LOGI(GATTS_TAG, "the gatts demo char length = %x\n", length);
  356. for(int i = 0; i < length; i++){
  357. ESP_LOGI(GATTS_TAG, "prf_char[%x] =%x\n",i,prf_char[i]);
  358. }
  359. 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,
  360. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, NULL, NULL);
  361. if (add_descr_ret){
  362. ESP_LOGE(GATTS_TAG, "add char descr failed, error code =%x", add_descr_ret);
  363. }
  364. break;
  365. }
  366. case ESP_GATTS_ADD_CHAR_DESCR_EVT:
  367. gl_profile_tab[PROFILE_A_APP_ID].descr_handle = param->add_char_descr.attr_handle;
  368. ESP_LOGI(GATTS_TAG, "ADD_DESCR_EVT, status %d, attr_handle %d, service_handle %d\n",
  369. param->add_char_descr.status, param->add_char_descr.attr_handle, param->add_char_descr.service_handle);
  370. break;
  371. case ESP_GATTS_DELETE_EVT:
  372. break;
  373. case ESP_GATTS_START_EVT:
  374. ESP_LOGI(GATTS_TAG, "SERVICE_START_EVT, status %d, service_handle %d\n",
  375. param->start.status, param->start.service_handle);
  376. break;
  377. case ESP_GATTS_STOP_EVT:
  378. break;
  379. case ESP_GATTS_CONNECT_EVT: {
  380. esp_ble_conn_update_params_t conn_params = {0};
  381. memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t));
  382. /* For the IOS system, please reference the apple official documents about the ble connection parameters restrictions. */
  383. conn_params.latency = 0;
  384. conn_params.max_int = 0x20; // max_int = 0x20*1.25ms = 40ms
  385. conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms
  386. conn_params.timeout = 400; // timeout = 400*10ms = 4000ms
  387. ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:",
  388. param->connect.conn_id,
  389. param->connect.remote_bda[0], param->connect.remote_bda[1], param->connect.remote_bda[2],
  390. param->connect.remote_bda[3], param->connect.remote_bda[4], param->connect.remote_bda[5]);
  391. gl_profile_tab[PROFILE_A_APP_ID].conn_id = param->connect.conn_id;
  392. //start sent the update connection parameters to the peer device.
  393. esp_ble_gap_update_conn_params(&conn_params);
  394. break;
  395. }
  396. case ESP_GATTS_DISCONNECT_EVT:
  397. ESP_LOGI(GATTS_TAG, "ESP_GATTS_DISCONNECT_EVT, disconnect reason 0x%x", param->disconnect.reason);
  398. esp_ble_gap_start_advertising(&adv_params);
  399. break;
  400. case ESP_GATTS_CONF_EVT:
  401. ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT, status %d attr_handle %d", param->conf.status, param->conf.handle);
  402. if (param->conf.status != ESP_GATT_OK){
  403. esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len);
  404. }
  405. break;
  406. case ESP_GATTS_OPEN_EVT:
  407. case ESP_GATTS_CANCEL_OPEN_EVT:
  408. case ESP_GATTS_CLOSE_EVT:
  409. case ESP_GATTS_LISTEN_EVT:
  410. case ESP_GATTS_CONGEST_EVT:
  411. default:
  412. break;
  413. }
  414. }
  415. static void gatts_profile_b_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
  416. {
  417. switch (event)
  418. {
  419. case ESP_GATTS_REG_EVT:
  420. ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id);
  421. gl_profile_tab[PROFILE_B_APP_ID].service_id.is_primary = true;
  422. gl_profile_tab[PROFILE_B_APP_ID].service_id.id.inst_id = 0x00;
  423. // gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16;
  424. // gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_B;
  425. gl_profile_tab[PROFILE_B_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  426. memcpy(gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  427. esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_B_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_B);
  428. break;
  429. case ESP_GATTS_READ_EVT:
  430. {
  431. // 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);
  432. // esp_gatt_rsp_t rsp;
  433. // memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
  434. // rsp.attr_value.handle = param->read.handle;
  435. // rsp.attr_value.len = 4;
  436. // rsp.attr_value.value[0] = 0xde;
  437. // rsp.attr_value.value[1] = 0xed;
  438. // rsp.attr_value.value[2] = 0xbe;
  439. // rsp.attr_value.value[3] = 0xef;
  440. // esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
  441. // ESP_GATT_OK, &rsp);
  442. break;
  443. }
  444. case ESP_GATTS_WRITE_EVT:
  445. {
  446. ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d\n", param->write.conn_id, param->write.trans_id, param->write.handle);
  447. if (!param->write.is_prep)
  448. {
  449. ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
  450. esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
  451. start_receive_data_to_buffer(param->write.len, param->write.value);
  452. }
  453. example_write_event_env(gatts_if, &b_prepare_write_env, param);
  454. break;
  455. }
  456. case ESP_GATTS_EXEC_WRITE_EVT:
  457. ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT");
  458. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
  459. example_exec_write_event_env(&b_prepare_write_env, param);
  460. break;
  461. case ESP_GATTS_MTU_EVT:
  462. // ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu);
  463. break;
  464. case ESP_GATTS_UNREG_EVT:
  465. break;
  466. case ESP_GATTS_CREATE_EVT:
  467. ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle);
  468. gl_profile_tab[PROFILE_B_APP_ID].service_handle = param->create.service_handle;
  469. // set profile b characteristic
  470. gl_profile_tab[PROFILE_B_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  471. // gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_B;
  472. memcpy(gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  473. esp_ble_gatts_start_service(gl_profile_tab[PROFILE_B_APP_ID].service_handle);
  474. // b_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
  475. b_property = ESP_GATT_CHAR_PROP_BIT_WRITE;
  476. esp_err_t add_char_ret = esp_ble_gatts_add_char(gl_profile_tab[PROFILE_B_APP_ID].service_handle, &gl_profile_tab[PROFILE_B_APP_ID].char_uuid,
  477. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  478. b_property,
  479. NULL, NULL);
  480. if (add_char_ret)
  481. {
  482. ESP_LOGE(GATTS_TAG, "add char failed, error code =%x", add_char_ret);
  483. }
  484. break;
  485. case ESP_GATTS_ADD_INCL_SRVC_EVT:
  486. break;
  487. case ESP_GATTS_ADD_CHAR_EVT:
  488. ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n",
  489. param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle);
  490. gl_profile_tab[PROFILE_B_APP_ID].char_handle = param->add_char.attr_handle;
  491. gl_profile_tab[PROFILE_B_APP_ID].descr_uuid.len = ESP_UUID_LEN_128;
  492. memcpy(gl_profile_tab[PROFILE_B_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  493. esp_ble_gatts_add_char_descr(gl_profile_tab[PROFILE_B_APP_ID].service_handle, &gl_profile_tab[PROFILE_B_APP_ID].descr_uuid,
  494. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  495. NULL, NULL);
  496. break;
  497. case ESP_GATTS_ADD_CHAR_DESCR_EVT:
  498. gl_profile_tab[PROFILE_B_APP_ID].descr_handle = param->add_char_descr.attr_handle;
  499. ESP_LOGI(GATTS_TAG, "ADD_DESCR_EVT, status %d, attr_handle %d, service_handle %d\n",
  500. param->add_char_descr.status, param->add_char_descr.attr_handle, param->add_char_descr.service_handle);
  501. break;
  502. case ESP_GATTS_DELETE_EVT:
  503. break;
  504. case ESP_GATTS_START_EVT:
  505. ESP_LOGI(GATTS_TAG, "SERVICE_START_EVT, status %d, service_handle %d\n",
  506. param->start.status, param->start.service_handle);
  507. break;
  508. case ESP_GATTS_STOP_EVT:
  509. break;
  510. case ESP_GATTS_CONNECT_EVT:
  511. ESP_LOGI(GATTS_TAG, "CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:",
  512. param->connect.conn_id,
  513. param->connect.remote_bda[0], param->connect.remote_bda[1], param->connect.remote_bda[2],
  514. param->connect.remote_bda[3], param->connect.remote_bda[4], param->connect.remote_bda[5]);
  515. gl_profile_tab[PROFILE_B_APP_ID].conn_id = param->connect.conn_id;
  516. break;
  517. case ESP_GATTS_CONF_EVT:
  518. ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT status %d attr_handle %d", param->conf.status, param->conf.handle);
  519. if (param->conf.status != ESP_GATT_OK)
  520. {
  521. esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len);
  522. }
  523. break;
  524. case ESP_GATTS_DISCONNECT_EVT:
  525. ESP_LOGI(GATTS_TAG, "ESP_GATTS_DISCONNECT_EVT, disconnect reason 0x%x", param->disconnect.reason);
  526. esp_ble_gap_start_advertising(&adv_params);
  527. break;
  528. case ESP_GATTS_OPEN_EVT:
  529. case ESP_GATTS_CANCEL_OPEN_EVT:
  530. case ESP_GATTS_CLOSE_EVT:
  531. case ESP_GATTS_LISTEN_EVT:
  532. case ESP_GATTS_CONGEST_EVT:
  533. default:
  534. break;
  535. }
  536. }
  537. static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
  538. {
  539. /* If event is register event, store the gatts_if for each profile */
  540. if (event == ESP_GATTS_REG_EVT) {
  541. if (param->reg.status == ESP_GATT_OK) {
  542. gl_profile_tab[param->reg.app_id].gatts_if = gatts_if;
  543. } else {
  544. ESP_LOGI(GATTS_TAG, "Reg app failed, app_id %04x, status %d\n",
  545. param->reg.app_id,
  546. param->reg.status);
  547. return;
  548. }
  549. }
  550. /* If the gatts_if equal to profile A, call profile A cb handler,
  551. * so here call each profile's callback */
  552. do {
  553. int idx;
  554. for (idx = 0; idx < PROFILE_NUM; idx++) {
  555. if (gatts_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */
  556. gatts_if == gl_profile_tab[idx].gatts_if) {
  557. if (gl_profile_tab[idx].gatts_cb) {
  558. gl_profile_tab[idx].gatts_cb(event, gatts_if, param);
  559. }
  560. }
  561. }
  562. } while (0);
  563. }
  564. void esp_ble_gatts_init(ble_gatts_str_t *ble_gatts_a_str, bluetooth_processer_t *bluetooth_processer)
  565. {
  566. esp_err_t ret;
  567. // g_ble_gatts_a_structer = ble_gatts_a_str;
  568. g_bluetooth_processer = bluetooth_processer;
  569. // Initialize NVS.
  570. ret = nvs_flash_init();
  571. if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  572. {
  573. ESP_ERROR_CHECK(nvs_flash_erase());
  574. ret = nvs_flash_init();
  575. }
  576. ESP_ERROR_CHECK(ret);
  577. ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
  578. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  579. ret = esp_bt_controller_init(&bt_cfg);
  580. if (ret)
  581. {
  582. ESP_LOGE(GATTS_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
  583. return;
  584. }
  585. ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
  586. if (ret)
  587. {
  588. ESP_LOGE(GATTS_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
  589. return;
  590. }
  591. ret = esp_bluedroid_init();
  592. if (ret)
  593. {
  594. ESP_LOGE(GATTS_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  595. return;
  596. }
  597. ret = esp_bluedroid_enable();
  598. if (ret)
  599. {
  600. ESP_LOGE(GATTS_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  601. return;
  602. }
  603. ret = esp_ble_gatts_register_callback(gatts_event_handler);
  604. if (ret)
  605. {
  606. ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret);
  607. return;
  608. }
  609. ret = esp_ble_gap_register_callback(gap_event_handler);
  610. if (ret)
  611. {
  612. ESP_LOGE(GATTS_TAG, "gap register error, error code = %x", ret);
  613. return;
  614. }
  615. ret = esp_ble_gatts_app_register(PROFILE_A_APP_ID);
  616. if (ret)
  617. {
  618. ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret);
  619. return;
  620. }
  621. ret = esp_ble_gatts_app_register(PROFILE_B_APP_ID);
  622. if (ret)
  623. {
  624. ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret);
  625. return;
  626. }
  627. esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);
  628. if (local_mtu_ret)
  629. {
  630. ESP_LOGE(GATTS_TAG, "set local MTU failed, error code = %x", local_mtu_ret);
  631. }
  632. }
  633. void gatts_profile_a_constructor(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
  634. {
  635. g_ble_gatts_a_structer->attr_handle = param->read.handle;
  636. g_ble_gatts_a_structer->send_conn_id = param->read.conn_id;
  637. g_ble_gatts_a_structer->send_gatts_if = gatts_if;
  638. }
  639. void start_receive_data_to_buffer(uint16_t length, uint8_t *value)
  640. {
  641. g_bluetooth_processer->bluetooth_rx_buffer_start_receving = true;
  642. timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0);
  643. //判断是否buffer越界
  644. if ((length + bluetooth_rx_buffer_len) > profile_b_buffer_size)
  645. {
  646. return;
  647. }
  648. if (!g_bluetooth_processer->bluetooth_rx_buffer_processing)
  649. {
  650. //写入到buffer
  651. for (int i = 0; i < length; i++)
  652. {
  653. g_bluetooth_processer->bluetooth_processer_rx_buf[bluetooth_rx_buffer_len++] = value[i];
  654. }
  655. }
  656. }
  657. void buffer_all_init()
  658. {
  659. bluetooth_rx_buffer_len = 0;
  660. memset(g_bluetooth_processer->bluetooth_processer_rx_buf, 0, profile_b_buffer_size);
  661. }
  662. void gatts_profile_a_constructor_s()
  663. {
  664. g_ble_gatts_a_structer->attr_handle = s_attr_handle;
  665. g_ble_gatts_a_structer->send_conn_id = s_send_conn_id;
  666. g_ble_gatts_a_structer->send_gatts_if = s_send_gatts_if;
  667. }