跳转到内容

UDP 组件

此组件允许使用用户数据报协议 (UDP) 在网络上接收和发送数据。 结合数据包传输组件,它可用于广播传感器数据。

# 示例配置条目
udp:
listen_address: 239.0.60.53
addresses: ["255.255.255.255", "208.87.135.110"]
  • id (可选, ID): 手动指定用于代码生成的 ID。

  • port (可选, 整数): 要使用的目标 UDP 端口号。默认为 18511。可以通过映射而不是单个端口号指定不同的监听端口和广播端口:

    • listen_port (必填, 整数): 用于接收数据包的端口。
    • broadcast_port (必填, 整数): 用于发送数据包的端口。
  • addresses (可选, IPv4 地址列表): 一个或多个用于广播数据的 IP 地址。默认为 255.255.255.255 即本地网络广播地址。

  • listen_address (可选, IPv4 地址): 更改为多播,添加一个用于监听的地址。默认为无多播地址,仅 本地网络广播地址 255.255.255.255注意: 添加多播地址将停止在广播地址上监听。

UDP 与任何其他网络协议一样,不保证数据会被传递,但与 TCP 不同,它甚至 不提供任何关于数据是否已成功传递的指示。

要向 UDP 端口写入数据,请使用 udp.write 动作。此动作接受一个参数,即要写入 UDP 端口的数据。

  • id (可选, ID): 要使用的 UDP 组件的 id。如果只有一个 UDP 组件,可以省略。
  • data (必填, 可模板化, 字符串或字节列表): 要写入 UDP 端口的数据。

要在 UDP 端口接收到数据时触发动作,请使用 on_receive 触发器。触发器使用单个参数 data 调用,表示接收数据的 std::vector<uint8_t>

udp:
on_receive:
then:
- logger.log:
format: "收到 %s"
args: [format_hex_pretty(data).c_str()]

有关如何使用此组件的示例,请参阅数据包传输组件

下面显示了一个更复杂的示例:

下面的示例显示了一个提供者设备将数据分离发送给不同的消费者。有两个提供者配置,具有不同的 ID。 transport_internal 提供者每 10 秒以纯文本格式向所有网络成员广播所选传感器状态,而 transport_external 提供者将其他传感器数据发送到外部 IP 地址和端口,并进行加密。该节点还通过 transport_external 配置中指定的端口监听来自 remote-node 的数据:

udp:
- id: udp_internal
- id: udp_external
port:
listen_port: 18511
broadcast_port: 18512
addresses:
- 10.87.135.110
packet_transport:
- id: transport_internal
udp_id: udp_internal
update_interval: 10s
sensors:
- temp_outdoor
- temp_rooma
- temp_roomb
- temp_roomc
- temp_garage
- temp_water
- humi_rooma
- humi_roomb
- humi_roomc
- id: transport_external
udp_id: udp_external
update_interval: 60s
encryption: "Muddy Waters"
ping_pong_enable: true
rolling_code_enable: true
binary_sensors:
- binary_sensor_door
sensors:
- temp_outdoor
binary_sensor:
- platform: packet_transport
id: binary_sensor_unlock
transport_id: transport_external
provider: remote-node
remote_id: binary_sensor_unlock_me
on_press:
- lambda: |-
ESP_LOGI("main", "d command to binary_sensor_unlock");