BLE无法发送正确的温度测量字符值0x2A1C

问题描述 投票:0回答:1

硬件(BLE 服务器):ESP32-C3-DevKitM-1

移动应用程序(BLE 客户端):nRF Connect

示例代码:Gatt_Server_Service_Table

IDE:ESP-IDE

我想要BLE标准环境传感服务(ESS 0x181A),温度测量特性(0x2A1C)。

如何以正确的格式发送25.63℃等温度浮点值?如果我使用 uint8_t ess_Temperature[] = {0x00, 0x03, 0x0A, 0x00,0x00}; 它会显示 2563.00℃,但我想显示 25.63℃。

enum{
ESS_SERVICE,

ESS_TEMPERATURE_CHAR,
ESS_TEMPERATURE_VALUE,
ESS_TEMPERATURE_CFG,

ESS_HUMIDITY_SERVICE,
ESS_HUMIDITY_VAL,
ESS_HUMIDITY_CFG,

ESS_IDX_NB,
};

// =============== ESS Service ===============
static const uint16_t GATTS_SERVICE_UUID_ESS                = 0x181A;
static const uint16_t GATTS_CHAR_UUID_ESS_TEMPERATURE       = 0x2A1C;
static const uint16_t GATTS_CHAR_UUID_ESS_HUMIDITY          = 0x2A6F;
//static const uint8_t ess_temperature[2]                   = {0x19, 0x05};     // = 25.5 degC
// static const uint8_t ess_temperature_ccc[2]              = {0x00, 0x00};
//static const uint8_t ess_humidity[2]                          = {0x0B, 0x05};     // = 11.5%
// static const uint8_t ess_humidity_ccc[2]                 = {0x00, 0x00};
uint8_t ess_temperature[5] = {0x00,0x41, 0x33, 0xB9, 0xD7};
static const uint16_t ess_humidity = 3556;     // nRF Connect App will divide this value by 100. For example, if we use 3654, App will show 36.54% humidity



static const esp_gatts_attr_db_t ess_gatt_db[ESS_IDX_NB] =
{
    [ESS_SERVICE]        =
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ,
    sizeof(uint16_t), sizeof(GATTS_SERVICE_UUID_ESS), (uint8_t *)&GATTS_SERVICE_UUID_ESS}},

    // Temperature -------------------------------------------------
    [ESS_TEMPERATURE_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}},

    [ESS_TEMPERATURE_VALUE] =
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&GATTS_CHAR_UUID_ESS_TEMPERATURE, ESP_GATT_PERM_READ,
    GATTS_DEMO_CHAR_VAL_LEN_MAX, sizeof(ess_temperature), (uint8_t *)&ess_temperature}},

    [ESS_TEMPERATURE_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(cccd_disable_notify_indicate), (uint8_t *)cccd_disable_notify_indicate}},

    // Humidity -------------------------------------------
    [ESS_HUMIDITY_SERVICE]      =
    {{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}},

    [ESS_HUMIDITY_VAL]  =
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&GATTS_CHAR_UUID_ESS_HUMIDITY, ESP_GATT_PERM_READ,
    GATTS_DEMO_CHAR_VAL_LEN_MAX, sizeof(ess_humidity), (uint8_t *)&ess_humidity}},

    [ESS_HUMIDITY_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(cccd_disable_notify_indicate), (uint8_t *)cccd_disable_notify_indicate}},
};

enter image description here

bluetooth-lowenergy esp32
1个回答
0
投票

根据 GATT 规范补充,第 1 章。 3.222温度测量,数据类型为medfloat32,在IEEE 11073-20601中定义。

这里是如何转换浮点值的说明:https://stackoverflow.com/a/60843099/8124605

例如,25.63℃的值可编码为

Exponent: 0xFE     -> -2

Mantissa: 0x000A03 -> 2563

uint8_t ess_temperature[] = {0x00, 0xFE, 0x00, 0x0A, 0x03};
© www.soinside.com 2019 - 2024. All rights reserved.