数据推送 UDP
RHILEX 支持将采集到的数据推送到 UDP 服务端。
实例
新建 UDP 北向资源
新建规则
在接入设备操作界面给设备配置脚本:
编写脚本
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 在数据传输中有一些限制和特点:
- 无连接性:UDP 不建立连接,这意味着在发送数据之前不需要进行握手。这使得 UDP 的建立连接和维护状态的开销较小,但同时也可能导致数据包在到达目的地之前丢失。
- 不可靠传输:UDP 不保证数据包的可靠传输。这意味着数据包可能丢失、重复或乱序到达。如果需要可靠传输,则需要在上层协议中实现。
- 无拥塞控制:UDP 不进行拥塞控制。在网络拥塞时,UDP 不会调整发送速率以减轻网络负载,这可能导致数据包丢失。
- 固定最大数据包大小:UDP 数据包的最大大小由网络的 MTU(最大传输单元)决定。如果数据包超过 MTU,它必须被分片,这可能会增加处理和传输的时间。
- 安全性:由于 UDP 是无连接的,它不提供任何内置的安全机制,如数据加密或完整性验证。因此,使用 UDP 传输敏感数据时需要额外的安全措施。
- 实时性:UDP 以其低延迟和高实时性而著称,这使得它非常适合实时应用,如视频会议、在线游戏和实时监控系统。
- 数据包校验和:UDP 提供了数据包校验和,这可以帮助检测数据在传输过程中是否损坏。
- 支持多播和广播:UDP 支持多播和广播通信,允许一个数据包被发送到多个目的地。
- 网络配置:在某些网络配置中,如 NAT(网络地址转换)或防火墙设置,UDP 通信可能受到限制。
- 资源使用:UDP 连接不保留状态,因此它在资源使用方面比 TCP 更高效。
在选择 UDP 或 TCP 时,需要根据应用的需求来决定。例如,对于需要可靠数据传输的应用,TCP 是更好的选择。而对于实时性要求高、对数据包丢失不敏感的应用,如在线游戏,UDP 可能是更合适的选择。
脚本解析
使用到的核心函数:
json:J2T
:将 JSON String 转为 Lua 的表json:T2J
:将 Lua 的表转转为 JSON Stringdata:ToUdp
:数据转发到 UDP Server 所有用到的函数均可在:规则指南 (opens in a new tab) 找到详细资料。