service.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import json
  2. import uhd
  3. import numpy as np
  4. import threading
  5. from dto.response_dto import ResponseDTO
  6. from model.surveillance_radar import SurveillanceRadar
  7. from model.jammer_radar import JammerRadar
  8. from algo.jamming_signal_algo import JammingSignalAlgo
  9. from algo.anti_jamming_signal_algo import AntiJammingSignalAlgo
  10. # 定义一组通道常量
  11. CHANNEL_1 = 0
  12. CHANNEL_2 = 1
  13. CHANNEL_3 = 2
  14. CHANNEL_4 = 3
  15. # 定义干扰、抗干扰策略集合,确保集合中的元素为合法的字符串常量
  16. from common.strategy_enum import JammingPolicy, AntiJammingPolicy
  17. class Service:
  18. usrp = None # 静态类变量
  19. status = 0 # 静态类变量
  20. surveillance_radar = None # 侦查雷达实例
  21. jammer_radar = None # 干扰雷达实例
  22. _rlock = threading.RLock() # 可重入锁
  23. @staticmethod
  24. def initialize_usrp():
  25. with Service._rlock:
  26. Service.get_sdr_status()
  27. if Service.status == 1:
  28. print('USRP设备已经初始化')
  29. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  30. try:
  31. Service.usrp = uhd.usrp.MultiUSRP()
  32. print('------SDR Devices initialize success!------')
  33. #侦查雷达初始化
  34. Service.surveillance_radar = SurveillanceRadar(Service.usrp, rx=CHANNEL_1, tx=CHANNEL_1)
  35. # 干扰雷达初始化
  36. Service.jammer_radar = JammerRadar(Service.usrp, rx=CHANNEL_2, tx=CHANNEL_2)
  37. Service.status = 1
  38. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  39. except Exception as e:
  40. print('SDR设备异常', e)
  41. Service.status = 0 # 初始化失败,状态置为0
  42. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  43. @staticmethod
  44. def get_sdr_status():
  45. with Service._rlock:
  46. if Service.status == 0:
  47. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',{"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  48. try:
  49. samples = Service.usrp.recv_num_samps(1, 100e6, 1e6, [0], 50)
  50. if samples is None:
  51. Service.status = 0 # 获取状态失败,状态置为0
  52. else:
  53. Service.status = 1
  54. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  55. except Exception as e:
  56. print('SDR设备异常', e)
  57. Service.status = 0 # 获取状态失败,状态置为0
  58. Service.usrp = None # 重置USRP对象
  59. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  60. @staticmethod
  61. def data(payload):
  62. with Service._rlock:
  63. if Service.status == 0:
  64. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',
  65. {"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  66. # try:
  67. # 使用已初始化的雷达实例
  68. surveillance_radar = Service.surveillance_radar
  69. jammer_radar = Service.jammer_radar
  70. jamming_policy = payload.get('jamming_policy')
  71. anti_jamming_policy = payload.get('anti_jamming_policy')
  72. # 判断策略是否合法
  73. if not JammingPolicy.is_valid(jamming_policy) or not AntiJammingPolicy.is_valid(anti_jamming_policy):
  74. return ResponseDTO.ERROR_MS_DATA('策略不合法', {"status": Service.status, "Error": "策略不合法"}).to_json()
  75. # 打印对应策略
  76. print(' jamming_policy:', jamming_policy)
  77. print(' anti_jamming_policy:', anti_jamming_policy)
  78. # 根据策略选择算法
  79. jam_algorithm = Service._get_jamming_algorithm_method(jamming_policy)
  80. anti_jam_algorithm = Service._get_anti_jamming_algorithm(anti_jamming_policy)
  81. print(' jamming_algorithm:', jam_algorithm)
  82. print(' anti_jamming_algorithm:', anti_jam_algorithm)
  83. # 1. 应用发射端抗干扰算法(波形/频率捷变)
  84. tx_original = np.random.randn(100)
  85. if anti_jamming_policy in {AntiJammingPolicy.WAVEFORM_AGILITY.value, AntiJammingPolicy.FREQUENCY_AGILITY.value}:
  86. tx_processed = surveillance_radar.process_transmit_signal(
  87. tx_signal=tx_original,
  88. algorithm= anti_jam_algorithm,
  89. sample_rate=1e6
  90. )
  91. else:
  92. tx_processed = tx_original
  93. # 生成干扰信号
  94. jammed_signal, lower_bound, upper_bound = jammer_radar.execute_jamming(
  95. algorithm=jam_algorithm,
  96. bandwidth=100e6,
  97. sample_rate=1e6,
  98. duration=0.1,
  99. gain=20
  100. )
  101. # 2.发送侦察信号
  102. import time
  103. from threading import Event
  104. signal_sent_event = Event()
  105. def send_signal_thread():
  106. tx_processed_signal = surveillance_radar.send_signal(
  107. tx_signal=tx_processed,
  108. duration=0.1,
  109. center_freq=100e6,
  110. sample_rate=1e6,
  111. gain=20
  112. )
  113. signal_sent_event.set()
  114. import threading
  115. send_thread = threading.Thread(target=send_signal_thread)
  116. send_thread.start()
  117. # 5. 侦查雷达接收信号
  118. # 等待信号发送完成后再接收
  119. signal_sent_event.wait()
  120. rx_original = surveillance_radar.recv_signal(
  121. num_samples=100,
  122. sample_rate=1e6,
  123. center_freq=100e6
  124. )
  125. # 6. 将接收的原始信号与干扰信号结合
  126. combined_signal = rx_original + jammed_signal
  127. # 7. 接收端抗干扰处理(仅限接收端策略)
  128. processed_signal = combined_signal
  129. if anti_jamming_policy in {AntiJammingPolicy.POLARIZATION_FILTER.value} :
  130. processed_signal = surveillance_radar.apply_anti_jamming_processing(
  131. rx_signal=combined_signal,
  132. algorithm=anti_jam_algorithm,
  133. sample_rate=1e6,
  134. polarization_params={'angle': 45, 'ellipticity': 0.5}
  135. )
  136. # 类型检查并转换复数信号为实数
  137. if np.iscomplexobj(processed_signal):
  138. processed_signal = np.real(processed_signal)
  139. if np.iscomplexobj(jammed_signal):
  140. jammed_signal = np.real(jammed_signal)
  141. # 返回结果
  142. return ResponseDTO.SUCCESS({
  143. "jamming_signal": np.real(jammed_signal).tolist(),
  144. "anti_jamming_signal": np.real(processed_signal).flatten().tolist(),
  145. "jamming_range": {
  146. "upper": upper_bound,
  147. "lower": lower_bound
  148. }
  149. }).to_json()
  150. # except Exception as e:
  151. # print('数据处理异常', e)
  152. # return ResponseDTO.ERROR_MS_DATA('数据处理异常', {"status": Service.status, "Error": str(e)}).to_json()
  153. @staticmethod
  154. def _get_jamming_algorithm_method(policy: str) -> callable:
  155. # 干扰算法映射
  156. jam_algorithm_map = {
  157. JammingPolicy.FREQUENCY_MODULATION.value: JammingSignalAlgo.frequency_modulation,
  158. JammingPolicy.AMPLITUDE_MODULATION.value: JammingSignalAlgo.amplitude_modulation,
  159. JammingPolicy.REPEATER.value: JammingSignalAlgo.repeater_jamming,
  160. JammingPolicy.VELOCITY_DECEPTION.value: JammingSignalAlgo.velocity_deception,
  161. JammingPolicy.RANGE_DECEPTION.value: JammingSignalAlgo.range_deception
  162. }
  163. return jam_algorithm_map.get(policy)
  164. @staticmethod
  165. def _get_anti_jamming_algorithm(policy: str) -> callable:
  166. """
  167. 统一抗干扰策略路由方法
  168. :param policy: 策略名称
  169. """
  170. anti_jam_algorithm_map = {
  171. AntiJammingPolicy.WAVEFORM_AGILITY.value: AntiJammingSignalAlgo.waveform_agility,
  172. AntiJammingPolicy.FREQUENCY_AGILITY.value: AntiJammingSignalAlgo.frequency_agility,
  173. AntiJammingPolicy.POLARIZATION_FILTER.value: AntiJammingSignalAlgo.polarization_filter
  174. }
  175. return anti_jam_algorithm_map.get(policy)