|
|
@ -7,6 +7,7 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
#include "ble_spp_server_demo.h" |
|
|
|
|
|
|
|
#include "rgb_led.h" |
|
|
|
|
|
|
|
#define GATTS_TABLE_TAG "GATTS_SPP_SERVER" |
|
|
@ -129,22 +130,22 @@ static const uint8_t char_prop_read_write_notify = ESP_GATT_CHAR_PROP_BIT_READ | |
|
|
|
#endif |
|
|
|
|
|
|
|
/// SPP Service - data receive characteristic, read&write without response |
|
|
|
// static const uint16_t spp_data_receive_uuid = ESP_GATT_UUID_SPP_DATA_RECEIVE; |
|
|
|
static const uint16_t spp_data_receive_uuid = ESP_GATT_UUID_SPP_DATA_RECEIVE; |
|
|
|
static const uint8_t spp_data_receive_val[128] = {0x00}; |
|
|
|
|
|
|
|
/// SPP Service - data notify characteristic, notify&read |
|
|
|
// static const uint16_t spp_data_notify_uuid = ESP_GATT_UUID_SPP_DATA_NOTIFY; |
|
|
|
static const uint16_t spp_data_notify_uuid = ESP_GATT_UUID_SPP_DATA_NOTIFY; |
|
|
|
static const uint8_t spp_data_notify_val[20] = {0x00}; |
|
|
|
static const uint8_t spp_data_notify_ccc[2] = {0x00, 0x00}; |
|
|
|
|
|
|
|
/// SPP Service - command characteristic, read&write without response |
|
|
|
// static const uint16_t spp_command_uuid = ESP_GATT_UUID_SPP_COMMAND_RECEIVE; |
|
|
|
// static const uint8_t spp_command_val[10] = {0x00}; |
|
|
|
static const uint16_t spp_command_uuid = ESP_GATT_UUID_SPP_COMMAND_RECEIVE; |
|
|
|
static const uint8_t spp_command_val[10] = {0x00}; |
|
|
|
|
|
|
|
/// SPP Service - status characteristic, notify&read |
|
|
|
// static const uint16_t spp_status_uuid = ESP_GATT_UUID_SPP_COMMAND_NOTIFY; |
|
|
|
// static const uint8_t spp_status_val[10] = {0x00}; |
|
|
|
// static const uint8_t spp_status_ccc[2] = {0x00, 0x00}; |
|
|
|
static const uint16_t spp_status_uuid = ESP_GATT_UUID_SPP_COMMAND_NOTIFY; |
|
|
|
static const uint8_t spp_status_val[10] = {0x00}; |
|
|
|
static const uint8_t spp_status_ccc[2] = {0x00, 0x00}; |
|
|
|
|
|
|
|
#ifdef SUPPORT_HEARTBEAT |
|
|
|
/// SPP Server - Heart beat characteristic, notify&write&read |
|
|
@ -158,15 +159,15 @@ static const uint8_t spp_service_uuid128[16] = { |
|
|
|
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E, // |
|
|
|
}; |
|
|
|
|
|
|
|
static const uint8_t spp_char_uuid128_rx[16] = { |
|
|
|
/* LSB <--------------------------------------------------------------------------------> MSB */ |
|
|
|
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E, // |
|
|
|
}; |
|
|
|
// static const uint8_t spp_char_uuid128_rx[16] = { |
|
|
|
// /* LSB <--------------------------------------------------------------------------------> MSB */ |
|
|
|
// 0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E, // |
|
|
|
// }; |
|
|
|
|
|
|
|
static const uint8_t spp_char_uuid128_tx[16] = { |
|
|
|
/* LSB <--------------------------------------------------------------------------------> MSB */ |
|
|
|
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E, // |
|
|
|
}; |
|
|
|
// static const uint8_t spp_char_uuid128_tx[16] = { |
|
|
|
// /* LSB <--------------------------------------------------------------------------------> MSB */ |
|
|
|
// 0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E, // |
|
|
|
// }; |
|
|
|
|
|
|
|
/// Full HRS Database Description - Used to add attributes into the database |
|
|
|
static const esp_gatts_attr_db_t spp_gatt_db[SPP_IDX_NB] = { |
|
|
@ -174,51 +175,47 @@ static const esp_gatts_attr_db_t spp_gatt_db[SPP_IDX_NB] = { |
|
|
|
[SPP_IDX_SVC] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, sizeof(spp_service_uuid128), sizeof(spp_service_uuid128), (uint8_t *)&spp_service_uuid128}}, |
|
|
|
|
|
|
|
// SPP - data receive characteristic Declaration |
|
|
|
[SPP_IDX_SPP_DATA_RECV_CHAR] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, |
|
|
|
|
|
|
|
// SPP - data receive characteristic Value |
|
|
|
[SPP_IDX_SPP_DATA_RECV_VAL] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&spp_data_receive_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, SPP_DATA_MAX_LEN, sizeof(spp_data_receive_val), |
|
|
|
(uint8_t *)spp_data_receive_val}}, |
|
|
|
|
|
|
|
// SPP - data notify characteristic Declaration |
|
|
|
[SPP_IDX_SPP_DATA_NOTIFY_CHAR] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_notify}}, |
|
|
|
|
|
|
|
// SPP - data notify characteristic Value |
|
|
|
[SPP_IDX_SPP_DATA_NTY_VAL] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_128, (uint8_t *)&spp_char_uuid128_rx, ESP_GATT_PERM_READ, SPP_DATA_MAX_LEN, sizeof(spp_data_notify_val), (uint8_t *)spp_data_notify_val}}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&spp_data_notify_uuid, ESP_GATT_PERM_READ, SPP_DATA_MAX_LEN, sizeof(spp_data_notify_val), (uint8_t *)spp_data_notify_val}}, |
|
|
|
|
|
|
|
// SPP - data notify characteristic - Client Characteristic Configuration Descriptor |
|
|
|
[SPP_IDX_SPP_DATA_NTF_CFG] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, sizeof(uint16_t), sizeof(spp_data_notify_ccc), |
|
|
|
(uint8_t *)spp_data_notify_ccc}}, |
|
|
|
|
|
|
|
// SPP - data receive characteristic Declaration |
|
|
|
[SPP_IDX_SPP_DATA_RECV_CHAR] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_WRITE, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, |
|
|
|
|
|
|
|
// SPP - data receive characteristic Value |
|
|
|
[SPP_IDX_SPP_DATA_RECV_VAL] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_128, (uint8_t *)&spp_char_uuid128_tx, ESP_GATT_PERM_WRITE, SPP_DATA_MAX_LEN, sizeof(spp_data_receive_val), (uint8_t *)spp_data_receive_val}}, |
|
|
|
// SPP - command characteristic Declaration |
|
|
|
[SPP_IDX_SPP_COMMAND_CHAR] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, |
|
|
|
|
|
|
|
// //SPP - command characteristic Declaration |
|
|
|
// [SPP_IDX_SPP_COMMAND_CHAR] = |
|
|
|
// {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, |
|
|
|
// CHAR_DECLARATION_SIZE,CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_write}}, |
|
|
|
// SPP - command characteristic Value |
|
|
|
[SPP_IDX_SPP_COMMAND_VAL] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&spp_command_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, SPP_CMD_MAX_LEN, sizeof(spp_command_val), (uint8_t *)spp_command_val}}, |
|
|
|
|
|
|
|
// //SPP - command characteristic Value |
|
|
|
// [SPP_IDX_SPP_COMMAND_VAL] = |
|
|
|
// {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&spp_command_uuid, ESP_GATT_PERM_READ|ESP_GATT_PERM_WRITE, |
|
|
|
// SPP_CMD_MAX_LEN,sizeof(spp_command_val), (uint8_t *)spp_command_val}}, |
|
|
|
// SPP - status characteristic Declaration |
|
|
|
[SPP_IDX_SPP_STATUS_CHAR] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, CHAR_DECLARATION_SIZE, CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_notify}}, |
|
|
|
|
|
|
|
// //SPP - status characteristic Declaration |
|
|
|
// [SPP_IDX_SPP_STATUS_CHAR] = |
|
|
|
// {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_declaration_uuid, ESP_GATT_PERM_READ, |
|
|
|
// CHAR_DECLARATION_SIZE,CHAR_DECLARATION_SIZE, (uint8_t *)&char_prop_read_notify}}, |
|
|
|
// SPP - status characteristic Value |
|
|
|
[SPP_IDX_SPP_STATUS_VAL] = {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&spp_status_uuid, ESP_GATT_PERM_READ, SPP_STATUS_MAX_LEN, sizeof(spp_status_val), (uint8_t *)spp_status_val}}, |
|
|
|
|
|
|
|
// //SPP - status characteristic Value |
|
|
|
// [SPP_IDX_SPP_STATUS_VAL] = |
|
|
|
// {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&spp_status_uuid, ESP_GATT_PERM_READ, |
|
|
|
// SPP_STATUS_MAX_LEN,sizeof(spp_status_val), (uint8_t *)spp_status_val}}, |
|
|
|
|
|
|
|
// //SPP - status characteristic - Client Characteristic Configuration Descriptor |
|
|
|
// [SPP_IDX_SPP_STATUS_CFG] = |
|
|
|
// {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ|ESP_GATT_PERM_WRITE, |
|
|
|
// sizeof(uint16_t),sizeof(spp_status_ccc), (uint8_t *)spp_status_ccc}}, |
|
|
|
// SPP - status characteristic - Client Characteristic Configuration Descriptor |
|
|
|
[SPP_IDX_SPP_STATUS_CFG] = {{ESP_GATT_AUTO_RSP}, |
|
|
|
{ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, sizeof(uint16_t), sizeof(spp_status_ccc), |
|
|
|
(uint8_t *)spp_status_ccc}}, |
|
|
|
|
|
|
|
#ifdef SUPPORT_HEARTBEAT |
|
|
|
// SPP - Heart beat characteristic Declaration |
|
|
@ -378,25 +375,25 @@ void uart_task(void *pvParameters) { |
|
|
|
vTaskDelete(NULL); |
|
|
|
} |
|
|
|
|
|
|
|
// static void spp_uart_init(void) { |
|
|
|
// uart_config_t uart_config = { |
|
|
|
// .baud_rate = 115200, |
|
|
|
// .data_bits = UART_DATA_8_BITS, |
|
|
|
// .parity = UART_PARITY_DISABLE, |
|
|
|
// .stop_bits = UART_STOP_BITS_1, |
|
|
|
// .flow_ctrl = UART_HW_FLOWCTRL_RTS, |
|
|
|
// .rx_flow_ctrl_thresh = 122, |
|
|
|
// .source_clk = UART_SCLK_APB, |
|
|
|
// }; |
|
|
|
|
|
|
|
// // Install UART driver, and get the queue. |
|
|
|
// uart_driver_install(UART_NUM_0, 4096, 8192, 10, &spp_uart_queue, 0); |
|
|
|
// // Set UART parameters |
|
|
|
// uart_param_config(UART_NUM_0, &uart_config); |
|
|
|
// // Set UART pins |
|
|
|
// uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); |
|
|
|
// xTaskCreate(uart_task, "uTask", 2048, (void *)UART_NUM_0, 8, NULL); |
|
|
|
// } |
|
|
|
static void spp_uart_init(void) { |
|
|
|
uart_config_t uart_config = { |
|
|
|
.baud_rate = 115200, |
|
|
|
.data_bits = UART_DATA_8_BITS, |
|
|
|
.parity = UART_PARITY_DISABLE, |
|
|
|
.stop_bits = UART_STOP_BITS_1, |
|
|
|
.flow_ctrl = UART_HW_FLOWCTRL_RTS, |
|
|
|
.rx_flow_ctrl_thresh = 122, |
|
|
|
.source_clk = UART_SCLK_APB, |
|
|
|
}; |
|
|
|
|
|
|
|
// Install UART driver, and get the queue. |
|
|
|
uart_driver_install(UART_NUM_0, 4096, 8192, 10, &spp_uart_queue, 0); |
|
|
|
// Set UART parameters |
|
|
|
uart_param_config(UART_NUM_0, &uart_config); |
|
|
|
// Set UART pins |
|
|
|
uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); |
|
|
|
xTaskCreate(uart_task, "uTask", 2048, (void *)UART_NUM_0, 8, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef SUPPORT_HEARTBEAT |
|
|
|
void spp_heartbeat_task(void *arg) { |
|
|
@ -436,17 +433,17 @@ void spp_cmd_task(void *arg) { |
|
|
|
vTaskDelete(NULL); |
|
|
|
} |
|
|
|
|
|
|
|
// static void spp_task_init(void) { |
|
|
|
// spp_uart_init(); |
|
|
|
static void spp_task_init(void) { |
|
|
|
spp_uart_init(); |
|
|
|
|
|
|
|
// #ifdef SUPPORT_HEARTBEAT |
|
|
|
// cmd_heartbeat_queue = xQueueCreate(10, sizeof(uint32_t)); |
|
|
|
// xTaskCreate(spp_heartbeat_task, "spp_heartbeat_task", 2048, NULL, 10, NULL); |
|
|
|
// #endif |
|
|
|
#ifdef SUPPORT_HEARTBEAT |
|
|
|
cmd_heartbeat_queue = xQueueCreate(10, sizeof(uint32_t)); |
|
|
|
xTaskCreate(spp_heartbeat_task, "spp_heartbeat_task", 2048, NULL, 10, NULL); |
|
|
|
#endif |
|
|
|
|
|
|
|
// cmd_cmd_queue = xQueueCreate(10, sizeof(uint32_t)); |
|
|
|
// xTaskCreate(spp_cmd_task, "spp_cmd_task", 2048, NULL, 10, NULL); |
|
|
|
// } |
|
|
|
cmd_cmd_queue = xQueueCreate(10, sizeof(uint32_t)); |
|
|
|
xTaskCreate(spp_cmd_task, "spp_cmd_task", 2048, NULL, 10, NULL); |
|
|
|
} |
|
|
|
|
|
|
|
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { |
|
|
|
esp_err_t err; |
|
|
@ -491,6 +488,7 @@ static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_ |
|
|
|
break; |
|
|
|
case ESP_GATTS_WRITE_EVT: { |
|
|
|
res = find_char_and_desr_index(p_data->write.handle); |
|
|
|
ESP_LOGI("test","---------res = %d--------",res); |
|
|
|
if (p_data->write.is_prep == false) { |
|
|
|
ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_WRITE_EVT : handle = %d\n", res); |
|
|
|
if (res == SPP_IDX_SPP_COMMAND_VAL) { |
|
|
@ -685,7 +683,7 @@ void ble_spp_server_demo_app_main(bluetooth_processer_t *bluetooth_processer) { |
|
|
|
esp_ble_gap_register_callback(gap_event_handler); |
|
|
|
esp_ble_gatts_app_register(ESP_SPP_APP_ID); |
|
|
|
|
|
|
|
// spp_task_init(); |
|
|
|
spp_task_init(); |
|
|
|
|
|
|
|
return; |
|
|
|
} |