AI应用开发相关目录
本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧
适用于具备一定算法及Python使用基础的人群
- AI应用开发流程概述
- Visual Studio Code及Remote Development插件远程开发
- git开源项目的一些问题及镜像解决办法
- python实现UDP报文通信
文章目录
一、UDP通信
UDP(User Data Protocol,用户数据报协议)是一种面向无连接的协议,在通信时发送端和接收端不用建立连接。UDP提供了一种简单的方式,将数据从源地址发送到目的地址,并且每个数据报都是一个独立的信息,包括完整的源地址或目的地址。
UDP的主要特点如下:
- 无连接:在传输数据之前,UDP不会在源端和终端之间建立连接。数据发送端简单地去抓取来自应用程序的数据,并尽可能快地把它发送到网络上。由于不需要建立连接,一台服务机可同时向多个客户机传输相同的消息。
- 不可靠性:UDP不保证数据的可靠传输。当发送端发出数据报后,并不能确定数据是否成功送达目的地。如果数据在传输过程中丢失或损坏,接收端可能无法正确地接收到数据。
- 面向报文:UDP以报文为单位进行传输。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。
AI应用开发往往落地在一定小范围内的机群,分析服务、应用服务、数据采集、用户站端有可能运行在同一局域网内的不同机器上,为保证服务的正常进行,可采用UDP报文通信的方式快捷实现服务流通。
小tips:
python的UUID生成
import uuid
uuid_str=str(uuid.uuid4())
二、代码示例
sockt实现UDP对xml报文的发送
cpp
def generate_xml(alarm, dw_code, bdz_code, zxt, time_str,node_json,stationinfo_json,zxts):
raw_string = """<?xml version="1.0" encoding="UTF-8"?>
<Message>
<Type>YCAlarm</Type>
<YCAlarm>
<Alarmtype>3003</Alarmtype>
<Alarmlevel>1</Alarmlevel>
<Name>{dw_code}</Name>
<Des>{dw_name}</Des>
<Substation>{bdz_code}</Substation>
<Subsystem>{zxt}</Subsystem>
<Hisalarmcode>{uuid}</Hisalarmcode>
<Status>1</Status>
<Time>{time_str}</Time>
<Info>{text}</Info>
</YCAlarm>
</Message>
""".format(dw_code=dw_code,
dw_name=node_json[dw_code],
bdz_code=bdz_code,
zxt=zxts[dw_code],
uuid=str(uuid.uuid4()),
time_str=time_str,
text=stationinfo_json[bdz_code][0] + ':' + alarm)
# 将生成的XML内容返回
# 将字符串解析为XML对象
root = ET.fromstring(raw_string)
xml_string = ET.tostring(root, encoding='utf-8').decode('utf-8')
# 解析XML内容
# root = ET.fromstring(xml_string)
'''
# 保存为XML文件
with open(dw_code+'.xml', 'wb') as f:
f.write(ET.tostring(root, encoding='utf-8', xml_declaration=True))
'''
return xml_string
def alert(json_data, alarm, bdz_code, zxt, time_str,node_json,stationinfo_json,zxts):
mysql_path = os.path.join(os.getcwd(), "data", "alert_config.json")
with open(mysql_path, 'r', encoding='utf-8') as f:
mid_json = json.load(f)
if alarm:
alarm_content = generate_xml(alarm, json_data['name'], bdz_code, zxt, time_str,node_json,stationinfo_json,zxts)
# 服务器IP地址和端口号
server_address = (mid_json['server_address'], mid_json['server_port'])
# 创建一个 socket 对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定服务端的IP地址和端口号
udp_socket.bind(server_address)
client_address = (mid_json['client_address'], mid_json['client_port'])
# 向客户端发送报文
# udp_socket.sendto(bytes(alarm_content, encoding = "utf8"), client_address)
# print('没有告警!没有告警!')
print(alarm_content)
udp_socket.sendto(alarm_content.encode('utf-8'), client_address)
else:
print(json_data['name'] + ' no alert!')
# 服务器IP地址和端口号
server_address = (mid_json['server_address'], mid_json['server_port'])
# 创建一个 socket 对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定服务端的IP地址和端口号
udp_socket.bind(server_address)
client_address = (mid_json['client_address'], mid_json['client_port'])
# 向客户端发送报文
udp_socket.sendto(b'no alert!', client_address)
三、总结
完结,撒花!