diff --git a/main/ble_gatts_server.c b/main/ble_gatts_server.c index 5493e57..7c10f73 100644 --- a/main/ble_gatts_server.c +++ b/main/ble_gatts_server.c @@ -282,7 +282,7 @@ static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param /* * [0]: 标识 F0--写多个modbus内存地址 - * [2:1]: 起始地址 + * [2:1]: 寄存器起始地址,即寄存器下标 * [3]: 写的字节数 0-255 * ...: 数据内容 */ @@ -581,8 +581,8 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_ static uint16_t gatts_mtu_size = 23; void notify_data_fun(int id, uint8_t *data, uint32_t len) { - ESP_LOGI(GATTS_TABLE_TAG, "notify_data_fun:"); - esp_log_buffer_hex(GATTS_TABLE_TAG, data, len); + // ESP_LOGI(GATTS_TABLE_TAG, "notify_data_fun:"); + // esp_log_buffer_hex(GATTS_TABLE_TAG, data, len); if (len <= gatts_mtu_size - 3) /* 包数据可以一次完整发送 */ { esp_ble_gatts_send_indicate(ble_gatts_if, ble_gatts_conn_id, ble_gatts_handle_table[id], len, data, false); @@ -595,7 +595,7 @@ void notify_data_fun(int id, uint8_t *data, uint32_t len) total_num = len / (gatts_mtu_size - 7); else total_num = len / (gatts_mtu_size - 7) + 1; - ESP_LOGI(GATTS_TABLE_TAG, "notify packet has %d", total_num); + // ESP_LOGI(GATTS_TABLE_TAG, "notify packet has %d", total_num); int i = 0; buf[0] = '#'; @@ -611,18 +611,34 @@ void notify_data_fun(int id, uint8_t *data, uint32_t len) buf[3] = i; memcpy(buf + 4, data + i * (gatts_mtu_size - 7), len % (gatts_mtu_size - 7)); esp_ble_gatts_send_indicate(ble_gatts_if, ble_gatts_conn_id, ble_gatts_handle_table[IDX_DATA_NOTIFY_VAL], (len % (gatts_mtu_size - 7)) + 4, buf, false); - ESP_LOGI(GATTS_TABLE_TAG, "notify packet send end!"); + // ESP_LOGI(GATTS_TABLE_TAG, "notify packet send end!"); } } extern flow_t *pflow; extern depth_t *depth_data; +extern record_t *record; +gps_message_t *gpsMessageP = (gps_message_t *)&gWordVar[REG_GPS_MESSAGE]; +gps_write_data_t *gpsWriteDataP = (gps_write_data_t *)&gWordVar[REG_GPS_WRITE_DATA]; + void notify_all_data(void) { + // ESP_LOGI(GATTS_TABLE_TAG, "notify_all_data"); uint8_t buf[30]; - buf[0] = 1; /* tag:1号通道流量:瞬时,每10cm,总 */ + buf[0] = 1; /* tag:深度:速度 时间 深度 桩号 */ + buf[1] = depth_data->speed & 0xff; + buf[2] = (depth_data->speed >> 8) & 0xff; + buf[3] = depth_data->one_pile_work_time & 0xff; + buf[4] = (depth_data->one_pile_work_time >> 8) & 0xff; + buf[5] = depth_data->depth & 0xff; + buf[6] = (depth_data->depth >> 8) & 0xff; + buf[7] = gWordVar[LAST_PILE_ID_ADDR] & 0xff; + buf[8] = (gWordVar[LAST_PILE_ID_ADDR] >> 8) & 0xff; + notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 9); + + buf[0] = 2; /* tag:1号通道流量:瞬时,每10cm,总 */ buf[1] = pflow[0].flow & 0xff; buf[2] = (pflow[0].flow >> 8) & 0xff; buf[3] = depth_data->depth_flow[0] & 0xff; @@ -631,7 +647,7 @@ void notify_all_data(void) buf[6] = (pflow[0].total_flow >> 8) & 0xff; notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 7); - buf[0] = 2; /* tag:2号通道流量:瞬时,每10cm,总 */ + buf[0] = 3; /* tag:2号通道流量:瞬时,每10cm,总 */ buf[1] = pflow[1].flow & 0xff; buf[2] = (pflow[1].flow >> 8) & 0xff; buf[3] = depth_data->depth_flow[1] & 0xff; @@ -640,26 +656,91 @@ void notify_all_data(void) buf[6] = (pflow[1].total_flow >> 8) & 0xff; notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 7); - buf[0] = 3; /* tag:深度:速度 深度 */ - buf[1] = depth_data->speed & 0xff; - buf[2] = (depth_data->speed >> 8) & 0xff; - buf[3] = depth_data->depth & 0xff; - buf[4] = (depth_data->depth >> 8) & 0xff; - notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 5); + buf[0] = 4; /* tag:电流:三个*/ + buf[1] = gWordVar[AC_CURRENT_REG_ADDR + 0] & 0xff; + buf[2] = (gWordVar[AC_CURRENT_REG_ADDR + 0] >> 8) & 0xff; + buf[3] = gWordVar[AC_CURRENT_REG_ADDR + 1] & 0xff; + buf[4] = (gWordVar[AC_CURRENT_REG_ADDR + 1] >> 8) & 0xff; + buf[5] = gWordVar[AC_CURRENT_REG_ADDR + 2] & 0xff; + buf[6] = (gWordVar[AC_CURRENT_REG_ADDR + 2] >> 8) & 0xff; + notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 7); + + int64_t x = (int64_t)(gpsMessageP->x * 1000); + int64_t y = (int64_t)(gpsMessageP->y * 1000); + uint16_t dir = (uint16_t)(gpsMessageP->dir * 100); + uint16_t pitch = (uint16_t)(gpsMessageP->pitch * 100); + uint8_t gps_status = gpsMessageP->gps_status; + uint32_t utc_time = gpsMessageP->utc; + // ESP_LOGI(GATTS_TABLE_TAG, "x:%f, %f, %lld", gpsMessageP->x, gpsMessageP->x * 1000, (long long int)(gpsMessageP->x * 1000)); + // ESP_LOGI(GATTS_TABLE_TAG, "gps message x:%lld, y:%lld, dir:%ud, pitch:%ud, gps_status:%d, utc_time:%ud", (long long)x, (long long)y, (unsigned int)dir, (unsigned int)pitch, (int)gps_status, (unsigned int)utc_time); + buf[0] = 5; /* tag:CPS信息1:x, y(int64)*/ + buf[1] = x & 0xff; + buf[2] = (x >> 8) & 0xff; + buf[3] = (x >> 16) & 0xff; + buf[4] = (x >> 24) & 0xff; + buf[5] = (x >> 32) & 0xff; + buf[6] = (x >> 40) & 0xff; + buf[7] = (x >> 48) & 0xff; + buf[8] = (x >> 56) & 0xff; + buf[9] = y & 0xff; + buf[10] = (y >> 8) & 0xff; + buf[11] = (y >> 16) & 0xff; + buf[12] = (y >> 24) & 0xff; + buf[13] = (y >> 32) & 0xff; + buf[14] = (y >> 40) & 0xff; + buf[15] = (y >> 48) & 0xff; + buf[16] = (y >> 56) & 0xff; + notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 17); + + buf[0] = 6; /* tag:CPS信息2:方向,俯仰(uint16), gps定位状态(uint8), UTC时间(uint32)*/ + buf[1] = dir & 0xff; + buf[2] = (dir >> 8) & 0xff; + buf[3] = pitch & 0xff; + buf[4] = (pitch >> 8) & 0xff; + buf[5] = utc_time & 0xff; + buf[6] = (utc_time >> 8) & 0xff; + buf[7] = (utc_time >> 16) & 0xff; + buf[8] = (utc_time >> 24) & 0xff; + buf[9] = gps_status & 0xff; + notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 10); + + + // // 有记录时上传记录 + // static int pile_id = 0; + // static int pile_id_count = 0; + // if (record->pile_id > pile_id || record->count > pile_id_count) + // { + // pile_id = record->pile_id; + // pile_id_count = record->count; + + // buf[0] = 5; + // buf[1] = record->pile_id & 0xff; // pile_id + // buf[2] = (record->pile_id >> 8) & 0xff; + // buf[3] = record->item[0].flow[0] & 0xff; // 10cm喷浆量1 + // buf[4] = (record->item[0].flow[0] >> 8) & 0xff; + // buf[5] = record->item[0].flow[1] & 0xff; // 10cm喷浆量2 + // buf[6] = (record->item[0].flow[1] >> 8) & 0xff; + // buf[7] = record->max_depth & 0xff; // 最大深度 + // buf[8] = (record->max_depth >> 8) & 0xff; + // buf[9] = record->item[0].current1 & 0xff; // 采样的电流 + // buf[10] = (record->item[0].current1 >> 8) & 0xff; + // notify_data_fun(IDX_DATA_NOTIFY_VAL, buf, 11); + // } /* 需要上报什么数据在此处添加 */ } void notify_task(void *pvParameters) { + ESP_LOGI(GATTS_TABLE_TAG, "notify_task"); while (1) { if (data_notify_enable && is_connected) { notify_all_data(); } - vTaskDelay(pdMS_TO_TICKS(200)); + vTaskDelay(pdMS_TO_TICKS(100)); } vTaskDelete(NULL); diff --git a/main/stm32/ModbusS.c b/main/stm32/ModbusS.c index 26f6133..34021bb 100644 --- a/main/stm32/ModbusS.c +++ b/main/stm32/ModbusS.c @@ -347,9 +347,9 @@ int ModbusSlaveProcess(uint8_t *txbuf, uint8_t *rxbuf, uint16_t rxLen, int is_cr pDat+=2; } } - ESP_LOGI(TAG, "write gWordVar:"); - for (i = 0; i < length; i++) - ESP_LOGI(TAG, "gWordVar[%d]=0x%04x", add + i, gWordVar[add + i]); + // ESP_LOGI(TAG, "write gWordVar:"); + // for (i = 0; i < length; i++) + // ESP_LOGI(TAG, "gWordVar[%d]=0x%04x", add + i, gWordVar[add + i]); // ESP_LOGI(TAG, "%d %d", depth_config->input_type, depth_config->port); ModBusWordWriteHook(add,length); diff --git a/main/stm32/ModbusS.h b/main/stm32/ModbusS.h index 5104e51..9305978 100644 --- a/main/stm32/ModbusS.h +++ b/main/stm32/ModbusS.h @@ -20,7 +20,7 @@ void xorBit(uint16_t Add); void WriteBit(uint16_t Add,uint8_t bit_value); #define gBIT_SIZE 128 -#define gWORD_SIZE 512 +#define gWORD_SIZE 1024 extern uint8_t gBitVar[(gBIT_SIZE+7)/8]; extern uint16_t gWordVar[gWORD_SIZE]; extern uint16_t modbus_addr; diff --git a/main/stm32/config.h b/main/stm32/config.h index 7f5b9f2..9aac68f 100644 --- a/main/stm32/config.h +++ b/main/stm32/config.h @@ -18,6 +18,8 @@ #define TILT_SENSER_ADDR 30 #define RECORD_REG_ADDR 32 +#define TIME 264 + #define CAL_4_20MA_ADDR 384 #define FLOW_CONFIG_ADDR (CAL_4_20MA_ADDR + (sizeof(cal_4_20ma_t) + 15) / 16 * 8) #define DEPTH_CONFIG_ADDR (FLOW_CONFIG_ADDR + (sizeof(flow_config_t) + 15) / 16 * 8) @@ -27,7 +29,58 @@ #define DEPTH_RESET_ADDR 510 #define REBOOT_REW_ADDR 511 -#define TIME 264 +#define REG_GPS_MESSAGE (512 + 48) +#define REG_GPS_WRITE_DATA (REG_GPS_MESSAGE + sizeof(gps_message_t)) + +// GPS数据 +typedef struct gps_message +{ + uint8_t gps_status; // GPS定位状态 + uint8_t gps_view; // GPS可视状态 + uint8_t gps_use; // GPS使用状态 + uint8_t reg[1]; // 保留 + uint32_t utc; // utc时间 + double x; // 大地平面坐标 + double y; + double dir; // 方向 + double pitch; // 俯仰角 +} gps_message_t; +extern gps_message_t *gpsMessageP; + + +#define WRITE_DOWN_MAGIC 0x55BB // 控制gps采用参数进行运算 +#define WRITE_SAVE_MAGIC 0x55AA // 控制gps将参数保存成json文件,开机的时候自动加载 +typedef struct gps_write_data // addr 600 +{ + uint16_t magic; // 600 2 + uint16_t ellipsoidal_datum; // 椭圆基准 601 2 + uint8_t reg[4]; + + // 604 8 + int16_t x0; // 卫星接收器点坐标(坐标系以基站为原点建立) + int16_t y0; + int16_t x1; // 待求点坐标 + int16_t y1; + + // 608 16 + uint64_t central_meridian; // 中央子午线 + uint64_t elevation; // 投影高程 + + // 616 16 + int64_t dx; // x轴平移 + int64_t ax; // x轴旋转 + // 624 16 + int64_t dy; // y轴平移 + int64_t ay; // y轴旋转 + // 632 16 + int64_t dz; // z轴平移 + int64_t az; // z轴旋转 + // 640 8 + int64_t k; // 缩放比例 +} gps_write_data_t; +extern gps_write_data_t *gpsWriteDataP; + + typedef struct { uint16_t magic; @@ -109,6 +162,25 @@ typedef struct } depth_t; +typedef struct +{ + int16_t max_depth; + uint16_t pile_id; + uint16_t count; + // uint16_t work_time; + struct _item + { + int16_t speed; + int16_t depth; + int16_t flow[2]; + uint32_t total_flow[2]; + int16_t tilt_x; + int16_t tilt_y; + uint16_t current1; + uint16_t current2; + } item[10]; +} record_t; + extern depth_config_t *depth_config; diff --git a/main/stm32/depth.c b/main/stm32/depth.c index 26a3d7c..db3828b 100644 --- a/main/stm32/depth.c +++ b/main/stm32/depth.c @@ -89,24 +89,24 @@ int32_t enc2_value; extern rotary_encoder_t *encoder; -typedef struct -{ - int16_t max_depth; - uint16_t pile_id; - uint16_t count; - // uint16_t work_time; - struct _item - { - int16_t speed; - int16_t depth; - int16_t flow[2]; - uint32_t total_flow[2]; - int16_t tilt_x; - int16_t tilt_y; - uint16_t current1; - uint16_t current2; - } item[10]; -} record_t; +// typedef struct +// { +// int16_t max_depth; +// uint16_t pile_id; +// uint16_t count; +// // uint16_t work_time; +// struct _item +// { +// int16_t speed; +// int16_t depth; +// int16_t flow[2]; +// uint32_t total_flow[2]; +// int16_t tilt_x; +// int16_t tilt_y; +// uint16_t current1; +// uint16_t current2; +// } item[10]; +// } record_t; // 18字节 #pragma pack(1) @@ -449,17 +449,17 @@ void depth_task(void *arg) while (1) { - if (add_record_time++ > 10) - { - add_record_time = 0; - depth_data->sample_count++; - if (depth_data->sample_count > 20) - { - record->pile_id++; - depth_data->sample_count = 0; - } - add_recod_item(); - } + // if (add_record_time++ > 10) + // { + // add_record_time = 0; + // depth_data->sample_count++; + // if (depth_data->sample_count > 20) + // { + // record->pile_id++; + // depth_data->sample_count = 0; + // } + // add_recod_item(); + // } if (_enc1_update_time != enc1_update_time) /* 深度数据更新 */ { @@ -469,6 +469,7 @@ void depth_task(void *arg) time_diff = abs_sub(enc_update_time, _enc1_update_time); _enc1_update_time = enc_update_time; } + //ESP_LOGI(TAG, "time_diff:%d", time_diff); if (time_diff != 0) { @@ -498,7 +499,7 @@ void depth_task(void *arg) // send_to_bt1.max_depth = depth_data->depth; } - ESP_LOGI(TAG, "depth_data->depth:0x%x", (unsigned int)depth_data->depth); + //ESP_LOGI(TAG, "depth_data->depth:0x%x", (unsigned int)depth_data->depth); // 500ms计算一次速度 if (speed_calc_count++ > 50) diff --git a/main/stm32/uart0_modbus_slave.c b/main/stm32/uart0_modbus_slave.c index 3e56bc3..6e6e22e 100644 --- a/main/stm32/uart0_modbus_slave.c +++ b/main/stm32/uart0_modbus_slave.c @@ -63,7 +63,7 @@ void uart0_init(void) // Install UART driver (we don't need an event queue here) // In this example we don't even use a buffer for sending data. - ESP_ERROR_CHECK(uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0)); + ESP_ERROR_CHECK(uart_driver_install(uart_num, BUF_SIZE * 2, BUF_SIZE, 0, NULL, 0)); // Configure UART parameters ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config)); diff --git a/main/tmp/ble_gatts_server.c b/main/tmp/ble_gatts_server.c deleted file mode 100644 index ff76d11..0000000 --- a/main/tmp/ble_gatts_server.c +++ /dev/null @@ -1,714 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Unlicense OR CC0-1.0 - */ - -/**************************************************************************** -* -* This demo showcases creating a GATT database using a predefined attribute table. -* It acts as a GATT server and can send adv data, be connected by client. -* Run the gatt_client demo, the client demo will automatically connect to the gatt_server_service_table demo. -* Client demo will enable GATT server's notify after connection. The two devices will then exchange -* data. -* -****************************************************************************/ - - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" -#include "esp_system.h" -#include "esp_log.h" -#include "nvs_flash.h" -#include "esp_bt.h" - -#include "esp_gap_ble_api.h" -#include "esp_gatts_api.h" -#include "esp_bt_main.h" -#include "ble_gatts_server.h" -#include "esp_gatt_common_api.h" - -#include "stm32/config.h" -#include "stm32/ModbusS.h" - -#define GATTS_TABLE_TAG "GATTS_TABLE_DEMO" - -#define PROFILE_NUM 1 -#define PROFILE_APP_IDX 0 -#define ESP_APP_ID 0x55 -#define SAMPLE_DEVICE_NAME "ESP_GATTS_DEMO" -#define SVC_INST_ID 0 - -/* The max length of characteristic value. When the GATT client performs a write or prepare write operation, -* the data length must be less than GATTS_DEMO_CHAR_VAL_LEN_MAX. -*/ -#define GATTS_DEMO_CHAR_VAL_LEN_MAX 500 -#define PREPARE_BUF_MAX_SIZE 1024 -#define CHAR_DECLARATION_SIZE (sizeof(uint8_t)) - -#define ADV_CONFIG_FLAG (1 << 0) -#define SCAN_RSP_CONFIG_FLAG (1 << 1) - -static uint8_t adv_config_done = 0; - -uint16_t heart_rate_handle_table[HRS_IDX_NB]; - -typedef struct { - uint8_t *prepare_buf; - int prepare_len; -} prepare_type_env_t; - -static prepare_type_env_t prepare_write_env; - -#define CONFIG_SET_RAW_ADV_DATA -#ifdef CONFIG_SET_RAW_ADV_DATA -static uint8_t raw_adv_data[] = { - /* flags */ - 0x02, 0x01, 0x06, - /* tx power*/ - 0x02, 0x0a, 0xeb, - /* service uuid */ - 0x03, 0x03, 0xFF, 0x00, - /* device name */ - 0x0f, 0x09, 'E', 'S', 'P', '_', 'G', 'A', 'T', 'T', 'S', '_', 'D','E', 'M', 'O' -}; -static uint8_t raw_scan_rsp_data[] = { - /* flags */ - 0x02, 0x01, 0x06, - /* tx power */ - 0x02, 0x0a, 0xeb, - /* service uuid */ - 0x03, 0x03, 0xFF,0x00 -}; - -#else -static uint8_t service_uuid[16] = { - /* LSB <--------------------------------------------------------------------------------> MSB */ - //first uuid, 16bit, [12],[13] is the value - 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, -}; - -/* The length of adv data must be less than 31 bytes */ -static esp_ble_adv_data_t adv_data = { - .set_scan_rsp = false, - .include_name = true, - .include_txpower = true, - .min_interval = 0x0006, //slave connection min interval, Time = min_interval * 1.25 msec - .max_interval = 0x0010, //slave connection max interval, Time = max_interval * 1.25 msec - .appearance = 0x00, - .manufacturer_len = 0, //TEST_MANUFACTURER_DATA_LEN, - .p_manufacturer_data = NULL, //test_manufacturer, - .service_data_len = 0, - .p_service_data = NULL, - .service_uuid_len = sizeof(service_uuid), - .p_service_uuid = service_uuid, - .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), -}; - -// scan response data -static esp_ble_adv_data_t scan_rsp_data = { - .set_scan_rsp = true, - .include_name = true, - .include_txpower = true, - .min_interval = 0x0006, - .max_interval = 0x0010, - .appearance = 0x00, - .manufacturer_len = 0, //TEST_MANUFACTURER_DATA_LEN, - .p_manufacturer_data = NULL, //&test_manufacturer[0], - .service_data_len = 0, - .p_service_data = NULL, - .service_uuid_len = sizeof(service_uuid), - .p_service_uuid = service_uuid, - .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), -}; -#endif /* CONFIG_SET_RAW_ADV_DATA */ - -static esp_ble_adv_params_t adv_params = { - .adv_int_min = 0x20, - .adv_int_max = 0x40, - .adv_type = ADV_TYPE_IND, - .own_addr_type = BLE_ADDR_TYPE_PUBLIC, - .channel_map = ADV_CHNL_ALL, - .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, -}; - -struct gatts_profile_inst { - esp_gatts_cb_t gatts_cb; - uint16_t gatts_if; - uint16_t app_id; - uint16_t conn_id; - uint16_t service_handle; - esp_gatt_srvc_id_t service_id; - uint16_t char_handle; - esp_bt_uuid_t char_uuid; - esp_gatt_perm_t perm; - esp_gatt_char_prop_t property; - uint16_t descr_handle; - esp_bt_uuid_t descr_uuid; -}; - -static void gatts_profile_event_handler(esp_gatts_cb_event_t event, - esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); - -/* One gatt-based profile one app_id and one gatts_if, this array will store the gatts_if returned by ESP_GATTS_REG_EVT */ -static struct gatts_profile_inst heart_rate_profile_tab[PROFILE_NUM] = { - [PROFILE_APP_IDX] = { - .gatts_cb = gatts_profile_event_handler, - .gatts_if = ESP_GATT_IF_NONE, /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */ - }, -}; - -/* Service */ -static const uint16_t GATTS_SERVICE_UUID_TEST = 0x00FF; -static const uint16_t GATTS_CHAR_UUID_TEST_A = 0xFF01; -static const uint16_t ESP_GATT_UUID_SPP_DATA_NOTIFY = 0xFF02; - - -static const uint16_t primary_service_uuid = ESP_GATT_UUID_PRI_SERVICE; -static const uint16_t character_declaration_uuid = ESP_GATT_UUID_CHAR_DECLARE; -static const uint16_t character_client_config_uuid = ESP_GATT_UUID_CHAR_CLIENT_CONFIG; -static const uint8_t char_prop_read_notify = ESP_GATT_CHAR_PROP_BIT_READ|ESP_GATT_CHAR_PROP_BIT_NOTIFY; -static const uint8_t char_prop_read_write_notify = ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_NOTIFY; -static const uint8_t heart_measurement_ccc[2] = {0x00, 0x00}; -static const uint8_t char_value[4] = {0x11, 0x22, 0x33, 0x44}; - -///SPP Service - data notify characteristic, notify&read -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}; - -bool data_notify_enable = false; /* 是否允许数据上报 */ -bool is_connected = false; /* 蓝牙是否连接 */ -static uint16_t spp_conn_id = 0xffff; -static esp_gatt_if_t spp_gatts_if = 0xff; - -/* Full Database Description - Used to add attributes into the database */ -static const esp_gatts_attr_db_t gatt_db[HRS_IDX_NB] = -{ - // Service Declaration - [IDX_SVC] = - {{ESP_GATT_RSP_BY_APP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ, - sizeof(uint16_t), sizeof(GATTS_SERVICE_UUID_TEST), (uint8_t *)&GATTS_SERVICE_UUID_TEST}}, - - /* Characteristic Declaration */ - [IDX_CHAR_A] = - {{ESP_GATT_RSP_BY_APP}, {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_notify}}, - - /* Characteristic Value */ - [IDX_CHAR_VAL_A] = - {{ESP_GATT_RSP_BY_APP}, {ESP_UUID_LEN_16, (uint8_t *)&GATTS_CHAR_UUID_TEST_A, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, - GATTS_DEMO_CHAR_VAL_LEN_MAX, sizeof(char_value), (uint8_t *)char_value}}, - - /* Client Characteristic Configuration Descriptor */ - [IDX_CHAR_CFG_A] = - {{ESP_GATT_RSP_BY_APP}, {ESP_UUID_LEN_16, (uint8_t *)&character_client_config_uuid, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, - sizeof(uint16_t), sizeof(heart_measurement_ccc), (uint8_t *)heart_measurement_ccc}}, - - - //SPP - data notify characteristic Declaration - [SPP_IDX_SPP_DATA_NOTIFY_CHAR] = - {{ESP_GATT_RSP_BY_APP}, {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_RSP_BY_APP}, {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_RSP_BY_APP}, {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}}, -}; - -static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) -{ - switch (event) { - #ifdef CONFIG_SET_RAW_ADV_DATA - case ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT: - adv_config_done &= (~ADV_CONFIG_FLAG); - if (adv_config_done == 0){ - esp_ble_gap_start_advertising(&adv_params); - } - break; - case ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT: - adv_config_done &= (~SCAN_RSP_CONFIG_FLAG); - if (adv_config_done == 0){ - esp_ble_gap_start_advertising(&adv_params); - } - break; - #else - case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT: - adv_config_done &= (~ADV_CONFIG_FLAG); - if (adv_config_done == 0){ - esp_ble_gap_start_advertising(&adv_params); - } - break; - case ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT: - adv_config_done &= (~SCAN_RSP_CONFIG_FLAG); - if (adv_config_done == 0){ - esp_ble_gap_start_advertising(&adv_params); - } - break; - #endif - case ESP_GAP_BLE_ADV_START_COMPLETE_EVT: - /* advertising start complete event to indicate advertising start successfully or failed */ - if (param->adv_start_cmpl.status != ESP_BT_STATUS_SUCCESS) { - ESP_LOGE(GATTS_TABLE_TAG, "advertising start failed"); - }else{ - ESP_LOGI(GATTS_TABLE_TAG, "advertising start successfully"); - } - break; - case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT: - if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS) { - ESP_LOGE(GATTS_TABLE_TAG, "Advertising stop failed"); - } - else { - ESP_LOGI(GATTS_TABLE_TAG, "Stop adv successfully\n"); - } - break; - case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d", - param->update_conn_params.status, - param->update_conn_params.min_int, - param->update_conn_params.max_int, - param->update_conn_params.conn_int, - param->update_conn_params.latency, - param->update_conn_params.timeout); - break; - default: - break; - } -} - -void notify_data_fun(int id, uint8_t *data, uint32_t len); - -/* - * [0]: 标识 F0--写多个modbus内存地址 - * [2:1]: 起始地址 - * [3]: 写的字节数 0-255 - * ...: 数据内容 - */ -void gatts_write_data_cb(uint8_t *data, uint32_t len, esp_ble_gatts_cb_param_t *param) -{ - ESP_LOGI(GATTS_TABLE_TAG, "gatts_write_data_cb"); - if (len < 4) { - ESP_LOGI(GATTS_TABLE_TAG, "write format is fault, len less 4"); - return; - } - else if (data[0] == 0xF0) /* 写gWordVar寄存器 */ - { - uint16_t addr = data[1] + (data[2] << 8); - uint16_t addr_ = addr; - uint8_t cnt = data[3]; - if (cnt > len - 4) - { - ESP_LOGI(GATTS_TABLE_TAG, "write format is fault, cnt > len - 4"); - return; - } - ESP_LOGI(GATTS_TABLE_TAG, "write addr:%d cnt:%d", addr, cnt); - uint8_t i; - for (i = 0 + 4; i < cnt + 4; i+=2) /* 发送的数据要求两字节对齐 */ - { - gWordVar[addr++] = data[i] + (data[i + 1] << 8); - ESP_LOGI(GATTS_TABLE_TAG, "gwordvar[%d]:0x%x", addr-1, gWordVar[addr-1]); - } - /* 还应该调用 ModBusWordWriteHook 来处理这些写动作带来的影响 */ - ModBusWordWriteHook(addr, cnt); - } - else if (data[0] == 0xF1) /* 读gWordVar,通过notify上报回去 */ - { - uint16_t addr = data[1] + (data[2] << 8); - uint8_t cnt = data[3]; - ESP_LOGI(GATTS_TABLE_TAG, "!read addr:%d cnt:%d", addr, cnt); - uint8_t buf[500]; - buf[0] = data[0]; - buf[1] = data[1]; - buf[2] = data[2]; - buf[3] = data[3]; - ESP_LOGI(GATTS_TABLE_TAG, "gWordVar[0]:0x%x gWordVar[1]:0x%x", gWordVar[0], gWordVar[1]); - memcpy(buf + 4, (uint8_t *)(gWordVar + addr), cnt); - notify_data_fun(IDX_CHAR_VAL_A, buf, cnt + 4); - } -} - - -void example_prepare_write_event_env(esp_gatt_if_t gatts_if, prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param) -{ - ESP_LOGI(GATTS_TABLE_TAG, "prepare write, handle = %d, value len = %d", param->write.handle, param->write.len); - esp_gatt_status_t status = ESP_GATT_OK; - if (prepare_write_env->prepare_buf == NULL) { - prepare_write_env->prepare_buf = (uint8_t *)malloc(PREPARE_BUF_MAX_SIZE * sizeof(uint8_t)); - prepare_write_env->prepare_len = 0; - if (prepare_write_env->prepare_buf == NULL) { - ESP_LOGE(GATTS_TABLE_TAG, "%s, Gatt_server prep no mem", __func__); - status = ESP_GATT_NO_RESOURCES; - } - } else { - if(param->write.offset > PREPARE_BUF_MAX_SIZE) { - status = ESP_GATT_INVALID_OFFSET; - } else if ((param->write.offset + param->write.len) > PREPARE_BUF_MAX_SIZE) { - status = ESP_GATT_INVALID_ATTR_LEN; - } - } - /*send response when param->write.need_rsp is true */ - // if (param->write.need_rsp){ - esp_gatt_rsp_t *gatt_rsp = (esp_gatt_rsp_t *)malloc(sizeof(esp_gatt_rsp_t)); - if (gatt_rsp != NULL){ - gatt_rsp->attr_value.len = param->write.len; - gatt_rsp->attr_value.handle = param->write.handle; - gatt_rsp->attr_value.offset = param->write.offset; - gatt_rsp->attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE; - memcpy(gatt_rsp->attr_value.value, param->write.value, param->write.len); - esp_err_t response_err = esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, status, gatt_rsp); - if (response_err != ESP_OK){ - ESP_LOGE(GATTS_TABLE_TAG, "Send response error"); - } - free(gatt_rsp); - }else{ - ESP_LOGE(GATTS_TABLE_TAG, "%s, malloc failed", __func__); - } - // } - if (status != ESP_GATT_OK){ - return; - } - memcpy(prepare_write_env->prepare_buf + param->write.offset, - param->write.value, - param->write.len); - prepare_write_env->prepare_len += param->write.len; - -} - -void example_exec_write_event_env(prepare_type_env_t *prepare_write_env, esp_ble_gatts_cb_param_t *param){ - if (param->exec_write.exec_write_flag == ESP_GATT_PREP_WRITE_EXEC && prepare_write_env->prepare_buf){ - esp_log_buffer_hex(GATTS_TABLE_TAG, prepare_write_env->prepare_buf, prepare_write_env->prepare_len); - gatts_write_data_cb(prepare_write_env->prepare_buf, prepare_write_env->prepare_len, param); /* 此处有隐患,有可能不是data_write特征的数据 */ - }else{ - ESP_LOGI(GATTS_TABLE_TAG,"ESP_GATT_PREP_WRITE_CANCEL"); - } - if (prepare_write_env->prepare_buf) { - free(prepare_write_env->prepare_buf); - prepare_write_env->prepare_buf = NULL; - } - prepare_write_env->prepare_len = 0; -} - - -static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) -{ - switch (event) { - case ESP_GATTS_REG_EVT:{ - esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name(SAMPLE_DEVICE_NAME); - if (set_dev_name_ret){ - ESP_LOGE(GATTS_TABLE_TAG, "set device name failed, error code = %x", set_dev_name_ret); - } - #ifdef CONFIG_SET_RAW_ADV_DATA - esp_err_t raw_adv_ret = esp_ble_gap_config_adv_data_raw(raw_adv_data, sizeof(raw_adv_data)); - if (raw_adv_ret){ - ESP_LOGE(GATTS_TABLE_TAG, "config raw adv data failed, error code = %x ", raw_adv_ret); - } - adv_config_done |= ADV_CONFIG_FLAG; - esp_err_t raw_scan_ret = esp_ble_gap_config_scan_rsp_data_raw(raw_scan_rsp_data, sizeof(raw_scan_rsp_data)); - if (raw_scan_ret){ - ESP_LOGE(GATTS_TABLE_TAG, "config raw scan rsp data failed, error code = %x", raw_scan_ret); - } - adv_config_done |= SCAN_RSP_CONFIG_FLAG; - #else - //config adv data - esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data); - if (ret){ - ESP_LOGE(GATTS_TABLE_TAG, "config adv data failed, error code = %x", ret); - } - adv_config_done |= ADV_CONFIG_FLAG; - //config scan response data - ret = esp_ble_gap_config_adv_data(&scan_rsp_data); - if (ret){ - ESP_LOGE(GATTS_TABLE_TAG, "config scan response data failed, error code = %x", ret); - } - adv_config_done |= SCAN_RSP_CONFIG_FLAG; - #endif - esp_err_t create_attr_ret = esp_ble_gatts_create_attr_tab(gatt_db, gatts_if, HRS_IDX_NB, SVC_INST_ID); - if (create_attr_ret){ - ESP_LOGE(GATTS_TABLE_TAG, "create attr table failed, error code = %x", create_attr_ret); - } - } - break; - case ESP_GATTS_READ_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_READ_EVT"); - // esp_gatt_rsp_t rsp; - // memset(&rsp, 0, sizeof(esp_gatt_rsp_t)); - // rsp.attr_value.handle = param->read.handle; - // rsp.attr_value.len = 4; - // rsp.attr_value.value[0] = 0xde; - // rsp.attr_value.value[1] = 0xed; - // rsp.attr_value.value[2] = 0xbe; - // rsp.attr_value.value[3] = 0xef; - // esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, - // ESP_GATT_OK, &rsp); - break; - case ESP_GATTS_WRITE_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_WRITE_EVT, need_rsp=%d", param->write.need_rsp); - - if (!param->write.is_prep){ - // the data length of gattc write must be less than GATTS_DEMO_CHAR_VAL_LEN_MAX. - ESP_LOGI(GATTS_TABLE_TAG, "GATT_WRITE_EVT, handle = %d, value len = %d, value :", param->write.handle, param->write.len); - esp_log_buffer_hex(GATTS_TABLE_TAG, param->write.value, param->write.len); - if (heart_rate_handle_table[IDX_CHAR_VAL_A] == param->write.handle) - gatts_write_data_cb(param->write.value, param->write.len, param); - if (heart_rate_handle_table[SPP_IDX_SPP_DATA_NTF_CFG] == param->write.handle && param->write.len == 2){ - uint16_t descr_value = param->write.value[1]<<8 | param->write.value[0]; - if (descr_value == 0x0001){ - ESP_LOGI(GATTS_TABLE_TAG, "notify enable"); - data_notify_enable = true; - // uint8_t notify_data[15]; - // for (int i = 0; i < sizeof(notify_data); ++i) - // { - // notify_data[i] = i % 0xff; - // } - // //the size of notify_data[] need less than MTU size - // esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, heart_rate_handle_table[IDX_CHAR_VAL_A], - // sizeof(notify_data), notify_data, false); - }//else if (descr_value == 0x0002){ - // ESP_LOGI(GATTS_TABLE_TAG, "indicate enable"); - // uint8_t indicate_data[15]; - // for (int i = 0; i < sizeof(indicate_data); ++i) - // { - // indicate_data[i] = i % 0xff; - // } - // //the size of indicate_data[] need less than MTU size - // esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, heart_rate_handle_table[IDX_CHAR_VAL_A], - // sizeof(indicate_data), indicate_data, true); - // } - else if (descr_value == 0x0000){ - ESP_LOGI(GATTS_TABLE_TAG, "notify/indicate disable "); - data_notify_enable = false; - }else{ - ESP_LOGE(GATTS_TABLE_TAG, "unknown descr value"); - esp_log_buffer_hex(GATTS_TABLE_TAG, param->write.value, param->write.len); - } - - } - /* send response when param->write.need_rsp is true*/ - if (param->write.need_rsp){ - esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL); - } - }else{ - /* handle prepare write */ - example_prepare_write_event_env(gatts_if, &prepare_write_env, param); - } - break; - case ESP_GATTS_EXEC_WRITE_EVT: - // the length of gattc prepare write data must be less than GATTS_DEMO_CHAR_VAL_LEN_MAX. - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_EXEC_WRITE_EVT"); - example_exec_write_event_env(&prepare_write_env, param); - break; - case ESP_GATTS_MTU_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu); - break; - case ESP_GATTS_CONF_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_CONF_EVT, status = %d, attr_handle %d", param->conf.status, param->conf.handle); - break; - case ESP_GATTS_START_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "SERVICE_START_EVT, status %d, service_handle %d", param->start.status, param->start.service_handle); - break; - case ESP_GATTS_CONNECT_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_CONNECT_EVT, conn_id = %d", param->connect.conn_id); - esp_log_buffer_hex(GATTS_TABLE_TAG, param->connect.remote_bda, 6); - esp_ble_conn_update_params_t conn_params = {0}; - memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t)); - /* For the iOS system, please refer to Apple official documents about the BLE connection parameters restrictions. */ - conn_params.latency = 0; - conn_params.max_int = 0x20; // max_int = 0x20*1.25ms = 40ms - conn_params.min_int = 0x10; // min_int = 0x10*1.25ms = 20ms - conn_params.timeout = 400; // timeout = 400*10ms = 4000ms - //start sent the update connection parameters to the peer device. - esp_ble_gap_update_conn_params(&conn_params); - is_connected = true; - spp_conn_id = param->connect.conn_id; - spp_gatts_if = gatts_if; - break; - case ESP_GATTS_DISCONNECT_EVT: - ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_DISCONNECT_EVT, reason = 0x%x", param->disconnect.reason); - esp_ble_gap_start_advertising(&adv_params); - is_connected = false; - break; - case ESP_GATTS_CREAT_ATTR_TAB_EVT:{ - if (param->add_attr_tab.status != ESP_GATT_OK){ - ESP_LOGE(GATTS_TABLE_TAG, "create attribute table failed, error code=0x%x", param->add_attr_tab.status); - } - else if (param->add_attr_tab.num_handle != HRS_IDX_NB){ - ESP_LOGE(GATTS_TABLE_TAG, "create attribute table abnormally, num_handle (%d) \ - doesn't equal to HRS_IDX_NB(%d)", param->add_attr_tab.num_handle, HRS_IDX_NB); - } - else { - ESP_LOGI(GATTS_TABLE_TAG, "create attribute table successfully, the number handle = %d\n",param->add_attr_tab.num_handle); - memcpy(heart_rate_handle_table, param->add_attr_tab.handles, sizeof(heart_rate_handle_table)); - esp_ble_gatts_start_service(heart_rate_handle_table[IDX_SVC]); - } - break; - } - case ESP_GATTS_STOP_EVT: - case ESP_GATTS_OPEN_EVT: - case ESP_GATTS_CANCEL_OPEN_EVT: - case ESP_GATTS_CLOSE_EVT: - case ESP_GATTS_LISTEN_EVT: - case ESP_GATTS_CONGEST_EVT: - case ESP_GATTS_UNREG_EVT: - case ESP_GATTS_DELETE_EVT: - default: - break; - } -} - - -static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) -{ - - /* If event is register event, store the gatts_if for each profile */ - if (event == ESP_GATTS_REG_EVT) { - if (param->reg.status == ESP_GATT_OK) { - heart_rate_profile_tab[PROFILE_APP_IDX].gatts_if = gatts_if; - } else { - ESP_LOGE(GATTS_TABLE_TAG, "reg app failed, app_id %04x, status %d", - param->reg.app_id, - param->reg.status); - return; - } - } - do { - int idx; - for (idx = 0; idx < PROFILE_NUM; idx++) { - /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */ - if (gatts_if == ESP_GATT_IF_NONE || gatts_if == heart_rate_profile_tab[idx].gatts_if) { - if (heart_rate_profile_tab[idx].gatts_cb) { - heart_rate_profile_tab[idx].gatts_cb(event, gatts_if, param); - } - } - } - } while (0); -} - - -/* - * 上报长度过长,则分包,这里限制长度最大20,分包协议: - * [1:0] ‘#’, ‘#’,分包标识 - * [2] 总包个数 - * [3] 当前包号,从0开始 - * ... 包数据 - */ -static uint16_t spp_mtu_size = 23; -void notify_data_fun(int id, uint8_t *data, uint32_t len) -{ - ESP_LOGI(GATTS_TABLE_TAG, "notify_data_fun:"); - esp_log_buffer_hex(GATTS_TABLE_TAG, data, len); - ESP_LOGI(GATTS_TABLE_TAG, "hihi"); - if (len <= spp_mtu_size - 3) /* 包数据可以一次完整发送 */ - { - esp_ble_gatts_send_indicate(spp_gatts_if, spp_conn_id, heart_rate_handle_table[id], len, data, false); - } - else /* 需要分包发送 */ - { - int total_num = 0; - uint8_t buf[spp_mtu_size - 3]; - if ((len % (spp_mtu_size - 7)) == 0) - total_num = len / (spp_mtu_size - 7); - else - total_num = len / (spp_mtu_size - 7) + 1; - ESP_LOGI(GATTS_TABLE_TAG, "notify packet has %d", total_num); - - int i = 0; - buf[0] = '#'; - buf[1] = '#'; - buf[2] = total_num; - for (i = 0; i < total_num - 1; i++) - { - buf[3] = i; - memcpy(buf + 4, data + i * (spp_mtu_size - 7), spp_mtu_size - 7); - esp_ble_gatts_send_indicate(spp_gatts_if, spp_conn_id, heart_rate_handle_table[SPP_IDX_SPP_DATA_NTY_VAL],spp_mtu_size - 3, buf, false); - } - /* 最后一个包 */ - buf[3] = i; - memcpy(buf + 4, data + i * (spp_mtu_size - 7), len % (spp_mtu_size - 7)); - esp_ble_gatts_send_indicate(spp_gatts_if, spp_conn_id, heart_rate_handle_table[SPP_IDX_SPP_DATA_NTY_VAL], (len % (spp_mtu_size - 7)) + 4, buf, false); - ESP_LOGI(GATTS_TABLE_TAG, "notify packet send end!"); - } -} - -uint8_t notify_data[500] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; /* 外部程序可以将需要上报的数据拷贝进来 */ -uint32_t notify_len = 63; -void notify_task(void *pvParameters) -{ - while (1) - { - if (data_notify_enable && is_connected) - { - notify_data_fun(SPP_IDX_SPP_DATA_NTY_VAL, notify_data, notify_len); - } - int i; - for (i = 0; i < notify_len; i++) notify_data[i]++; - vTaskDelay(pdMS_TO_TICKS(1000)); - vTaskDelay(pdMS_TO_TICKS(1000)); - } - - vTaskDelete(NULL); -} - -void ble_gatts_server_init(void) -{ - esp_err_t ret; - - ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)); - - esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); - ret = esp_bt_controller_init(&bt_cfg); - if (ret) { - ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %s", __func__, esp_err_to_name(ret)); - return; - } - - ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); - if (ret) { - ESP_LOGE(GATTS_TABLE_TAG, "%s enable controller failed: %s", __func__, esp_err_to_name(ret)); - return; - } - - ret = esp_bluedroid_init(); - if (ret) { - ESP_LOGE(GATTS_TABLE_TAG, "%s init bluetooth failed: %s", __func__, esp_err_to_name(ret)); - return; - } - - ret = esp_bluedroid_enable(); - if (ret) { - ESP_LOGE(GATTS_TABLE_TAG, "%s enable bluetooth failed: %s", __func__, esp_err_to_name(ret)); - return; - } - - ret = esp_ble_gatts_register_callback(gatts_event_handler); - if (ret){ - ESP_LOGE(GATTS_TABLE_TAG, "gatts register error, error code = %x", ret); - return; - } - - ret = esp_ble_gap_register_callback(gap_event_handler); - if (ret){ - ESP_LOGE(GATTS_TABLE_TAG, "gap register error, error code = %x", ret); - return; - } - - ret = esp_ble_gatts_app_register(ESP_APP_ID); - if (ret){ - ESP_LOGE(GATTS_TABLE_TAG, "gatts app register error, error code = %x", ret); - return; - } - - esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500); - if (local_mtu_ret){ - ESP_LOGE(GATTS_TABLE_TAG, "set local MTU failed, error code = %x", local_mtu_ret); - } - - /* 创建任务用于定期的数据上报notify */ - xTaskCreate(notify_task, "notify_Task", 4096, NULL, 8, NULL); -} diff --git a/main/tmp/ble_gatts_server.h b/main/tmp/ble_gatts_server.h deleted file mode 100644 index 96d3d16..0000000 --- a/main/tmp/ble_gatts_server.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __BLE_GATTS_SERVER_H -#define __BLE_GATTS_SERVER_H - -#include -#include -#include - - -#define SPP_DATA_MAX_LEN (512) - - -/* Attributes State Machine */ -enum -{ - IDX_SVC, - - /* gWordVar data write */ - IDX_CHAR_A, - IDX_CHAR_VAL_A, - IDX_CHAR_CFG_A, - - /* gWordVar data notify */ - SPP_IDX_SPP_DATA_NOTIFY_CHAR, - SPP_IDX_SPP_DATA_NTY_VAL, - SPP_IDX_SPP_DATA_NTF_CFG, - - - HRS_IDX_NB, -}; - -/* 定时上报的数据内容 */ -extern uint8_t notify_data[500]; -extern uint32_t notify_len; - -void ble_gatts_server_init(void); - -#endif \ No newline at end of file