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.
197 lines
6.1 KiB
197 lines
6.1 KiB
#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"
|
|
#include "string.h"
|
|
|
|
//
|
|
#include "ble_spp_server_demo.h"
|
|
#include "timer_u.h"
|
|
|
|
#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;
|
|
|
|
static char bluetooth_tx_buffer[profile_b_buffer_size] = {0};
|
|
|
|
char bluetooth_rx_buffer[profile_b_buffer_size] = {0};
|
|
|
|
// ble_gatts_str_t ble_gatts_a_str = {
|
|
// .attr_handle = 0,
|
|
// .send_conn_id = 0,
|
|
// .send_gatts_if = 0,
|
|
// };
|
|
|
|
void receipt_json_set_position();
|
|
void receipt_json_get_status();
|
|
void bluetooth_rx_buffer_format_receipt();
|
|
void bluetooth_rx_buffer_send_indicate();
|
|
void string_copy_by_num(char *dest, const char *src, uint8_t count, uint8_t num);
|
|
|
|
bluetooth_processer_t s_bluetooth_processer = {
|
|
.bluetooth_processer_rx_buf = bluetooth_rx_buffer,
|
|
.bluetooth_processer_rx_buf_size = sizeof(bluetooth_rx_buffer),
|
|
.bluetooth_baundrate_one_packet_delay_ms = kbluetooth_baundrate_one_packet_delay_ms,
|
|
.port_delay_ms = port_timer_delay_ms,
|
|
|
|
.bluetooth_rx_buffer_start_receving = false,
|
|
.bluetooth_rx_buffer_processing = false,
|
|
|
|
.order = "order",
|
|
.index = 0,
|
|
.speedLevel = 0,
|
|
.position = 0.0,
|
|
.direction = 0,
|
|
.code = 0,
|
|
.info = "noerror",
|
|
.deviceState = "init",
|
|
.deviceException = 0,
|
|
.deviceExceptionInfo = "noexception",
|
|
|
|
.cmd_flag = false,
|
|
.actively_report_flag = false,
|
|
};
|
|
|
|
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'};
|
|
|
|
// while (true) {
|
|
// if (table_handle_m != 0) {
|
|
// ets_delay_us(1000000);
|
|
// esp_ble_gatts_send_indicate(table_gatts_if_m, table_conn_id_m, table_handle_m, 5, (uint8_t *)temp_buffer, false);
|
|
// }
|
|
// }
|
|
|
|
bluetooth_rx_buffer_format_receipt();
|
|
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) {
|
|
bluetooth_gatts_try_process_data();
|
|
if (s_bluetooth_processer.actively_report_flag) {
|
|
receipt_json_get_status();
|
|
s_bluetooth_processer.actively_report_flag = false;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
bool validation_param(cJSON *object, char *param) {
|
|
cJSON *current_element = object->child;
|
|
|
|
while (current_element->string != NULL) {
|
|
if (current_element->string == param) {
|
|
return true;
|
|
}
|
|
current_element = current_element->next;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void receipt_json_set_position() {
|
|
cJSON *pRoot = cJSON_CreateObject(); //创建一个对象
|
|
if (!pRoot) {
|
|
return;
|
|
}
|
|
|
|
cJSON_AddStringToObject(pRoot, "order", "receipt"); //添加一个节点
|
|
cJSON_AddNumberToObject(pRoot, "code", s_bluetooth_processer.code);
|
|
cJSON_AddStringToObject(pRoot, "info", "success");
|
|
cJSON_AddNumberToObject(pRoot, "index", s_bluetooth_processer.index);
|
|
char *szJson = cJSON_Print(pRoot);
|
|
|
|
if (szJson != NULL) {
|
|
ESP_LOGI(GATTS_TABLE_TAG, "%s", szJson);
|
|
|
|
// esp_gatt_rsp_t rsp;
|
|
// memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
|
|
// rsp.attr_value.handle = constructor_param->read.handle;
|
|
// rsp.attr_value.len = 4;
|
|
// rsp.attr_value.value[0] = 0x11;
|
|
// rsp.attr_value.value[1] = 0x22;
|
|
// rsp.attr_value.value[2] = 0x33;
|
|
// rsp.attr_value.value[3] = 0x44;
|
|
|
|
// esp_ble_gatts_send_response(constructor_gatts_if, constructor_param->read.conn_id,
|
|
// constructor_param->read.trans_id, ESP_GATT_OK, &rsp);
|
|
|
|
free(szJson);
|
|
}
|
|
|
|
cJSON_Delete(pRoot);
|
|
}
|
|
|
|
void receipt_json_get_status() {
|
|
cJSON *pRoot = cJSON_CreateObject(); //创建一个对象
|
|
if (!pRoot) {
|
|
return;
|
|
}
|
|
|
|
cJSON_AddStringToObject(pRoot, "order", "receipt"); //添加一个节点
|
|
cJSON_AddNumberToObject(pRoot, "index", s_bluetooth_processer.index);
|
|
cJSON_AddStringToObject(pRoot, "deviceState", s_bluetooth_processer.deviceState);
|
|
cJSON_AddNumberToObject(pRoot, "deviceException", s_bluetooth_processer.deviceException);
|
|
cJSON_AddStringToObject(pRoot, "deviceExceptionInfo", s_bluetooth_processer.deviceExceptionInfo);
|
|
cJSON_AddNumberToObject(pRoot, "position", s_bluetooth_processer.position);
|
|
|
|
char *szJson = cJSON_Print(pRoot);
|
|
|
|
if (szJson != NULL) {
|
|
ESP_LOGI(GATTS_TABLE_TAG, "%s", szJson);
|
|
free(szJson);
|
|
}
|
|
|
|
cJSON_Delete(pRoot);
|
|
}
|
|
|
|
void bluetooth_rx_buffer_format_receipt() {
|
|
sprintf(bluetooth_tx_buffer, "{ \"order\": \"receipt\", \"index\": %d, \"speedLevel\": %d, \"position\": %.2lf, \"direction\": %d }", s_bluetooth_processer.index, s_bluetooth_processer.speedLevel,
|
|
s_bluetooth_processer.position, s_bluetooth_processer.direction);
|
|
}
|
|
|
|
void bluetooth_rx_buffer_send_indicate() {
|
|
char temp_buffer[20] = {0};
|
|
uint8_t temp_lenght = 0;
|
|
uint8_t temp_count_total = 0;
|
|
uint8_t temp_last_count_not_15 = false;
|
|
uint8_t temp_count_remainder = 0;
|
|
uint8_t i = 0;
|
|
|
|
temp_lenght = strlen(bluetooth_tx_buffer);
|
|
temp_count_total = temp_lenght / 15;
|
|
|
|
if ((temp_lenght % 15) != 0) {
|
|
temp_count_remainder = temp_lenght % 15;
|
|
temp_last_count_not_15 = true;
|
|
}
|
|
|
|
for (i = 0; i < temp_count_total; i++) {
|
|
string_copy_by_num(temp_buffer, bluetooth_tx_buffer, i, 15);
|
|
esp_ble_gatts_send_indicate(table_gatts_if_m, table_conn_id_m, table_handle_m, strlen(temp_buffer), (uint8_t *)temp_buffer, false);
|
|
}
|
|
if (temp_last_count_not_15 == true) {
|
|
string_copy_by_num(temp_buffer, bluetooth_tx_buffer, temp_count_total, temp_count_remainder);
|
|
esp_ble_gatts_send_indicate(table_gatts_if_m, table_conn_id_m, table_handle_m, strlen(temp_buffer), (uint8_t *)temp_buffer, false);
|
|
}
|
|
}
|
|
|
|
void string_copy_by_num(char *dest, const char *src, uint8_t count, uint8_t num) {
|
|
int i = 0;
|
|
memset(dest, '\0', 15);
|
|
if (dest == NULL || src == NULL || num == 0) {
|
|
/* code */
|
|
ESP_LOGW(GATTS_TABLE_TAG, "string_copy_by_num function parameter is empty");
|
|
}
|
|
|
|
for (i = 0; i < num; i++) {
|
|
dest[i] = src[(count * 15) + i];
|
|
}
|
|
}
|