mirror of
https://github.com/esphome/esphome.git
synced 2026-05-28 21:59:59 +08:00
[packet_transport] Ensure retransmission at update intervals (#12472)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -13,7 +13,7 @@ static const char *const TAG = "espnow.transport";
|
|||||||
bool ESPNowTransport::should_send() { return this->parent_ != nullptr && !this->parent_->is_failed(); }
|
bool ESPNowTransport::should_send() { return this->parent_ != nullptr && !this->parent_->is_failed(); }
|
||||||
|
|
||||||
void ESPNowTransport::setup() {
|
void ESPNowTransport::setup() {
|
||||||
packet_transport::PacketTransport::setup();
|
PacketTransport::setup();
|
||||||
|
|
||||||
if (this->parent_ == nullptr) {
|
if (this->parent_ == nullptr) {
|
||||||
ESP_LOGE(TAG, "ESPNow component not set");
|
ESP_LOGE(TAG, "ESPNow component not set");
|
||||||
@@ -26,15 +26,10 @@ void ESPNowTransport::setup() {
|
|||||||
this->peer_address_[2], this->peer_address_[3], this->peer_address_[4], this->peer_address_[5]);
|
this->peer_address_[2], this->peer_address_[3], this->peer_address_[4], this->peer_address_[5]);
|
||||||
|
|
||||||
// Register received handler
|
// Register received handler
|
||||||
this->parent_->register_received_handler(static_cast<ESPNowReceivedPacketHandler *>(this));
|
this->parent_->register_received_handler(this);
|
||||||
|
|
||||||
// Register broadcasted handler
|
// Register broadcasted handler
|
||||||
this->parent_->register_broadcasted_handler(static_cast<ESPNowBroadcastedHandler *>(this));
|
this->parent_->register_broadcasted_handler(this);
|
||||||
}
|
|
||||||
|
|
||||||
void ESPNowTransport::update() {
|
|
||||||
packet_transport::PacketTransport::update();
|
|
||||||
this->updated_ = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ESPNowTransport::send_packet(const std::vector<uint8_t> &buf) const {
|
void ESPNowTransport::send_packet(const std::vector<uint8_t> &buf) const {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class ESPNowTransport : public packet_transport::PacketTransport,
|
|||||||
public ESPNowBroadcastedHandler {
|
public ESPNowBroadcastedHandler {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void update() override;
|
|
||||||
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
||||||
|
|
||||||
void set_peer_address(peer_address_t address) {
|
void set_peer_address(peer_address_t address) {
|
||||||
|
|||||||
@@ -176,17 +176,22 @@ async def register_packet_transport(var, config):
|
|||||||
if encryption := provider.get(CONF_ENCRYPTION):
|
if encryption := provider.get(CONF_ENCRYPTION):
|
||||||
cg.add(var.set_provider_encryption(name, hash_encryption_key(encryption)))
|
cg.add(var.set_provider_encryption(name, hash_encryption_key(encryption)))
|
||||||
|
|
||||||
|
is_provider = False
|
||||||
for sens_conf in config.get(CONF_SENSORS, ()):
|
for sens_conf in config.get(CONF_SENSORS, ()):
|
||||||
|
is_provider = True
|
||||||
sens_id = sens_conf[CONF_ID]
|
sens_id = sens_conf[CONF_ID]
|
||||||
sensor = await cg.get_variable(sens_id)
|
sensor = await cg.get_variable(sens_id)
|
||||||
bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
|
bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
|
||||||
cg.add(var.add_sensor(bcst_id, sensor))
|
cg.add(var.add_sensor(bcst_id, sensor))
|
||||||
for sens_conf in config.get(CONF_BINARY_SENSORS, ()):
|
for sens_conf in config.get(CONF_BINARY_SENSORS, ()):
|
||||||
|
is_provider = True
|
||||||
sens_id = sens_conf[CONF_ID]
|
sens_id = sens_conf[CONF_ID]
|
||||||
sensor = await cg.get_variable(sens_id)
|
sensor = await cg.get_variable(sens_id)
|
||||||
bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
|
bcst_id = sens_conf.get(CONF_BROADCAST_ID, sens_id.id)
|
||||||
cg.add(var.add_binary_sensor(bcst_id, sensor))
|
cg.add(var.add_binary_sensor(bcst_id, sensor))
|
||||||
|
|
||||||
|
if is_provider:
|
||||||
|
cg.add(var.set_is_provider(True))
|
||||||
if encryption := config.get(CONF_ENCRYPTION):
|
if encryption := config.get(CONF_ENCRYPTION):
|
||||||
cg.add(var.set_encryption_key(hash_encryption_key(encryption)))
|
cg.add(var.set_encryption_key(hash_encryption_key(encryption)))
|
||||||
return providers
|
return providers
|
||||||
|
|||||||
@@ -263,6 +263,7 @@ void PacketTransport::flush_() {
|
|||||||
xxtea::encrypt((uint32_t *) (encode_buffer.data() + header_len), len / 4,
|
xxtea::encrypt((uint32_t *) (encode_buffer.data() + header_len), len / 4,
|
||||||
(uint32_t *) this->encryption_key_.data());
|
(uint32_t *) this->encryption_key_.data());
|
||||||
}
|
}
|
||||||
|
ESP_LOGVV(TAG, "Sending packet %s", format_hex_pretty(encode_buffer.data(), encode_buffer.size()).c_str());
|
||||||
this->send_packet(encode_buffer);
|
this->send_packet(encode_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,6 +317,9 @@ void PacketTransport::send_data_(bool all) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PacketTransport::update() {
|
void PacketTransport::update() {
|
||||||
|
// resend all sensors if required
|
||||||
|
if (this->is_provider_)
|
||||||
|
this->send_data_(true);
|
||||||
if (!this->ping_pong_enable_) {
|
if (!this->ping_pong_enable_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -551,7 +555,7 @@ void PacketTransport::loop() {
|
|||||||
if (this->resend_ping_key_)
|
if (this->resend_ping_key_)
|
||||||
this->send_ping_pong_request_();
|
this->send_ping_pong_request_();
|
||||||
if (this->updated_) {
|
if (this->updated_) {
|
||||||
this->send_data_(this->resend_data_);
|
this->send_data_(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ class PacketTransport : public PollingComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_is_provider(bool is_provider) { this->is_provider_ = is_provider; }
|
||||||
void set_encryption_key(std::vector<uint8_t> key) { this->encryption_key_ = std::move(key); }
|
void set_encryption_key(std::vector<uint8_t> key) { this->encryption_key_ = std::move(key); }
|
||||||
void set_rolling_code_enable(bool enable) { this->rolling_code_enable_ = enable; }
|
void set_rolling_code_enable(bool enable) { this->rolling_code_enable_ = enable; }
|
||||||
void set_ping_pong_enable(bool enable) { this->ping_pong_enable_ = enable; }
|
void set_ping_pong_enable(bool enable) { this->ping_pong_enable_ = enable; }
|
||||||
@@ -129,7 +130,7 @@ class PacketTransport : public PollingComponent {
|
|||||||
uint32_t ping_pong_recyle_time_{};
|
uint32_t ping_pong_recyle_time_{};
|
||||||
uint32_t last_key_time_{};
|
uint32_t last_key_time_{};
|
||||||
bool resend_ping_key_{};
|
bool resend_ping_key_{};
|
||||||
bool resend_data_{};
|
bool is_provider_{};
|
||||||
const char *name_{};
|
const char *name_{};
|
||||||
ESPPreferenceObject pref_{};
|
ESPPreferenceObject pref_{};
|
||||||
|
|
||||||
|
|||||||
@@ -12,12 +12,6 @@ void SX126xTransport::setup() {
|
|||||||
this->parent_->register_listener(this);
|
this->parent_->register_listener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SX126xTransport::update() {
|
|
||||||
PacketTransport::update();
|
|
||||||
this->updated_ = true;
|
|
||||||
this->resend_data_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SX126xTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->transmit_packet(buf); }
|
void SX126xTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->transmit_packet(buf); }
|
||||||
|
|
||||||
void SX126xTransport::on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) { this->process_(packet); }
|
void SX126xTransport::on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) { this->process_(packet); }
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ namespace sx126x {
|
|||||||
class SX126xTransport : public packet_transport::PacketTransport, public Parented<SX126x>, public SX126xListener {
|
class SX126xTransport : public packet_transport::PacketTransport, public Parented<SX126x>, public SX126xListener {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void update() override;
|
|
||||||
void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) override;
|
void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) override;
|
||||||
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
||||||
|
|
||||||
|
|||||||
@@ -12,12 +12,6 @@ void SX127xTransport::setup() {
|
|||||||
this->parent_->register_listener(this);
|
this->parent_->register_listener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SX127xTransport::update() {
|
|
||||||
PacketTransport::update();
|
|
||||||
this->updated_ = true;
|
|
||||||
this->resend_data_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SX127xTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->transmit_packet(buf); }
|
void SX127xTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->transmit_packet(buf); }
|
||||||
|
|
||||||
void SX127xTransport::on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) { this->process_(packet); }
|
void SX127xTransport::on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) { this->process_(packet); }
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ namespace sx127x {
|
|||||||
class SX127xTransport : public packet_transport::PacketTransport, public Parented<SX127x>, public SX127xListener {
|
class SX127xTransport : public packet_transport::PacketTransport, public Parented<SX127x>, public SX127xListener {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void update() override;
|
|
||||||
void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) override;
|
void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) override;
|
||||||
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,6 @@ void UARTTransport::loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UARTTransport::update() {
|
|
||||||
this->updated_ = true;
|
|
||||||
this->resend_data_ = true;
|
|
||||||
PacketTransport::update();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a byte to the UART bus. If the byte is a flag or control byte, it will be escaped.
|
* Write a byte to the UART bus. If the byte is a flag or control byte, it will be escaped.
|
||||||
* @param byte The byte to write.
|
* @param byte The byte to write.
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ static const uint8_t CONTROL_BYTE = 0x7D;
|
|||||||
class UARTTransport : public packet_transport::PacketTransport, public UARTDevice {
|
class UARTTransport : public packet_transport::PacketTransport, public UARTDevice {
|
||||||
public:
|
public:
|
||||||
void loop() override;
|
void loop() override;
|
||||||
void update() override;
|
|
||||||
float get_setup_priority() const override { return setup_priority::PROCESSOR; }
|
float get_setup_priority() const override { return setup_priority::PROCESSOR; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -8,29 +8,14 @@ namespace udp {
|
|||||||
|
|
||||||
static const char *const TAG = "udp_transport";
|
static const char *const TAG = "udp_transport";
|
||||||
|
|
||||||
bool UDPTransport::should_send() { return this->should_broadcast_ && network::is_connected(); }
|
bool UDPTransport::should_send() { return network::is_connected(); }
|
||||||
void UDPTransport::setup() {
|
void UDPTransport::setup() {
|
||||||
PacketTransport::setup();
|
PacketTransport::setup();
|
||||||
this->should_broadcast_ = this->ping_pong_enable_;
|
|
||||||
#ifdef USE_SENSOR
|
|
||||||
this->should_broadcast_ |= !this->sensors_.empty();
|
|
||||||
#endif
|
|
||||||
#ifdef USE_BINARY_SENSOR
|
|
||||||
this->should_broadcast_ |= !this->binary_sensors_.empty();
|
|
||||||
#endif
|
|
||||||
if (this->should_broadcast_)
|
|
||||||
this->parent_->set_should_broadcast();
|
|
||||||
if (!this->providers_.empty() || this->is_encrypted_()) {
|
if (!this->providers_.empty() || this->is_encrypted_()) {
|
||||||
this->parent_->add_listener([this](std::vector<uint8_t> &buf) { this->process_(buf); });
|
this->parent_->add_listener([this](std::vector<uint8_t> &buf) { this->process_(buf); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPTransport::update() {
|
|
||||||
PacketTransport::update();
|
|
||||||
this->updated_ = true;
|
|
||||||
this->resend_data_ = this->should_broadcast_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UDPTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->send_packet(buf); }
|
void UDPTransport::send_packet(const std::vector<uint8_t> &buf) const { this->parent_->send_packet(buf); }
|
||||||
} // namespace udp
|
} // namespace udp
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|||||||
@@ -12,14 +12,12 @@ namespace udp {
|
|||||||
class UDPTransport : public packet_transport::PacketTransport, public Parented<UDPComponent> {
|
class UDPTransport : public packet_transport::PacketTransport, public Parented<UDPComponent> {
|
||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void update() override;
|
|
||||||
|
|
||||||
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void send_packet(const std::vector<uint8_t> &buf) const override;
|
void send_packet(const std::vector<uint8_t> &buf) const override;
|
||||||
bool should_send() override;
|
bool should_send() override;
|
||||||
bool should_broadcast_{false};
|
|
||||||
size_t get_max_packet_size() override { return MAX_PACKET_SIZE; }
|
size_t get_max_packet_size() override { return MAX_PACKET_SIZE; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ packet_transport:
|
|||||||
sensors:
|
sensors:
|
||||||
- temp_sensor
|
- temp_sensor
|
||||||
providers:
|
providers:
|
||||||
- name: test_provider
|
- name: test-provider
|
||||||
encryption:
|
encryption:
|
||||||
key: "0123456789abcdef0123456789abcdef"
|
key: "0123456789abcdef0123456789abcdef"
|
||||||
|
|
||||||
@@ -71,6 +71,6 @@ sensor:
|
|||||||
id: temp_sensor
|
id: temp_sensor
|
||||||
|
|
||||||
- platform: packet_transport
|
- platform: packet_transport
|
||||||
provider: test_provider
|
provider: test-provider
|
||||||
remote_id: temp_sensor
|
remote_id: temp_sensor
|
||||||
id: remote_temp
|
id: remote_temp
|
||||||
|
|||||||
Reference in New Issue
Block a user