蓝牙测试gatt_server

代码位置

C:\Espressif\frameworks\esp-idf-v4.4\examples\bluetooth\bluedroid\ble\gatt_server

run起来以后 ESP32会发广播 

手机APP可以连接到它

看到它的服务

可以和它TXRX(类似于NUS吧)

其实蓝牙就2个东西 一个是GAP----负责广播连接这些事情 也就是连接之前的事情 GATT---负责服务也就是连接以后的事情

也就是这是个从机的代码

esp32蓝牙从机给一个service增加两个char - 红旭无线

How to use function esp_ble_gatts_add_char twince in examples\bluetooth\bluedroid\ble\gatt_server (IDFGH-6165) · Issue #7842 · espressif/esp-idf · GitHubDevelopment Kit: ESP32-DevKitC Kit version (for WroverKit/PicoKit/DevKitC): [v4] Module or chip used: ESP32-WROOM-32 hi when i run examples\bluetooth\bluedroid\ble\gatt_server\main\gatts_demo.c examples\bluetooth\bluedroid\ble\gatt_clien...https://github.com/espressif/esp-idf/issues/7842

为了做网关 需要换一个代码 需要的是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值