123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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()
|