天天看點

「案例」使用python給區域網路裝置發送udp廣播并檢視

功能說明:

廣播使用廣播位址255.255.255.255,将消息發送到區域網路中的每個主機,主機可以對收到的廣播進行處理或不響應。應用場景:若區域網路中有100多台裝置,每台裝置的型号不一緻,若快速區分,可收到廣播後回複目前型号,用于管理裝置

代碼:

import socket
import time
import json
import psutil

# 發送廣播
def main(win_ip,win_port,dev_ip,dev_port,message):
    
    # 設定目标位址
    dest = (dev_ip,dev_port) 

    # 建立廣播發送器
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # 設定允許廣播,位址為接收資料位址
    s.bind((win_ip,win_port))

    # 設定套接字可以發送接收廣播
    s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

    #s.setblocking(10)#設定阻塞

    print ("擷取電腦端的端口号資訊:")
    # 'all', 'tcp', 'tcp4', 'udp', 'udp4', 'inet', 'inet4', 'inet6', 'tcp6', 'udp6'
    for session in psutil.net_connections(kind="udp"):
        if session.laddr.port == win_port:
            
            print (session)

    # 發送廣播
    print ("發送廣播:\n%s"%message)
    s.sendto(message.encode('utf-8'),dest)

    s.settimeout(2)  # 設定等待逾時時間為5s

    while True:

        try:
            msg, addr  = s.recvfrom(1024)

            if  msg:
                
                print('接收回複:\n服務端位址:%s\n響應内容:%s'%(addr, msg.decode('utf-8')))

            time.sleep(0.2)
            
        except Exception as e:
            #time.sleep(200)
            break

    s.close()



if __name__=="__main__":

    win_ip = '192.168.x.x' 

    win_port = 6000
    
    dev_ip = '255.255.255.255' # 單個裝置:192.168.x.x,多台裝置255.255.255.255

    dev_port = 37020

    message = '{"devtype":[1111]}'

    main(win_ip,win_port,dev_ip,dev_port,message)


           

執行:

「案例」使用python給區域網路裝置發送udp廣播并檢視

測試結果:

「案例」使用python給區域網路裝置發送udp廣播并檢視
「案例」使用python給區域網路裝置發送udp廣播并檢視