代码位置
C:\Espressif\frameworks\esp-idf-v4.4\examples\bluetooth\bluedroid\ble\gatt_server
run起来以后 ESP32会发广播
手机APP可以连接到它
看到它的服务
可以和它TXRX(类似于NUS吧)
其实蓝牙就2个东西 一个是GAP----负责广播连接这些事情 也就是连接之前的事情 GATT---负责服务也就是连接以后的事情
也就是这是个从机的代码
esp32蓝牙从机给一个service增加两个char - 红旭无线
为了做网关 需要换一个代码 需要的是client
下面 测试一个server有三个char
一个数组 每一个成员都是 esp_gatts_attr_db_t 数组的数目是HRS_IDX_NB
1---数组的数目是HRS_IDX_NB 这样可以根据枚举代替数组的索引
enum
{
IDX_SVC,
IDX_CHAR_A,
IDX_CHAR_VAL_A,
IDX_CHAR_CFG_A,
IDX_CHAR_B,
IDX_CHAR_VAL_B,
IDX_CHAR_C,
IDX_CHAR_VAL_C,
HRS_IDX_NB,
};
2---每一个成员
typedef struct
{
esp_attr_control_t attr_control; /*!< The attribute control type */
esp_attr_desc_t att_desc; /*!< The attribute type */
} esp_gatts_attr_db_t;
分析一个
[IDX_SVC] = -------------索引是0
{{ESP_GATT_AUTO_RSP}, {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}},
-------结构体第一个成员
esp_attr_control_t attr_control;全部都是ESP_GATT_AUTO_RSP
-------结构体第2个成员
{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}
typedef struct
{
uint16_t uuid_length; /*!< UUID length */ ESP_UUID_LEN_16
uint8_t *uuid_p; /*!< UUID value */ (uint8_t *)&primary_service_uuid
uint16_t perm; /*!< Attribute permission */ ESP_GATT_PERM_READ
uint16_t max_length; /*!< Maximum length of the element*/ sizeof(uint16_t)
uint16_t length; /*!< Current length of the element*/ sizeof(GATTS_SERVICE_UUID_TEST)
uint8_t *value; /*!< Element value array*/ (uint8_t *)&GATTS_SERVICE_UUID_TEST
} esp_attr_desc_t;
第一步 阉割C 【不是必要】
/* Characteristic Declaration */
[IDX_CHAR_C] =
{{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_write}},
/* Characteristic Value */
[IDX_CHAR_VAL_C] =
{{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&GATTS_CHAR_UUID_TEST_C, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
GATTS_DEMO_CHAR_VAL_LEN_MAX, sizeof(char_value), (uint8_t *)char_value}},
enum
{
IDX_SVC,
IDX_CHAR_A,
IDX_CHAR_VAL_A,
IDX_CHAR_CFG_A,
IDX_CHAR_B,
IDX_CHAR_VAL_B,
HRS_IDX_NB,
};
//static const uint16_t GATTS_CHAR_UUID_TEST_C = 0x0003;
//static const uint8_t char_prop_write = ESP_GATT_CHAR_PROP_BIT_WRITE;
第二步修改服务
[IDX_SVC] =
{{ESP_GATT_AUTO_RSP}, {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}},
维持2800不变 UUID改变 也就是修改 GATTS_SERVICE_UUID_TEST
{{ESP_GATT_AUTO_RSP}, {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}},
上面不变
//static const uint16_t GATTS_SERVICE_UUID_TEST = 0x00FF;
static const uint8_t GATTS_SERVICE_UUID_TEST[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E};
看到服务好了
继续看特征 修改为128
//static const uint16_t GATTS_CHAR_UUID_TEST_A = 0x0001;
//static const uint16_t GATTS_CHAR_UUID_TEST_B = 0x0002;
static const uint8_t GATTS_CHAR_UUID_TEST_A[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E};
static const uint8_t GATTS_CHAR_UUID_TEST_B[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E};
[IDX_CHAR_VAL_A] =
{{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_128, (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}},
/* Characteristic Value */
[IDX_CHAR_VAL_B] =
{{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_128, (uint8_t *)&GATTS_CHAR_UUID_TEST_B, ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
GATTS_DEMO_CHAR_VAL_LEN_MAX, sizeof(char_value), (uint8_t *)char_value}},
这样可以一个servise 2个特征
小结
examples\bluetooth\bluedroid\ble\gatt_server_service_table\main\gatts_table_creat_demo.c
//static const uint16_t GATTS_SERVICE_UUID_TEST = 0x00FF;
//static const uint16_t GATTS_CHAR_UUID_TEST_A = 0x0001;
//static const uint16_t GATTS_CHAR_UUID_TEST_B = 0x0002;
static const uint8_t GATTS_CHAR_UUID_TEST_A[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E};
static const uint8_t GATTS_CHAR_UUID_TEST_B[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E};
static const uint8_t GATTS_SERVICE_UUID_TEST[16] = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E};
[IDX_CHAR_VAL_A] =
{{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_128
[IDX_CHAR_VAL_B] =
{{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_128