Browse Source

解析数据封装

devtest
zwsd 3 years ago
parent
commit
a662b6c3e7
  1. 3
      .vscode/settings.json
  2. 1
      main/CMakeLists.txt
  3. 137
      main/ble_parse_data.c
  4. 46
      main/ble_parse_data.h
  5. 1091
      main/ble_spp_server_demo.c
  6. 52
      main/ble_spp_server_demo.h
  7. 135
      main/main.c

3
.vscode/settings.json

@ -20,6 +20,7 @@
"esp_bt_main.h": "c",
"esp_gatts_api.h": "c",
"freertos.h": "c",
"regex": "c"
"regex": "c",
"ble_parse_data.h": "c"
},
}

1
main/CMakeLists.txt

@ -3,6 +3,7 @@ idf_component_register(SRCS #
"ble_spp_server_demo.c"
"main.c"
"timer_u.c"
"ble_parse_data.c"
INCLUDE_DIRS #
"../dep/"
".")

137
main/ble_parse_data.c

@ -0,0 +1,137 @@
#include "ble_parse_data.h"
#define GATTS_TABLE_TAG "GATTS_SPP_DEMO"
#define cmd_length_set_position 5
#define cmd_length_get_status 2
static bluetooth_processer_t *parse_bluetooth_processer;
uint8_t bluetooth_rx_buffer_len = 0;
bool test_flag;
void constructor_bluetooth_processer(bluetooth_processer_t *bluetooth_processer) { parse_bluetooth_processer = bluetooth_processer; }
void bluetooth_gatts_try_process_data() {
cJSON *json_tmp;
// cJSON *ch;
//
if (parse_bluetooth_processer->bluetooth_rx_buffer_start_receving) {
//
parse_bluetooth_processer->port_delay_ms(parse_bluetooth_processer->bluetooth_baundrate_one_packet_delay_ms);
// port_timer_delay_ms(kbluetooth_baundrate_one_packet_delay_ms);
parse_bluetooth_processer->bluetooth_rx_buffer_processing = true;
//
// ESP_LOGI(GATTS_TABLE_TAG, "%s", parse_bluetooth_processer->bluetooth_processer_rx_buf);
//
if (parse_rxbuffer_and_validation_data(&json_tmp)) {
// JSON解析到结构体order更改表示有指令传输进来(cmd_flag)true
if (parse_json_to_struct(json_tmp->child)) {
ESP_LOGI(GATTS_TABLE_TAG, "order:%s ,index:%d speedLevel:%d position:%f direction:%d", parse_bluetooth_processer->order, parse_bluetooth_processer->index,
parse_bluetooth_processer->speedLevel, parse_bluetooth_processer->position, parse_bluetooth_processer->direction);
if (strcmp(parse_bluetooth_processer->order, set_position) == 0) {
ESP_LOGI(GATTS_TABLE_TAG, set_position);
// motor_cmd_set_position(parse_bluetooth_processer->speedLevel, parse_bluetooth_processer->position, parse_bluetooth_processer->direction);
// receipt_json_set_position();
}
if (strcmp(parse_bluetooth_processer->order, get_status) == 0) {
ESP_LOGI(GATTS_TABLE_TAG, get_status);
test_flag = true;
// receipt_json_get_status();
}
// if (strcmp(parse_bluetooth_processer->order, "deviceStatusReport") == 0)
// {
// ESP_LOGI(GATTS_TABLE_TAG, "deviceStatusReport");
// }
parse_bluetooth_processer->actively_report_flag = true;
}
}
//
cJSON_Delete(json_tmp);
// buffer置0
buffer_all_init();
//
parse_bluetooth_processer->cmd_flag = false;
parse_bluetooth_processer->bluetooth_rx_buffer_start_receving = false;
parse_bluetooth_processer->bluetooth_rx_buffer_processing = false;
}
}
void start_receive_data_to_buffer(uint16_t length, uint8_t *value) {
parse_bluetooth_processer->bluetooth_rx_buffer_start_receving = true;
timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0);
//buffer越界
if ((length + bluetooth_rx_buffer_len) > profile_b_buffer_size) {
return;
}
if (!parse_bluetooth_processer->bluetooth_rx_buffer_processing) {
//buffer
for (int i = 0; i < length; i++) {
parse_bluetooth_processer->bluetooth_processer_rx_buf[bluetooth_rx_buffer_len++] = value[i];
}
}
}
void buffer_all_init() {
bluetooth_rx_buffer_len = 0;
memset(parse_bluetooth_processer->bluetooth_processer_rx_buf, 0, profile_b_buffer_size);
}
bool parse_rxbuffer_and_validation_data(cJSON **json_tmp) {
*json_tmp = cJSON_Parse(parse_bluetooth_processer->bluetooth_processer_rx_buf);
if (*json_tmp == NULL) {
ESP_LOGE(GATTS_TABLE_TAG, "parse rxbuffer null or redundant symbol ',','{' ");
return false;
}
return true;
}
bool parse_json_to_struct(cJSON *ch) {
uint8_t cmd_length = 0;
while (ch != NULL) {
// ESP_LOGI(GATTS_TABLE_TAG, "%s", ch->string);
if (strcmp(ch->string, "order") == 0) {
parse_bluetooth_processer->order = ch->valuestring;
if (strcmp(ch->valuestring, set_position) == 0) {
cmd_length = cmd_length_set_position;
}
if (strcmp(ch->valuestring, get_status) == 0) {
cmd_length = cmd_length_get_status;
}
// if (strcmp(ch->valuestring, "deviceStatusReport") == 0)
// {
// cmd_length = cmd_length_device_status_report;
// }
cmd_length--;
}
if (strcmp(ch->string, "index") == 0) {
parse_bluetooth_processer->index = ch->valueint;
cmd_length--;
}
if (strcmp(ch->string, "speedLevel") == 0) {
parse_bluetooth_processer->speedLevel = ch->valueint;
cmd_length--;
}
if (strcmp(ch->string, "position") == 0) {
parse_bluetooth_processer->position = ch->valuedouble;
cmd_length--;
}
if (strcmp(ch->string, "direction") == 0) {
parse_bluetooth_processer->direction = ch->valueint;
cmd_length--;
}
ch = ch->next;
}
if (cmd_length == 0) {
parse_bluetooth_processer->cmd_flag = true;
} else {
ESP_LOGE(GATTS_TABLE_TAG, "JSON directive missing or exceeded");
}
return parse_bluetooth_processer->cmd_flag;
}

46
main/ble_parse_data.h

@ -0,0 +1,46 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
#include "cJSON_Utils.h"
#include "driver/timer.h"
#include "esp_log.h"
#define profile_b_buffer_size 128
#define set_position "setPosition"
#define get_status "getStatus"
typedef struct bluetooth_processer {
char *bluetooth_processer_rx_buf;
uint8_t bluetooth_processer_rx_buf_size; //
int bluetooth_baundrate_one_packet_delay_ms;
void (*port_delay_ms)(uint64_t us);
bool bluetooth_rx_buffer_start_receving;
bool bluetooth_rx_buffer_processing;
char *order; //
int index; //
int speedLevel; //
double position; //
int direction; //
int code; //
char *info; //
char *deviceState; //
int deviceException; //
char *deviceExceptionInfo; //
bool cmd_flag;
bool actively_report_flag;
} bluetooth_processer_t;
void constructor_bluetooth_processer(bluetooth_processer_t *bluetooth_processer);
void bluetooth_gatts_try_process_data();
void start_receive_data_to_buffer(uint16_t length, uint8_t *value);
void buffer_all_init();
bool parse_rxbuffer_and_validation_data(cJSON **json_tmp);
bool parse_json_to_struct(cJSON *ch);

1091
main/ble_spp_server_demo.c
File diff suppressed because it is too large
View File

52
main/ble_spp_server_demo.h

@ -10,11 +10,19 @@
#include <stdlib.h>
#include <string.h>
#include "driver/timer.h"
#include "cJSON.h"
#include "cJSON_Utils.h"
#define GATTS_TABLE_TAG "GATTS_SPP_DEMO"
#include "ble_parse_data.h"
#include "driver/uart.h"
#include "esp_bt.h"
#include "esp_bt_defs.h"
#include "esp_bt_main.h"
#include "esp_gap_ble_api.h"
#include "esp_gatts_api.h"
#include "esp_log.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "nvs_flash.h"
/*
* DEFINES
@ -55,36 +63,4 @@ enum {
SPP_IDX_NB,
};
#define profile_b_buffer_size 128
typedef struct bluetooth_processer
{
char *bluetooth_processer_rx_buf;
uint8_t bluetooth_processer_rx_buf_size; //
int bluetooth_baundrate_one_packet_delay_ms;
void (*port_delay_ms)(uint64_t us);
bool bluetooth_rx_buffer_start_receving;
bool bluetooth_rx_buffer_processing;
char *order; //
int index; //
int speedLevel; //
double position; //
int direction; //
int code; //
char *info; //
char *deviceState; //
int deviceException; //
char *deviceExceptionInfo; //
bool cmd_flag;
bool actively_report_flag;
} bluetooth_processer_t;
void ble_spp_server_demo_app_main(uint16_t *conn_id_ble, esp_gatt_if_t *gatts_if_ble, uint16_t *handle_ble, bluetooth_processer_t *bluetooth_processer);
void start_receive_data_to_buffer(uint16_t length, uint8_t *value);
void buffer_all_init();
void ble_spp_server_demo_app_main(uint16_t *conn_id_ble, esp_gatt_if_t *gatts_if_ble, uint16_t *handle_ble, bluetooth_processer_t *bluetooth_processer);

135
main/main.c

@ -11,24 +11,14 @@
#include "ble_spp_server_demo.h"
#include "timer_u.h"
#define set_position "setPosition"
#define get_status "getStatus"
#define GATTS_TABLE_TAG "GATTS_SPP_DEMO"
uint16_t table_conn_id_m;
esp_gatt_if_t table_gatts_if_m;
uint16_t table_handle_m;
#define cmd_length_set_position 5
#define cmd_length_get_status 2
bool test_flag;
static char bluetooth_tx_buffer[profile_b_buffer_size] = {0};
/***********************************************************************************************************************
* ****************************************************user_define**************************************************** *
***********************************************************************************************************************/
char bluetooth_rx_buffer[profile_b_buffer_size] = {0};
// ble_gatts_str_t ble_gatts_a_str = {
@ -37,13 +27,6 @@ char bluetooth_rx_buffer[profile_b_buffer_size] = {0};
// .send_gatts_if = 0,
// };
/***********************************************************************************************************************
* **********************************************user_function_statement********************************************** *
***********************************************************************************************************************/
void bluetooth_gatts_try_process_data();
bool parse_rxbuffer_and_validation_data(cJSON **json_tmp);
bool parse_json_to_struct(cJSON *ch);
void receipt_json_set_position();
void receipt_json_get_status();
void bluetooth_rx_buffer_format_receipt();
@ -75,6 +58,7 @@ bluetooth_processer_t s_bluetooth_processer = {
};
void app_main(void) {
constructor_bluetooth_processer(&s_bluetooth_processer);
// ble_spp_server_demo_app_main(&table_conn_id_m, &table_gatts_if_m, &table_handle_m);
// table_conn_id_m =
// char temp_buffer[5] = {'1', '2', '3', '4', '5'};
@ -90,14 +74,6 @@ void app_main(void) {
ble_spp_server_demo_app_main(&table_conn_id_m, &table_gatts_if_m, &table_handle_m, &s_bluetooth_processer);
timer_group_init(TIMER_GROUP_0, TIMER_0, false, timer_group0_interval_num, timer_interval_ms);
while (true) {
// ESP_LOGI("test", "%d,%d,%d", strlen(bluetooth_tx_buffer), 89 / 15, 99 / 15);
// ESP_LOGI("test", "%d,%d,%d", table_conn_id_m, table_gatts_if_m, table_handle_m);
// if (table_handle_m != 0 && test_flag == true) {
// ets_delay_us(6000000);
// bluetooth_rx_buffer_send_indicate();
// test_flag = false;
// }
bluetooth_gatts_try_process_data();
if (s_bluetooth_processer.actively_report_flag) {
receipt_json_get_status();
@ -108,9 +84,6 @@ void app_main(void) {
return;
}
/***********************************************************************************************************************
* *************************************************user_funtion_def************************************************** *
***********************************************************************************************************************/
bool validation_param(cJSON *object, char *param) {
cJSON *current_element = object->child;
@ -123,110 +96,6 @@ bool validation_param(cJSON *object, char *param) {
return false;
}
void bluetooth_gatts_try_process_data() {
cJSON *json_tmp;
// cJSON *ch;
//
if (s_bluetooth_processer.bluetooth_rx_buffer_start_receving) {
//
s_bluetooth_processer.port_delay_ms(s_bluetooth_processer.bluetooth_baundrate_one_packet_delay_ms);
// port_timer_delay_ms(kbluetooth_baundrate_one_packet_delay_ms);
s_bluetooth_processer.bluetooth_rx_buffer_processing = true;
//
// ESP_LOGI(GATTS_TABLE_TAG, "%s", s_bluetooth_processer.bluetooth_processer_rx_buf);
//
if (parse_rxbuffer_and_validation_data(&json_tmp)) {
// JSON解析到结构体order更改表示有指令传输进来(cmd_flag)true
if (parse_json_to_struct(json_tmp->child)) {
ESP_LOGI(GATTS_TABLE_TAG, "order:%s ,index:%d speedLevel:%d position:%f direction:%d", s_bluetooth_processer.order, s_bluetooth_processer.index, s_bluetooth_processer.speedLevel,
s_bluetooth_processer.position, s_bluetooth_processer.direction);
if (strcmp(s_bluetooth_processer.order, set_position) == 0) {
ESP_LOGI(GATTS_TABLE_TAG, set_position);
// motor_cmd_set_position(s_bluetooth_processer.speedLevel, s_bluetooth_processer.position, s_bluetooth_processer.direction);
// receipt_json_set_position();
}
if (strcmp(s_bluetooth_processer.order, get_status) == 0) {
ESP_LOGI(GATTS_TABLE_TAG, get_status);
test_flag = true;
// receipt_json_get_status();
}
// if (strcmp(s_bluetooth_processer.order, "deviceStatusReport") == 0)
// {
// ESP_LOGI(GATTS_TABLE_TAG, "deviceStatusReport");
// }
s_bluetooth_processer.actively_report_flag = true;
}
}
//
cJSON_Delete(json_tmp);
// buffer置0
buffer_all_init();
//
s_bluetooth_processer.cmd_flag = false;
s_bluetooth_processer.bluetooth_rx_buffer_start_receving = false;
s_bluetooth_processer.bluetooth_rx_buffer_processing = false;
}
}
bool parse_rxbuffer_and_validation_data(cJSON **json_tmp) {
*json_tmp = cJSON_Parse(&bluetooth_rx_buffer[0]);
if (*json_tmp == NULL) {
ESP_LOGE(GATTS_TABLE_TAG, "parse rxbuffer nil or redundant symbol ',' ");
return false;
}
return true;
}
bool parse_json_to_struct(cJSON *ch) {
uint8_t cmd_length = 0;
while (ch != NULL) {
// ESP_LOGI(GATTS_TABLE_TAG, "%s", ch->string);
if (strcmp(ch->string, "order") == 0) {
s_bluetooth_processer.order = ch->valuestring;
if (strcmp(ch->valuestring, set_position) == 0) {
cmd_length = cmd_length_set_position;
}
if (strcmp(ch->valuestring, get_status) == 0) {
cmd_length = cmd_length_get_status;
}
// if (strcmp(ch->valuestring, "deviceStatusReport") == 0)
// {
// cmd_length = cmd_length_device_status_report;
// }
cmd_length--;
}
if (strcmp(ch->string, "index") == 0) {
s_bluetooth_processer.index = ch->valueint;
cmd_length--;
}
if (strcmp(ch->string, "speedLevel") == 0) {
s_bluetooth_processer.speedLevel = ch->valueint;
cmd_length--;
}
if (strcmp(ch->string, "position") == 0) {
s_bluetooth_processer.position = ch->valuedouble;
cmd_length--;
}
if (strcmp(ch->string, "direction") == 0) {
s_bluetooth_processer.direction = ch->valueint;
cmd_length--;
}
ch = ch->next;
}
if (cmd_length == 0) {
s_bluetooth_processer.cmd_flag = true;
} else {
ESP_LOGE(GATTS_TABLE_TAG, "JSON directive missing or exceeded");
}
return s_bluetooth_processer.cmd_flag;
}
void receipt_json_set_position() {
cJSON *pRoot = cJSON_CreateObject(); //
if (!pRoot) {

Loading…
Cancel
Save