硬件(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}},
};
根据 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};