项目案例
数据推送到 UDP

数据推送 UDP

RHILEX 支持将采集到的数据推送到 UDP 服务端。

实例

新建 UDP 北向资源

udp

新建规则

在接入设备操作界面给设备配置脚本:

rule

编写脚本

Lua
  Actions = {
    function(args)
        local dataT, err = json:J2T(args)
        if (err ~= nil) then
            Throw(err)
            return true, args
        end
        for _, value in pairs(dataT) do
            local params = {}
            params[value['tag']] = value.value
            local json = json:T2J({
                id = time:TimeMs(),
                method = "thing.event.property.post",
                params = params
            })
            local err = data:ToUdp("$UUID", json)
            if err ~= nil then
                Throw(err)
            end
        end
        return true, args
    end
  }

其中 UUID 参数是一开始建立的 UDP 北向资源的 ID,可以在快捷选择模板里面创建。

测试服务

下面给出一个简单的 Python UDP Server 示例:

Python
import socket
 
 
def main():
    server_address = ("localhost", 5557)
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        server_socket.bind(server_address)
        print("Server is listening on port 5557...")
        while True:
            data, client_address = server_socket.recvfrom(1024)
            print("Received:", data.decode(), "from", client_address)
 
    except Exception as e:
        print("Error:", e)
 
    finally:
        server_socket.close()
 
 
if __name__ == "__main__":
    main()

UDP 知识

UDP(User Datagram Protocol)是一种无连接的传输层协议,它与 TCP(Transmission Control Protocol)不同,后者提供面向连接的服务。UDP 在数据传输中有一些限制和特点:

  1. 无连接性:UDP 不建立连接,这意味着在发送数据之前不需要进行握手。这使得 UDP 的建立连接和维护状态的开销较小,但同时也可能导致数据包在到达目的地之前丢失。
  2. 不可靠传输:UDP 不保证数据包的可靠传输。这意味着数据包可能丢失、重复或乱序到达。如果需要可靠传输,则需要在上层协议中实现。
  3. 无拥塞控制:UDP 不进行拥塞控制。在网络拥塞时,UDP 不会调整发送速率以减轻网络负载,这可能导致数据包丢失。
  4. 固定最大数据包大小:UDP 数据包的最大大小由网络的 MTU(最大传输单元)决定。如果数据包超过 MTU,它必须被分片,这可能会增加处理和传输的时间。
  5. 安全性:由于 UDP 是无连接的,它不提供任何内置的安全机制,如数据加密或完整性验证。因此,使用 UDP 传输敏感数据时需要额外的安全措施。
  6. 实时性:UDP 以其低延迟和高实时性而著称,这使得它非常适合实时应用,如视频会议、在线游戏和实时监控系统。
  7. 数据包校验和:UDP 提供了数据包校验和,这可以帮助检测数据在传输过程中是否损坏。
  8. 支持多播和广播:UDP 支持多播和广播通信,允许一个数据包被发送到多个目的地。
  9. 网络配置:在某些网络配置中,如 NAT(网络地址转换)或防火墙设置,UDP 通信可能受到限制。
  10. 资源使用:UDP 连接不保留状态,因此它在资源使用方面比 TCP 更高效。

在选择 UDP 或 TCP 时,需要根据应用的需求来决定。例如,对于需要可靠数据传输的应用,TCP 是更好的选择。而对于实时性要求高、对数据包丢失不敏感的应用,如在线游戏,UDP 可能是更合适的选择。

脚本解析

使用到的核心函数:

  • json:J2T:将 JSON String 转为 Lua 的表
  • json:T2J:将 Lua 的表转转为 JSON String
  • data:ToUdp:数据转发到 UDP Server 所有用到的函数均可在:规则指南 (opens in a new tab) 找到详细资料。
© 2023-2025 RHILEX Technologies Inc. All rights reserved.