temp_sonar.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import socket
  2. import struct
  3. import construct as c
  4. from memory_storage import MemoryStorage
  5. import time
  6. temp_data = c.Struct(
  7. magic_number=c.Int32ul, #固定不便,可能用于区分不同设备
  8. length_mm=c.Int32ul, # 数据包长度
  9. unkonw_1=c.Int16ul, # 固定不变,可能用于识别声呐不同状态的数据
  10. temp=c.Float32l, # 温度
  11. # 怀疑数据
  12. #unkonw_3=c.Float32l, # 每包数据量
  13. #unkonw_4=c.Float32l, # 每包数据量
  14. )
  15. redis_db = MemoryStorage()
  16. # 接收方
  17. def Receiver1():
  18. group_ip = '239.254.2.1' # 组地址
  19. group_port = 50220 # 端口号
  20. # 创建IPv4/UDP套接字
  21. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
  22. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  23. # 获取本地ip 先获取主机名,在通过主机名获取ip
  24. # local_ip = socket.gethostbyname(socket.gethostname()) #windows
  25. local_ip = '0.0.0.0' # ubuntu
  26. # 绑定端口
  27. sock.bind((local_ip, group_port))
  28. mreq = struct.pack("=4sl", socket.inet_aton(group_ip), socket.INADDR_ANY)
  29. while True:
  30. try:
  31. # 加入组播组
  32. # 使用默认的IPV4组播接口
  33. sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
  34. break
  35. except Exception as e:
  36. print(e)
  37. time.sleep(1)
  38. while True:
  39. data, addr = sock.recvfrom(65536) # 接受数值大一点,防止被撑爆
  40. print(len(data))
  41. if len(data) == 16 or len(data) == 25:
  42. res = temp_data.parse(data)
  43. print(res)
  44. if res.magic_number == 2008:
  45. print('--------------res.temp:', res.temp)
  46. print('--------------res.magic_number:', res.magic_number)
  47. redis_db.set_value({'sonar_temp': res.temp})
  48. if __name__ == "__main__":
  49. Receiver1()