service.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import json
  2. from math import e
  3. from re import S
  4. from matplotlib.colors import CenteredNorm
  5. import uhd
  6. import numpy as np
  7. import threading
  8. from dto.response_dto import ResponseDTO
  9. from model.surveillance_radar import SurveillanceRadar
  10. from model.jammer_radar import JammerRadar
  11. from algo.jamming_signal_algo import JammingSignalAlgo
  12. from algo.anti_jamming_signal_algo import AntiJammingSignalAlgo
  13. # 定义一组通道常量
  14. CHANNEL_1 = 0
  15. CHANNEL_2 = 1
  16. CHANNEL_3 = 2
  17. CHANNEL_4 = 3
  18. SAMPLING_RATE = 20e6
  19. CENTER_FREQ = 6e9
  20. GAIN = 50
  21. # 定义干扰、抗干扰策略集合,确保集合中的元素为合法的字符串常量
  22. from common.strategy_enum import JammingPolicy, AntiJammingPolicy
  23. class Service:
  24. usrp = None # 静态类变量
  25. status = 0 # 静态类变量
  26. surveillance_radar = None # 侦查雷达实例
  27. jammer_radar = None # 干扰雷达实例
  28. _rlock = threading.RLock() # 可重入锁
  29. @staticmethod
  30. def initialize_usrp():
  31. with Service._rlock:
  32. Service.get_sdr_status()
  33. if Service.status == 1:
  34. print('USRP设备已经初始化')
  35. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  36. try:
  37. Service.usrp = uhd.usrp.MultiUSRP()
  38. print('------SDR Devices initialize success!------')
  39. #侦查雷达初始化
  40. Service.surveillance_radar = SurveillanceRadar(Service.usrp, rx_channel=CHANNEL_1, tx_channel=CHANNEL_1)
  41. #侦察类雷达启动
  42. Service.surveillance_radar.run()
  43. # 干扰雷达初始化
  44. Service.jammer_radar = JammerRadar(Service.usrp, rx=CHANNEL_2, tx=CHANNEL_2)
  45. Service.status = 1
  46. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  47. except Exception as e:
  48. print('SDR设备异常', e)
  49. Service.usrp = uhd.usrp.MultiUSRP("type=x4xx,reset")
  50. Service.status = 0 # 初始化失败,状态置为0
  51. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  52. # @staticmethod
  53. # def get_sdr_status():
  54. # with Service._rlock:
  55. # if Service.status == 0:
  56. # return ResponseDTO.ERROR_MS_DATA('SDR设备异常',{"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  57. # try:
  58. # rx_buffer = np.zeros((500000,), dtype=np.complex64)
  59. # Service.surveillance_radar.rx_stream.recv(rx_buffer, uhd.types.RXMetadata())
  60. # Service.status = 1
  61. # return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  62. # except Exception as e:
  63. # print('SDR设备异常', e)
  64. # Service.status = 0 # 获取状态失败,状态置为0
  65. # Service.usrp = None # 重置USRP对象
  66. # return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  67. @staticmethod
  68. def get_sdr_status():
  69. with Service._rlock:
  70. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  71. @staticmethod
  72. def data(payload):
  73. with Service._rlock:
  74. if Service.status == 0:
  75. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',
  76. {"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  77. # try:
  78. # 使用已初始化的雷达实例
  79. surveillance_radar = Service.surveillance_radar
  80. jammer_radar = Service.jammer_radar
  81. jamming_policy = payload.get('jamming_policy')
  82. anti_jamming_policy = payload.get('anti_jamming_policy')
  83. # 判断策略是否合法
  84. if not JammingPolicy.is_valid(jamming_policy) or not AntiJammingPolicy.is_valid(anti_jamming_policy):
  85. return ResponseDTO.ERROR_MS_DATA('策略不合法', {"status": Service.status, "Error": "策略不合法"}).to_json()
  86. # 打印对应策略
  87. print(' jamming_policy:', jamming_policy)
  88. print(' anti_jamming_policy:', anti_jamming_policy)
  89. # 根据策略选择算法
  90. jam_algorithm = Service._get_jamming_algorithm_method(jamming_policy)
  91. anti_jam_algorithm = Service._get_anti_jamming_algorithm(anti_jamming_policy)
  92. print(' jamming_algorithm:', jam_algorithm)
  93. print(' anti_jamming_algorithm:', anti_jam_algorithm)
  94. # 生成干扰信号
  95. jammed_signal, lower_bound, upper_bound = jammer_radar.execute_jamming(
  96. algorithm=jam_algorithm,
  97. bandwidth=CENTER_FREQ,
  98. sample_rate=SAMPLING_RATE,
  99. duration=0.1,
  100. gain=GAIN
  101. )
  102. # 抗干扰算法 、 干扰信号注入到侦察雷达
  103. surveillance_radar.inject(anti_jam_algorithm,jammed_signal)
  104. # 返回结果
  105. return ResponseDTO.SUCCESS({
  106. "jamming_signal": np.real(jammed_signal).tolist(),
  107. # "anti_jamming_signal": np.real(surveillance_radar.processed_signal).flatten().tolist(),
  108. "anti_jamming_signal": surveillance_radar.processed_signal.tolist(),
  109. "jamming_range": {
  110. "upper": upper_bound,
  111. "lower": lower_bound
  112. }
  113. }).to_json()
  114. # except Exception as e:
  115. # print('数据处理异常', e)
  116. # return ResponseDTO.ERROR_MS_DATA('数据处理异常', {"status": Service.status, "Error": str(e)}).to_json()
  117. @staticmethod
  118. def _get_jamming_algorithm_method(policy: str) -> callable:
  119. # 干扰算法映射
  120. jam_algorithm_map = {
  121. JammingPolicy.FREQUENCY_MODULATION.value: JammingSignalAlgo.frequency_modulation,
  122. JammingPolicy.AMPLITUDE_MODULATION.value: JammingSignalAlgo.amplitude_modulation,
  123. JammingPolicy.REPEATER.value: JammingSignalAlgo.repeater_jamming,
  124. JammingPolicy.VELOCITY_DECEPTION.value: JammingSignalAlgo.velocity_deception,
  125. JammingPolicy.RANGE_DECEPTION.value: JammingSignalAlgo.range_deception
  126. }
  127. return jam_algorithm_map.get(policy)
  128. @staticmethod
  129. def _get_anti_jamming_algorithm(policy: str) -> callable:
  130. """
  131. 统一抗干扰策略路由方法
  132. :param policy: 策略名称
  133. """
  134. anti_jam_algorithm_map = {
  135. AntiJammingPolicy.WAVEFORM_AGILITY.value: AntiJammingSignalAlgo.waveform_agility,
  136. AntiJammingPolicy.FREQUENCY_AGILITY.value: AntiJammingSignalAlgo.frequency_agility,
  137. AntiJammingPolicy.POLARIZATION_FILTER.value: AntiJammingSignalAlgo.polarization_filter
  138. }
  139. return anti_jam_algorithm_map.get(policy)