AI应用开发相关目录

本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧适用于具备一定算法及Python使用基础的人群

  1. AI应用开发流程概述
  2. Visual Studio Code及Remote Development插件远程开发
  3. git开源项目的一些问题及镜像解决办法
  4. python实现UDP报文通信


文章目录

  • AI应用开发相关目录
  • 一、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报文的发送

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)

三、总结

完结,撒花!