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.

697 lines
29 KiB

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