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
30 KiB

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