import socket import struct import construct as c from memory_storage import MemoryStorage import time temp_data = c.Struct( magic_number=c.Int32ul, #固定不便,可能用于区分不同设备 length_mm=c.Int32ul, # 数据包长度 unkonw_1=c.Int16ul, # 固定不变,可能用于识别声呐不同状态的数据 temp=c.Float32l, # 温度 # 怀疑数据 #unkonw_3=c.Float32l, # 每包数据量 #unkonw_4=c.Float32l, # 每包数据量 ) redis_db = MemoryStorage() # 接收方 def Receiver1(): group_ip = '239.254.2.1' # 组地址 group_port = 50220 # 端口号 # 创建IPv4/UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 获取本地ip 先获取主机名,在通过主机名获取ip # local_ip = socket.gethostbyname(socket.gethostname()) #windows local_ip = '0.0.0.0' # ubuntu # 绑定端口 sock.bind((local_ip, group_port)) mreq = struct.pack("=4sl", socket.inet_aton(group_ip), socket.INADDR_ANY) while True: try: # 加入组播组 # 使用默认的IPV4组播接口 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) break except Exception as e: print(e) time.sleep(1) while True: data, addr = sock.recvfrom(65536) # 接受数值大一点,防止被撑爆 if len(data) == 16 or len(data) == 25: res = temp_data.parse(data) if res.magic_number == 2008: #print('--------------res.temp:', res.temp) #print('--------------res.magic_number:', res.magic_number) redis_db.set_value({'sonar_temp': res.temp}) if __name__ == "__main__": Receiver1()