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.

1027 lines
39 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. /*
  2. This example code is in the Public Domain (or CC0 licensed, at your option.)
  3. Unless required by applicable law or agreed to in writing, this
  4. software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  5. CONDITIONS OF ANY KIND, either express or implied.
  6. */
  7. /****************************************************************************
  8. *
  9. * This demo showcases BLE GATT server. It can send adv data, be connected by client.
  10. * Run the gatt_client demo, the client demo will automatically connect to the gatt_server demo.
  11. * Client demo will enable gatt_server's notify after connection. The two devices will then exchange
  12. * data.
  13. *
  14. ****************************************************************************/
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "freertos/FreeRTOS.h"
  19. #include "freertos/task.h"
  20. #include "freertos/event_groups.h"
  21. #include "esp_system.h"
  22. #include "esp_log.h"
  23. #include "nvs_flash.h"
  24. #include "esp_bt.h"
  25. #include "driver/timer.h"
  26. #include "cJSON.h"
  27. #include "cJSON_Utils.h"
  28. #include "esp_gap_ble_api.h"
  29. #include "esp_gatts_api.h"
  30. #include "esp_bt_defs.h"
  31. #include "esp_bt_main.h"
  32. #include "esp_gatt_common_api.h"
  33. #include "sdkconfig.h"
  34. #include "motor_drive.h"
  35. #define GATTS_TAG "GATTS_DEMO"
  36. /// Declare the static function
  37. 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);
  38. 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);
  39. #define GATTS_SERVICE_UUID_TEST_A 0x00FF
  40. #define GATTS_CHAR_UUID_TEST_A 0xFF01
  41. #define GATTS_DESCR_UUID_TEST_A 0x3333
  42. #define GATTS_NUM_HANDLE_TEST_A 4
  43. #define GATTS_SERVICE_UUID_TEST_B 0x00EE
  44. #define GATTS_CHAR_UUID_TEST_B 0xEE01
  45. #define GATTS_DESCR_UUID_TEST_B 0x2222
  46. #define GATTS_NUM_HANDLE_TEST_B 4
  47. #define TEST_DEVICE_NAME "ESP_GATTS_DEMO"
  48. #define TEST_MANUFACTURER_DATA_LEN 17
  49. #define GATTS_DEMO_CHAR_VAL_LEN_MAX 0x40
  50. #define PREPARE_BUF_MAX_SIZE 1024
  51. static uint8_t char1_str[] = {0x11, 0x22, 0x33};
  52. static esp_gatt_char_prop_t a_property = 0;
  53. static esp_gatt_char_prop_t b_property = 0;
  54. static esp_attr_value_t gatts_demo_char1_val =
  55. {
  56. .attr_max_len = GATTS_DEMO_CHAR_VAL_LEN_MAX,
  57. .attr_len = sizeof(char1_str),
  58. .attr_value = char1_str,
  59. };
  60. static uint8_t adv_config_done = 0;
  61. #define adv_config_flag (1 << 0)
  62. #define scan_rsp_config_flag (1 << 1)
  63. #ifdef CONFIG_SET_RAW_ADV_DATA
  64. static uint8_t raw_adv_data[] = {
  65. 0x02, 0x01, 0x06,
  66. 0x02, 0x0a, 0xeb, 0x03, 0x03, 0xab, 0xcd};
  67. static uint8_t raw_scan_rsp_data[] = {
  68. 0x0f, 0x09, 0x45, 0x53, 0x50, 0x5f, 0x47, 0x41, 0x54, 0x54, 0x53, 0x5f, 0x44,
  69. 0x45, 0x4d, 0x4f};
  70. #else
  71. static uint8_t adv_service_uuid128[32] = {
  72. /* LSB <--------------------------------------------------------------------------------> MSB */
  73. // first uuid, 16bit, [12],[13] is the value
  74. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x33, //
  75. // second uuid, 32bit, [12], [13], [14], [15] is the value
  76. 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //
  77. };
  78. static uint8_t adv_service_uuid128_test[16] = {
  79. /* LSB <--------------------------------------------------------------------------------> MSB */
  80. 0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E, //
  81. };
  82. // static uint16_t set_service_uuid128[32] = {
  83. // 0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0X00,
  84. // };
  85. // The length of adv data must be less than 31 bytes
  86. // static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56};
  87. // adv data
  88. static esp_ble_adv_data_t adv_data = {
  89. .set_scan_rsp = false,
  90. .include_name = true,
  91. .include_txpower = false,
  92. .min_interval = 0x0006, // slave connection min interval, Time = min_interval * 1.25 msec
  93. .max_interval = 0x0010, // slave connection max interval, Time = max_interval * 1.25 msec
  94. .appearance = 0x00,
  95. .manufacturer_len = 0, // TEST_MANUFACTURER_DATA_LEN,
  96. .p_manufacturer_data = NULL, //&test_manufacturer[0],
  97. .service_data_len = 0,
  98. .p_service_data = NULL,
  99. .service_uuid_len = sizeof(adv_service_uuid128),
  100. .p_service_uuid = adv_service_uuid128,
  101. .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
  102. };
  103. // scan response data
  104. static esp_ble_adv_data_t scan_rsp_data = {
  105. .set_scan_rsp = true,
  106. .include_name = true,
  107. .include_txpower = true,
  108. //.min_interval = 0x0006,
  109. //.max_interval = 0x0010,
  110. .appearance = 0x00,
  111. .manufacturer_len = 0, // TEST_MANUFACTURER_DATA_LEN,
  112. .p_manufacturer_data = NULL, //&test_manufacturer[0],
  113. .service_data_len = 0,
  114. .p_service_data = NULL,
  115. .service_uuid_len = sizeof(adv_service_uuid128),
  116. .p_service_uuid = adv_service_uuid128,
  117. .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
  118. };
  119. #endif /* CONFIG_SET_RAW_ADV_DATA */
  120. static esp_ble_adv_params_t adv_params = {
  121. .adv_int_min = 0x20,
  122. .adv_int_max = 0x40,
  123. .adv_type = ADV_TYPE_IND,
  124. .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
  125. //.peer_addr =
  126. //.peer_addr_type =
  127. .channel_map = ADV_CHNL_ALL,
  128. .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
  129. };
  130. #define PROFILE_NUM 2
  131. #define PROFILE_A_APP_ID 0
  132. #define PROFILE_B_APP_ID 1
  133. struct gatts_profile_inst
  134. {
  135. esp_gatts_cb_t gatts_cb;
  136. uint16_t gatts_if;
  137. uint16_t app_id;
  138. uint16_t conn_id;
  139. uint16_t service_handle;
  140. esp_gatt_srvc_id_t service_id;
  141. uint16_t char_handle;
  142. esp_bt_uuid_t char_uuid;
  143. esp_gatt_perm_t perm;
  144. esp_gatt_char_prop_t property;
  145. uint16_t descr_handle;
  146. esp_bt_uuid_t descr_uuid;
  147. };
  148. /* One gatt-based profile one app_id and one gatts_if, this array will store the gatts_if returned by ESP_GATTS_REG_EVT */
  149. static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
  150. [PROFILE_A_APP_ID] = {
  151. .gatts_cb = gatts_profile_a_event_handler,
  152. .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
  153. },
  154. [PROFILE_B_APP_ID] = {
  155. .gatts_cb = gatts_profile_b_event_handler, /* This demo does not implement, similar as profile A */
  156. .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
  157. },
  158. };
  159. typedef struct
  160. {
  161. uint8_t *prepare_buf;
  162. int prepare_len;
  163. } prepare_type_env_t;
  164. static prepare_type_env_t a_prepare_write_env;
  165. static prepare_type_env_t b_prepare_write_env;
  166. 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);
  167. void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param);
  168. /***********************************************************************************************************************
  169. * ****************************************************user_define**************************************************** *
  170. ***********************************************************************************************************************/
  171. typedef struct bluetooth_processer
  172. {
  173. char *bluetooth_processer_rx_buf;
  174. uint8_t bluetooth_processer_rx_buf_size; //
  175. int bluetooth_baundrate_one_packet_delay_ms;
  176. void (*port_delay_ms)(uint64_t us);
  177. char *order; //指令名称
  178. uint8_t index; //
  179. uint8_t speed_level; //
  180. double position; //角度
  181. int direction; //旋转方向
  182. uint8_t code; //错误码
  183. char *info; //错误码信息
  184. char *deviceState; //设备状态
  185. uint8_t deviceException; //设备异常编号
  186. char *deviceExceptionInfo; //设备异常信息
  187. bool cmd_flag;
  188. bool actively_report_flag;
  189. } bluetooth_processer_t;
  190. #define profile_b_buffer_size 100
  191. char bluetooth_rx_buffer[profile_b_buffer_size] = {0};
  192. uint8_t bluetooth_rx_buffer_len = 0;
  193. bool bluetooth_rx_buffer_start_receving = false;
  194. bool bluetooth_rx_buffer_processing = false;
  195. bool flag = true;
  196. uint32_t total = 0;
  197. #define timer_interval_num 10000
  198. #define timer_interval_s (uint32_t)1000000
  199. #define timer_interval_ms (uint32_t)1000
  200. #define timer_interval_us (uint32_t)1
  201. #define kbluetooth_baundrate_one_packet_delay_ms 200
  202. /***********************************************************************************************************************
  203. * **********************************************user_function_statement********************************************** *
  204. ***********************************************************************************************************************/
  205. void buffer_all_init();
  206. void bluetooth_gatts_try_process_data();
  207. void timer_set_pause_and_counter_zero(int group, int timer);
  208. void port_timer_delay_ms(uint64_t delay);
  209. void start_receive_data_to_buffer(uint16_t length, uint8_t *value);
  210. bool parse_rxbuffer_and_validation_data(cJSON **json_tmp);
  211. bluetooth_processer_t s_bluetooth_processer = {
  212. .bluetooth_processer_rx_buf = bluetooth_rx_buffer,
  213. .bluetooth_processer_rx_buf_size = sizeof(bluetooth_rx_buffer),
  214. .bluetooth_baundrate_one_packet_delay_ms = kbluetooth_baundrate_one_packet_delay_ms,
  215. .port_delay_ms = port_timer_delay_ms,
  216. .order = "order",
  217. .index = 0,
  218. .speed_level = 0,
  219. .position = 0.0,
  220. .direction = 0,
  221. .code = 0,
  222. .info = "noerror",
  223. .deviceState = "init",
  224. .deviceException = 0,
  225. .deviceExceptionInfo = "noexception",
  226. .cmd_flag = false,
  227. .actively_report_flag = false,
  228. };
  229. static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
  230. {
  231. switch (event)
  232. {
  233. #ifdef CONFIG_SET_RAW_ADV_DATA
  234. case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT:
  235. adv_config_done &= (~adv_config_flag);
  236. if (adv_config_done == 0)
  237. {
  238. esp_ble_gap_start_advertising(&adv_params);
  239. }
  240. break;
  241. case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT:
  242. adv_config_done &= (~scan_rsp_config_flag);
  243. if (adv_config_done == 0)
  244. {
  245. esp_ble_gap_start_advertising(&adv_params);
  246. }
  247. break;
  248. #else
  249. case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
  250. adv_config_done &= (~adv_config_flag);
  251. if (adv_config_done == 0)
  252. {
  253. esp_ble_gap_start_advertising(&adv_params);
  254. }
  255. break;
  256. case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT:
  257. adv_config_done &= (~scan_rsp_config_flag);
  258. if (adv_config_done == 0)
  259. {
  260. esp_ble_gap_start_advertising(&adv_params);
  261. }
  262. break;
  263. #endif
  264. case ESP_GAP_BLE_ADV_START_COMPLETE_EVT:
  265. // advertising start complete event to indicate advertising start successfully or failed
  266. if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS)
  267. {
  268. ESP_LOGE(GATTS_TAG, "Advertising start failed\n");
  269. }
  270. break;
  271. case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT:
  272. if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS)
  273. {
  274. ESP_LOGE(GATTS_TAG, "Advertising stop failed\n");
  275. }
  276. else
  277. {
  278. ESP_LOGI(GATTS_TAG, "Stop adv successfully\n");
  279. }
  280. break;
  281. case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
  282. ESP_LOGI(GATTS_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d",
  283. param->update_conn_params.status,
  284. param->update_conn_params.min_int,
  285. param->update_conn_params.max_int,
  286. param->update_conn_params.conn_int,
  287. param->update_conn_params.latency,
  288. param->update_conn_params.timeout);
  289. break;
  290. default:
  291. break;
  292. }
  293. }
  294. 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)
  295. {
  296. esp_gatt_status_t status = ESP_GATT_OK;
  297. if (param->write.need_rsp)
  298. {
  299. if (param->write.is_prep)
  300. {
  301. if (prepare_write_env->prepare_buf == NULL)
  302. {
  303. prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t));
  304. prepare_write_env->prepare_len = 0;
  305. if (prepare_write_env->prepare_buf == NULL)
  306. {
  307. ESP_LOGE(GATTS_TAG, "Gatt_server prep no mem\n");
  308. status = ESP_GATT_NO_RESOURCES;
  309. }
  310. }
  311. else
  312. {
  313. if (param->write.offset > PREPARE_BUF_MAX_SIZE)
  314. {
  315. status = ESP_GATT_INVALID_OFFSET;
  316. }
  317. else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE)
  318. {
  319. status = ESP_GATT_INVALID_ATTR_LEN;
  320. }
  321. }
  322. esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t));
  323. gatt_rsp->attr_value.len = param->write.len;
  324. gatt_rsp->attr_value.handle = param->write.handle;
  325. gatt_rsp->attr_value.offset = param->write.offset;
  326. gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
  327. memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len);
  328. esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp);
  329. if (response_err != ESP_OK)
  330. {
  331. ESP_LOGE(GATTS_TAG, "Send response error\n");
  332. }
  333. free(gatt_rsp);
  334. if (status != ESP_GATT_OK)
  335. {
  336. return;
  337. }
  338. memcpy(prepare_write_env->prepare_buf + param->write.offset,
  339. param->write.value,
  340. param->write.len);
  341. prepare_write_env->prepare_len += param->write.len;
  342. }
  343. else
  344. {
  345. esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, NULL);
  346. }
  347. }
  348. }
  349. void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param)
  350. {
  351. if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC)
  352. {
  353. esp_log_buffer_hex(GATTS_TAG, prepare_write_env->prepare_buf, prepare_write_env->prepare_len);
  354. }
  355. else
  356. {
  357. ESP_LOGI(GATTS_TAG, "ESP_GATT_PREP_WRITE_CANCEL");
  358. }
  359. if (prepare_write_env->prepare_buf)
  360. {
  361. free(prepare_write_env->prepare_buf);
  362. prepare_write_env->prepare_buf = NULL;
  363. }
  364. prepare_write_env->prepare_len = 0;
  365. }
  366. 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)
  367. {
  368. switch (event)
  369. {
  370. case ESP_GATTS_REG_EVT:
  371. ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id);
  372. gl_profile_tab[PROFILE_A_APP_ID].service_id.is_primary = true;
  373. gl_profile_tab[PROFILE_A_APP_ID].service_id.id.inst_id = 0x00;
  374. // set unknown service uuid
  375. gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_128;
  376. memcpy(gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  377. // gl_profile_tab[PROFILE_A_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_A;
  378. esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name(TEST_DEVICE_NAME);
  379. if (set_dev_name_ret)
  380. {
  381. ESP_LOGE(GATTS_TAG, "set device name failed, error code = %x", set_dev_name_ret);
  382. }
  383. #ifdef CONFIG_SET_RAW_ADV_DATA
  384. esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data));
  385. if (raw_adv_ret)
  386. {
  387. ESP_LOGE(GATTS_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret);
  388. }
  389. adv_config_done |= adv_config_flag;
  390. esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data));
  391. if (raw_scan_ret)
  392. {
  393. ESP_LOGE(GATTS_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret);
  394. }
  395. adv_config_done |= scan_rsp_config_flag;
  396. #else
  397. // config adv data
  398. esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data);
  399. if (ret)
  400. {
  401. ESP_LOGE(GATTS_TAG, "config adv data failed, error code = %x", ret);
  402. }
  403. adv_config_done |= adv_config_flag;
  404. // config scan response data
  405. ret = esp_ble_gap_config_adv_data(&scan_rsp_data);
  406. if (ret)
  407. {
  408. ESP_LOGE(GATTS_TAG, "config scan response data failed, error code = %x", ret);
  409. }
  410. adv_config_done |= scan_rsp_config_flag;
  411. #endif
  412. esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_A_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_A);
  413. break;
  414. case ESP_GATTS_READ_EVT:
  415. {
  416. 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);
  417. esp_gatt_rsp_t rsp;
  418. memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
  419. rsp.attr_value.handle = param->read.handle;
  420. rsp.attr_value.len = 4;
  421. rsp.attr_value.value[0] = 0x11;
  422. rsp.attr_value.value[1] = 0x22;
  423. rsp.attr_value.value[2] = 0x33;
  424. rsp.attr_value.value[3] = 0x44;
  425. esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
  426. ESP_GATT_OK, &rsp);
  427. break;
  428. }
  429. case ESP_GATTS_WRITE_EVT:
  430. {
  431. // example_write_event_env(gatts_if, &a_prepare_write_env, param);
  432. break;
  433. }
  434. case ESP_GATTS_EXEC_WRITE_EVT:
  435. // ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT");
  436. // esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
  437. // example_exec_write_event_env(&a_prepare_write_env, param);
  438. break;
  439. case ESP_GATTS_MTU_EVT:
  440. // ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu);
  441. break;
  442. case ESP_GATTS_UNREG_EVT:
  443. break;
  444. case ESP_GATTS_CREATE_EVT:
  445. ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle);
  446. gl_profile_tab[PROFILE_A_APP_ID].service_handle = param->create.service_handle;
  447. // Unknown Characteristic uuid
  448. gl_profile_tab[PROFILE_A_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  449. // gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128 = adv_service_uuid128;
  450. memcpy(gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  451. esp_ble_gatts_start_service(gl_profile_tab[PROFILE_A_APP_ID].service_handle);
  452. // a_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
  453. a_property = ESP_GATT_CHAR_PROP_BIT_READ;
  454. 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,
  455. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  456. a_property,
  457. &gatts_demo_char1_val, NULL);
  458. if (add_char_ret)
  459. {
  460. ESP_LOGE(GATTS_TAG, "add char failed, error code =%x", add_char_ret);
  461. }
  462. break;
  463. case ESP_GATTS_ADD_INCL_SRVC_EVT:
  464. break;
  465. case ESP_GATTS_ADD_CHAR_EVT:
  466. {
  467. uint16_t length = 0;
  468. const uint8_t *prf_char;
  469. ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n",
  470. param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle);
  471. gl_profile_tab[PROFILE_A_APP_ID].char_handle = param->add_char.attr_handle;
  472. gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.len = ESP_UUID_LEN_128;
  473. memcpy(gl_profile_tab[PROFILE_A_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  474. esp_err_t get_attr_ret = esp_ble_gatts_get_attr_value(param->add_char.attr_handle, &length, &prf_char);
  475. if (get_attr_ret == ESP_FAIL)
  476. {
  477. ESP_LOGE(GATTS_TAG, "ILLEGAL HANDLE");
  478. }
  479. ESP_LOGI(GATTS_TAG, "the gatts demo char length = %x\n", length);
  480. for (int i = 0; i < length; i++)
  481. {
  482. ESP_LOGI(GATTS_TAG, "prf_char[%x] =%x\n", i, prf_char[i]);
  483. }
  484. 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,
  485. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, NULL, NULL);
  486. if (add_descr_ret)
  487. {
  488. ESP_LOGE(GATTS_TAG, "add char descr failed, error code =%x", add_descr_ret);
  489. }
  490. break;
  491. }
  492. case ESP_GATTS_ADD_CHAR_DESCR_EVT:
  493. gl_profile_tab[PROFILE_A_APP_ID].descr_handle = param->add_char_descr.attr_handle;
  494. ESP_LOGI(GATTS_TAG, "ADD_DESCR_EVT, status %d, attr_handle %d, service_handle %d\n",
  495. param->add_char_descr.status, param->add_char_descr.attr_handle, param->add_char_descr.service_handle);
  496. break;
  497. case ESP_GATTS_DELETE_EVT:
  498. break;
  499. case ESP_GATTS_START_EVT:
  500. ESP_LOGI(GATTS_TAG, "SERVICE_START_EVT, status %d, service_handle %d\n",
  501. param->start.status, param->start.service_handle);
  502. break;
  503. case ESP_GATTS_STOP_EVT:
  504. break;
  505. case ESP_GATTS_CONNECT_EVT:
  506. {
  507. esp_ble_conn_update_params_t conn_params = {0};
  508. memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t));
  509. /* For the IOS system, please reference the apple official documents about the ble connection parameters restrictions. */
  510. conn_params.latency = 0;
  511. conn_params.max_int = 0x20; // max_int = 0x20*1.25ms = 40ms
  512. conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms
  513. conn_params.timeout = 400; // timeout = 400*10ms = 4000ms
  514. ESP_LOGI(GATTS_TAG, "ESP_GATTS_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_A_APP_ID].conn_id = param->connect.conn_id;
  519. // start sent the update connection parameters to the peer device.
  520. esp_ble_gap_update_conn_params(&conn_params);
  521. break;
  522. }
  523. case ESP_GATTS_DISCONNECT_EVT:
  524. // ESP_LOGI(GATTS_TAG, "ESP_GATTS_DISCONNECT_EVT, disconnect reason 0x%x", param->disconnect.reason);
  525. // esp_ble_gap_start_advertising(&adv_params);
  526. break;
  527. case ESP_GATTS_CONF_EVT:
  528. // ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT, status %d attr_handle %d", param->conf.status, param->conf.handle);
  529. // if (param->conf.status != ESP_GATT_OK){
  530. // esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len);
  531. // }
  532. break;
  533. case ESP_GATTS_OPEN_EVT:
  534. case ESP_GATTS_CANCEL_OPEN_EVT:
  535. case ESP_GATTS_CLOSE_EVT:
  536. case ESP_GATTS_LISTEN_EVT:
  537. case ESP_GATTS_CONGEST_EVT:
  538. default:
  539. break;
  540. }
  541. }
  542. 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)
  543. {
  544. switch (event)
  545. {
  546. case ESP_GATTS_REG_EVT:
  547. ESP_LOGI(GATTS_TAG, "REGISTER_APP_EVT, status %d, app_id %d\n", param->reg.status, param->reg.app_id);
  548. gl_profile_tab[PROFILE_B_APP_ID].service_id.is_primary = true;
  549. gl_profile_tab[PROFILE_B_APP_ID].service_id.id.inst_id = 0x00;
  550. // gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.len = ESP_UUID_LEN_16;
  551. // gl_profile_tab[PROFILE_B_APP_ID].service_id.id.uuid.uuid.uuid16 = GATTS_SERVICE_UUID_TEST_B;
  552. gl_profile_tab[PROFILE_B_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  553. memcpy(gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  554. esp_ble_gatts_create_service(gatts_if, &gl_profile_tab[PROFILE_B_APP_ID].service_id, GATTS_NUM_HANDLE_TEST_B);
  555. break;
  556. case ESP_GATTS_READ_EVT:
  557. {
  558. // 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);
  559. // esp_gatt_rsp_t rsp;
  560. // memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
  561. // rsp.attr_value.handle = param->read.handle;
  562. // rsp.attr_value.len = 4;
  563. // rsp.attr_value.value[0] = 0xde;
  564. // rsp.attr_value.value[1] = 0xed;
  565. // rsp.attr_value.value[2] = 0xbe;
  566. // rsp.attr_value.value[3] = 0xef;
  567. // esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
  568. // ESP_GATT_OK, &rsp);
  569. break;
  570. }
  571. case ESP_GATTS_WRITE_EVT:
  572. {
  573. 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);
  574. if (!param->write.is_prep)
  575. {
  576. ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
  577. esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
  578. start_receive_data_to_buffer(param->write.len, param->write.value);
  579. // for (int i = 0; i < param->write.len; i++)
  580. // {
  581. // bluetooth_rx_buffer[bluetooth_rx_buffer_len++] = param->write.value[i];
  582. // }
  583. }
  584. example_write_event_env(gatts_if, &b_prepare_write_env, param);
  585. break;
  586. }
  587. case ESP_GATTS_EXEC_WRITE_EVT:
  588. // ESP_LOGI(GATTS_TAG,"ESP_GATTS_EXEC_WRITE_EVT");
  589. // esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
  590. // example_exec_write_event_env(&b_prepare_write_env, param);
  591. break;
  592. case ESP_GATTS_MTU_EVT:
  593. // ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu);
  594. break;
  595. case ESP_GATTS_UNREG_EVT:
  596. break;
  597. case ESP_GATTS_CREATE_EVT:
  598. ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d, service_handle %d\n", param->create.status, param->create.service_handle);
  599. gl_profile_tab[PROFILE_B_APP_ID].service_handle = param->create.service_handle;
  600. // set profile b characteristic
  601. gl_profile_tab[PROFILE_B_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
  602. // gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_B;
  603. memcpy(gl_profile_tab[PROFILE_B_APP_ID].char_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  604. esp_ble_gatts_start_service(gl_profile_tab[PROFILE_B_APP_ID].service_handle);
  605. // b_property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
  606. b_property = ESP_GATT_CHAR_PROP_BIT_WRITE;
  607. 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,
  608. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  609. b_property,
  610. NULL, NULL);
  611. if (add_char_ret)
  612. {
  613. ESP_LOGE(GATTS_TAG, "add char failed, error code =%x", add_char_ret);
  614. }
  615. break;
  616. case ESP_GATTS_ADD_INCL_SRVC_EVT:
  617. break;
  618. case ESP_GATTS_ADD_CHAR_EVT:
  619. ESP_LOGI(GATTS_TAG, "ADD_CHAR_EVT, status %d, attr_handle %d, service_handle %d\n",
  620. param->add_char.status, param->add_char.attr_handle, param->add_char.service_handle);
  621. gl_profile_tab[PROFILE_B_APP_ID].char_handle = param->add_char.attr_handle;
  622. gl_profile_tab[PROFILE_B_APP_ID].descr_uuid.len = ESP_UUID_LEN_128;
  623. memcpy(gl_profile_tab[PROFILE_B_APP_ID].descr_uuid.uuid.uuid128, adv_service_uuid128_test, 16);
  624. esp_ble_gatts_add_char_descr(gl_profile_tab[PROFILE_B_APP_ID].service_handle, &gl_profile_tab[PROFILE_B_APP_ID].descr_uuid,
  625. ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
  626. NULL, NULL);
  627. break;
  628. case ESP_GATTS_ADD_CHAR_DESCR_EVT:
  629. gl_profile_tab[PROFILE_B_APP_ID].descr_handle = param->add_char_descr.attr_handle;
  630. ESP_LOGI(GATTS_TAG, "ADD_DESCR_EVT, status %d, attr_handle %d, service_handle %d\n",
  631. param->add_char_descr.status, param->add_char_descr.attr_handle, param->add_char_descr.service_handle);
  632. break;
  633. case ESP_GATTS_DELETE_EVT:
  634. break;
  635. case ESP_GATTS_START_EVT:
  636. ESP_LOGI(GATTS_TAG, "SERVICE_START_EVT, status %d, service_handle %d\n",
  637. param->start.status, param->start.service_handle);
  638. break;
  639. case ESP_GATTS_STOP_EVT:
  640. break;
  641. case ESP_GATTS_CONNECT_EVT:
  642. ESP_LOGI(GATTS_TAG, "CONNECT_EVT, conn_id %d, remote %02x:%02x:%02x:%02x:%02x:%02x:",
  643. param->connect.conn_id,
  644. param->connect.remote_bda[0], param->connect.remote_bda[1], param->connect.remote_bda[2],
  645. param->connect.remote_bda[3], param->connect.remote_bda[4], param->connect.remote_bda[5]);
  646. gl_profile_tab[PROFILE_B_APP_ID].conn_id = param->connect.conn_id;
  647. break;
  648. case ESP_GATTS_CONF_EVT:
  649. ESP_LOGI(GATTS_TAG, "ESP_GATTS_CONF_EVT status %d attr_handle %d", param->conf.status, param->conf.handle);
  650. if (param->conf.status != ESP_GATT_OK)
  651. {
  652. esp_log_buffer_hex(GATTS_TAG, param->conf.value, param->conf.len);
  653. }
  654. break;
  655. case ESP_GATTS_DISCONNECT_EVT:
  656. case ESP_GATTS_OPEN_EVT:
  657. case ESP_GATTS_CANCEL_OPEN_EVT:
  658. case ESP_GATTS_CLOSE_EVT:
  659. case ESP_GATTS_LISTEN_EVT:
  660. case ESP_GATTS_CONGEST_EVT:
  661. default:
  662. break;
  663. }
  664. }
  665. static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
  666. {
  667. /* If event is register event, store the gatts_if for each profile */
  668. if (event == ESP_GATTS_REG_EVT)
  669. {
  670. if (param->reg.status == ESP_GATT_OK)
  671. {
  672. gl_profile_tab[param->reg.app_id].gatts_if = gatts_if;
  673. }
  674. else
  675. {
  676. ESP_LOGI(GATTS_TAG, "Reg app failed, app_id %04x, status %d\n",
  677. param->reg.app_id,
  678. param->reg.status);
  679. return;
  680. }
  681. }
  682. /* If the gatts_if equal to profile A, call profile A cb handler,
  683. * so here call each profile's callback */
  684. do
  685. {
  686. int idx;
  687. for (idx = 0; idx < PROFILE_NUM; idx++)
  688. {
  689. if (gatts_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */
  690. gatts_if == gl_profile_tab[idx].gatts_if)
  691. {
  692. if (gl_profile_tab[idx].gatts_cb)
  693. {
  694. gl_profile_tab[idx].gatts_cb(event, gatts_if, param);
  695. }
  696. }
  697. }
  698. } while (0);
  699. }
  700. /***********************************************************************************************************************
  701. * *******************************************************timer******************************************************* *
  702. ***********************************************************************************************************************/
  703. // static bool IRAM_ATTR timer_group_isr_callback(void *args)
  704. // {
  705. // bluetooth_rx_buffer_start_receving = true;
  706. // return pdFALSE;
  707. // }
  708. static void timer_group_init(int group, int timer, bool auto_reload, int timer_interval, uint32_t timer_unit_time)
  709. {
  710. /* Select and initialize basic parameters of the timer */
  711. timer_config_t config = {
  712. .divider = 80,
  713. .counter_dir = TIMER_COUNT_UP,
  714. .counter_en = TIMER_PAUSE,
  715. .alarm_en = TIMER_ALARM_EN,
  716. .auto_reload = auto_reload,
  717. }; // default clock source is APB
  718. timer_init(group, timer, &config);
  719. /* Timer's counter will initially start from value below.
  720. Also, if auto_reload is set, this value will be automatically reload on alarm */
  721. timer_set_counter_value(group, timer, 0); //指定定时器首个计数值为0
  722. //检查定时器的当前值,调用函数 timer_get_counter_value() 或 timer_get_counter_time_sec()。
  723. //可通过调用函数 timer_pause() 随时暂停定时器。要再次启动它,调用函数 timer_start()。
  724. /* Configure the alarm value and the interrupt on alarm. */
  725. timer_set_alarm_value(group, timer, timer_interval * ((80 * timer_unit_time) / 80));
  726. timer_enable_intr(group, timer);
  727. // timer_isr_callback_add(group, timer, timer_group_isr_callback, NULL, 0);
  728. // timer_start(group, timer);
  729. timer_pause(group, timer);
  730. }
  731. /***********************************************************************************************************************
  732. * *******************************************************main******************************************************** *
  733. ***********************************************************************************************************************/
  734. void app_main(void)
  735. {
  736. esp_err_t ret;
  737. // timer_group_init(TIMER_GROUP_0, TIMER_0, false, timer_interval_num, timer_interval_ms);
  738. timer_group_init(TIMER_GROUP_0, TIMER_0, false, timer_interval_num, timer_interval_ms);
  739. // Initialize NVS.
  740. ret = nvs_flash_init();
  741. if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  742. {
  743. ESP_ERROR_CHECK(nvs_flash_erase());
  744. ret = nvs_flash_init();
  745. }
  746. ESP_ERROR_CHECK(ret);
  747. ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
  748. esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
  749. ret = esp_bt_controller_init(&bt_cfg);
  750. if (ret)
  751. {
  752. ESP_LOGE(GATTS_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
  753. return;
  754. }
  755. ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
  756. if (ret)
  757. {
  758. ESP_LOGE(GATTS_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
  759. return;
  760. }
  761. ret = esp_bluedroid_init();
  762. if (ret)
  763. {
  764. ESP_LOGE(GATTS_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  765. return;
  766. }
  767. ret = esp_bluedroid_enable();
  768. if (ret)
  769. {
  770. ESP_LOGE(GATTS_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
  771. return;
  772. }
  773. ret = esp_ble_gatts_register_callback(gatts_event_handler);
  774. if (ret)
  775. {
  776. ESP_LOGE(GATTS_TAG, "gatts register error, error code = %x", ret);
  777. return;
  778. }
  779. ret = esp_ble_gap_register_callback(gap_event_handler);
  780. if (ret)
  781. {
  782. ESP_LOGE(GATTS_TAG, "gap register error, error code = %x", ret);
  783. return;
  784. }
  785. ret = esp_ble_gatts_app_register(PROFILE_A_APP_ID);
  786. if (ret)
  787. {
  788. ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret);
  789. return;
  790. }
  791. ret = esp_ble_gatts_app_register(PROFILE_B_APP_ID);
  792. if (ret)
  793. {
  794. ESP_LOGE(GATTS_TAG, "gatts app register error, error code = %x", ret);
  795. return;
  796. }
  797. esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);
  798. if (local_mtu_ret)
  799. {
  800. ESP_LOGE(GATTS_TAG, "set local MTU failed, error code = %x", local_mtu_ret);
  801. }
  802. while (true)
  803. {
  804. bluetooth_gatts_try_process_data();
  805. }
  806. return;
  807. }
  808. /***********************************************************************************************************************
  809. * *************************************************user_funtion_def************************************************** *
  810. ***********************************************************************************************************************/
  811. void buffer_all_init()
  812. {
  813. bluetooth_rx_buffer_len = 0;
  814. memset(bluetooth_rx_buffer, 0, profile_b_buffer_size);
  815. }
  816. void timer_set_pause_and_counter_zero(int group, int timer)
  817. {
  818. timer_pause(group, timer);
  819. timer_set_counter_value(group, timer, 0);
  820. }
  821. bool validation_param(cJSON *object, char *param)
  822. {
  823. cJSON *current_element = object->child;
  824. while (current_element->string != NULL)
  825. {
  826. if (current_element->string == param)
  827. {
  828. return true;
  829. }
  830. current_element = current_element->next;
  831. }
  832. return false;
  833. }
  834. void bluetooth_gatts_try_process_data()
  835. {
  836. cJSON *json_tmp;
  837. cJSON *ch;
  838. //开始接收
  839. if (bluetooth_rx_buffer_start_receving)
  840. {
  841. //开启定时器
  842. s_bluetooth_processer.port_delay_ms(s_bluetooth_processer.bluetooth_baundrate_one_packet_delay_ms);
  843. // port_timer_delay_ms(kbluetooth_baundrate_one_packet_delay_ms);
  844. bluetooth_rx_buffer_processing = true;
  845. //打印输出
  846. // ESP_LOGI(GATTS_TAG, "%s", s_bluetooth_processer.bluetooth_processer_rx_buf);
  847. //验证解析数据是否正确
  848. if (!parse_rxbuffer_and_validation_data(&json_tmp))
  849. {
  850. return;
  851. }
  852. ch = json_tmp->child;
  853. while (ch != NULL)
  854. {
  855. ESP_LOGI(GATTS_TAG, "%s", ch->string);
  856. if (strcmp(ch->string, "order") == 0)
  857. {
  858. s_bluetooth_processer.order = ch->valuestring;
  859. }
  860. if (strcmp(ch->string, "index") == 0)
  861. {
  862. s_bluetooth_processer.index = ch->valueint;
  863. }
  864. if (strcmp(ch->string, "speedLevel") == 0)
  865. {
  866. s_bluetooth_processer.speed_level = ch->valueint;
  867. }
  868. if (strcmp(ch->string, "position") == 0)
  869. {
  870. s_bluetooth_processer.position = ch->valuedouble;
  871. }
  872. if (strcmp(ch->string, "direction") == 0)
  873. {
  874. s_bluetooth_processer.direction = ch->valueint;
  875. }
  876. ch = ch->next;
  877. }
  878. ESP_LOGI(GATTS_TAG, "order:%s ,index:%d speedLevel:%d position:%f direction:%d", s_bluetooth_processer.order, s_bluetooth_processer.index, s_bluetooth_processer.speed_level, s_bluetooth_processer.position, s_bluetooth_processer.direction);
  879. //释放空间
  880. cJSON_Delete(json_tmp);
  881. // buffer置0
  882. buffer_all_init();
  883. //未在处理数据
  884. bluetooth_rx_buffer_start_receving = false;
  885. bluetooth_rx_buffer_processing = false;
  886. }
  887. }
  888. void port_timer_delay_ms(uint64_t delay)
  889. {
  890. uint64_t timer_count = 0;
  891. timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0);
  892. timer_start(TIMER_GROUP_0, TIMER_0);
  893. while (timer_count < (delay * 1000))
  894. {
  895. timer_get_counter_value(TIMER_GROUP_0, TIMER_0, &timer_count);
  896. }
  897. timer_pause(TIMER_GROUP_0, TIMER_0);
  898. }
  899. void start_receive_data_to_buffer(uint16_t length, uint8_t *value)
  900. {
  901. bluetooth_rx_buffer_start_receving = true;
  902. timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0);
  903. //判断是否buffer越界
  904. if ((length + bluetooth_rx_buffer_len) > profile_b_buffer_size)
  905. {
  906. return;
  907. }
  908. if (!bluetooth_rx_buffer_processing)
  909. {
  910. //写入到buffer
  911. for (int i = 0; i < length; i++)
  912. {
  913. bluetooth_rx_buffer[bluetooth_rx_buffer_len++] = value[i];
  914. }
  915. }
  916. }
  917. bool parse_rxbuffer_and_validation_data(cJSON **json_tmp)
  918. {
  919. *json_tmp = cJSON_Parse(&bluetooth_rx_buffer[0]);
  920. if (*json_tmp == NULL)
  921. {
  922. ESP_LOGE("ERROR", "json_tmp null");
  923. cJSON_Delete(*json_tmp);
  924. buffer_all_init();
  925. bluetooth_rx_buffer_start_receving = false;
  926. bluetooth_rx_buffer_processing = false;
  927. return false;
  928. }
  929. return true;
  930. }