mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	esp32_improv advertise capabilities and state in ble service data (#5553)
This commit is contained in:
		| @@ -2,9 +2,9 @@ | |||||||
|  |  | ||||||
| #ifdef USE_ESP32 | #ifdef USE_ESP32 | ||||||
|  |  | ||||||
| #include "ble_uuid.h" |  | ||||||
| #include <cstring> |  | ||||||
| #include <cstdio> | #include <cstdio> | ||||||
|  | #include <cstring> | ||||||
|  | #include "ble_uuid.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| @@ -16,8 +16,8 @@ BLEAdvertising::BLEAdvertising() { | |||||||
|   this->advertising_data_.set_scan_rsp = false; |   this->advertising_data_.set_scan_rsp = false; | ||||||
|   this->advertising_data_.include_name = true; |   this->advertising_data_.include_name = true; | ||||||
|   this->advertising_data_.include_txpower = true; |   this->advertising_data_.include_txpower = true; | ||||||
|   this->advertising_data_.min_interval = 0x20; |   this->advertising_data_.min_interval = 0; | ||||||
|   this->advertising_data_.max_interval = 0x40; |   this->advertising_data_.max_interval = 0; | ||||||
|   this->advertising_data_.appearance = 0x00; |   this->advertising_data_.appearance = 0x00; | ||||||
|   this->advertising_data_.manufacturer_len = 0; |   this->advertising_data_.manufacturer_len = 0; | ||||||
|   this->advertising_data_.p_manufacturer_data = nullptr; |   this->advertising_data_.p_manufacturer_data = nullptr; | ||||||
| @@ -42,6 +42,17 @@ void BLEAdvertising::remove_service_uuid(ESPBTUUID uuid) { | |||||||
|                                  this->advertising_uuids_.end()); |                                  this->advertising_uuids_.end()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void BLEAdvertising::set_service_data(const std::vector<uint8_t> &data) { | ||||||
|  |   delete[] this->advertising_data_.p_service_data; | ||||||
|  |   this->advertising_data_.p_service_data = nullptr; | ||||||
|  |   this->advertising_data_.service_data_len = data.size(); | ||||||
|  |   if (!data.empty()) { | ||||||
|  |     // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) | ||||||
|  |     this->advertising_data_.p_service_data = new uint8_t[data.size()]; | ||||||
|  |     memcpy(this->advertising_data_.p_service_data, data.data(), data.size()); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| void BLEAdvertising::set_manufacturer_data(const std::vector<uint8_t> &data) { | void BLEAdvertising::set_manufacturer_data(const std::vector<uint8_t> &data) { | ||||||
|   delete[] this->advertising_data_.p_manufacturer_data; |   delete[] this->advertising_data_.p_manufacturer_data; | ||||||
|   this->advertising_data_.p_manufacturer_data = nullptr; |   this->advertising_data_.p_manufacturer_data = nullptr; | ||||||
| @@ -85,8 +96,6 @@ void BLEAdvertising::start() { | |||||||
|     this->scan_response_data_.set_scan_rsp = true; |     this->scan_response_data_.set_scan_rsp = true; | ||||||
|     this->scan_response_data_.include_name = true; |     this->scan_response_data_.include_name = true; | ||||||
|     this->scan_response_data_.include_txpower = true; |     this->scan_response_data_.include_txpower = true; | ||||||
|     this->scan_response_data_.min_interval = 0; |  | ||||||
|     this->scan_response_data_.max_interval = 0; |  | ||||||
|     this->scan_response_data_.manufacturer_len = 0; |     this->scan_response_data_.manufacturer_len = 0; | ||||||
|     this->scan_response_data_.appearance = 0; |     this->scan_response_data_.appearance = 0; | ||||||
|     this->scan_response_data_.flag = 0; |     this->scan_response_data_.flag = 0; | ||||||
|   | |||||||
| @@ -21,6 +21,7 @@ class BLEAdvertising { | |||||||
|   void set_scan_response(bool scan_response) { this->scan_response_ = scan_response; } |   void set_scan_response(bool scan_response) { this->scan_response_ = scan_response; } | ||||||
|   void set_min_preferred_interval(uint16_t interval) { this->advertising_data_.min_interval = interval; } |   void set_min_preferred_interval(uint16_t interval) { this->advertising_data_.min_interval = interval; } | ||||||
|   void set_manufacturer_data(const std::vector<uint8_t> &data); |   void set_manufacturer_data(const std::vector<uint8_t> &data); | ||||||
|  |   void set_service_data(const std::vector<uint8_t> &data); | ||||||
|  |  | ||||||
|   void start(); |   void start(); | ||||||
|   void stop(); |   void stop(); | ||||||
|   | |||||||
| @@ -189,6 +189,25 @@ void ESP32ImprovComponent::set_state_(improv::State state) { | |||||||
|     if (state != improv::STATE_STOPPED) |     if (state != improv::STATE_STOPPED) | ||||||
|       this->status_->notify(); |       this->status_->notify(); | ||||||
|   } |   } | ||||||
|  |   std::vector<uint8_t> service_data(8, 0); | ||||||
|  |   service_data[0] = 0x77;  // PR | ||||||
|  |   service_data[1] = 0x46;  // IM | ||||||
|  |   service_data[2] = static_cast<uint8_t>(state); | ||||||
|  |  | ||||||
|  |   uint8_t capabilities = 0x00; | ||||||
|  | #ifdef USE_OUTPUT | ||||||
|  |   if (this->status_indicator_ != nullptr) | ||||||
|  |     capabilities |= improv::CAPABILITY_IDENTIFY; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   service_data[3] = capabilities; | ||||||
|  |   service_data[4] = 0x00;  // Reserved | ||||||
|  |   service_data[5] = 0x00;  // Reserved | ||||||
|  |   service_data[6] = 0x00;  // Reserved | ||||||
|  |   service_data[7] = 0x00;  // Reserved | ||||||
|  |  | ||||||
|  |   esp32_ble::global_ble->get_advertising()->set_service_data(service_data); | ||||||
|  |   esp32_ble::global_ble->get_advertising()->start(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ESP32ImprovComponent::set_error_(improv::Error error) { | void ESP32ImprovComponent::set_error_(improv::Error error) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user