service_20250421173005.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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 enums.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. Service.surveillance_radar = SurveillanceRadar(Service.usrp, rx=CHANNEL_1, tx=CHANNEL_1)
  34. Service.jammer_radar = JammerRadar(Service.usrp, rx=CHANNEL_2, tx=CHANNEL_2)
  35. Service.status = 1
  36. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  37. except Exception as e:
  38. print('SDR设备异常', e)
  39. Service.status = 0 # 初始化失败,状态置为0
  40. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  41. @staticmethod
  42. def get_sdr_status():
  43. with Service._rlock:
  44. if Service.status == 0:
  45. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',{"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  46. try:
  47. samples = Service.usrp.recv_num_samps(1, 100e6, 1e6, [0], 50)
  48. if samples is None:
  49. Service.status = 0 # 获取状态失败,状态置为0
  50. else:
  51. Service.status = 1
  52. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  53. except Exception as e:
  54. print('SDR设备异常', e)
  55. Service.status = 0 # 获取状态失败,状态置为0
  56. Service.usrp = None # 重置USRP对象
  57. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  58. @staticmethod
  59. def data(payload):
  60. # 使用已初始化的雷达实例
  61. surveillance_radar = Service.surveillance_radar
  62. jammer_radar = Service.jammer_radar
  63. jamming_policy = payload.get('jamming_policy')
  64. anti_jamming_policy = payload.get('anti_jamming_policy')
  65. # 判断策略是否合法
  66. if not JammingPolicy.is_valid(jamming_policy) or not AntiJammingPolicy.is_valid(anti_jamming_policy):
  67. return ResponseDTO.ERROR_MS_DATA('策略不合法', {"status": Service.status, "Error": "策略不合法"}).to_json()
  68. # 打印对应策略
  69. print(' jamming_policy:', jamming_policy)
  70. print(' anti_jamming_policy:', anti_jamming_policy)
  71. # 根据策略选择算法
  72. jam_algorithm = Service._get_jamming_algorithm_method(jamming_policy)
  73. anti_jam_algorithm = Service._get_anti_jamming_algorithm(anti_jamming_policy, 'rx')
  74. # 1. 应用发射端抗干扰算法(波形/频率捷变)
  75. tx_original = np.random.randn(100)
  76. if anti_jamming_policy in {AntiJammingPolicy.WAVEFORM_AGILITY, AntiJammingPolicy.FREQUENCY_AGILITY}:
  77. tx_processed = surveillance_radar.process_transmit_signal(
  78. tx_signal=tx_original,
  79. algorithm=Service._get_tx_algorithm_method(anti_jamming_policy.value),
  80. sample_rate=1e6
  81. )
  82. else:
  83. tx_processed = tx_original
  84. # 2. 发送经过处理的发射信号
  85. tx_signal = surveillance_radar.send_signal(
  86. tx_signal=tx_processed,
  87. duration=0.1,
  88. center_freq=100e6,
  89. sample_rate=1e6,
  90. gain=20
  91. )
  92. # 4. 干扰雷达生成干扰
  93. jammed_signal = jammer_radar.execute_jamming(
  94. algorithm=jam_algorithm,
  95. bandwidth=100e6,
  96. sample_rate=1e6,
  97. duration=0.1,
  98. gain=20
  99. ) if jam_algorithm else tx_signal
  100. # 3. 独立接收原始信号
  101. rx_original = surveillance_radar.recv_signal(
  102. num_samples=100,
  103. sample_rate=1e6,
  104. center_freq=100e6
  105. )
  106. # 接收端抗干扰处理(仅限接收端策略)
  107. processed_signal = rx_original
  108. if anti_jam_algorithm:
  109. processed_signal = surveillance_radar.execute_anti_jamming(
  110. rx_signal=rx_original,
  111. algorithm=anti_jam_algorithm,
  112. sample_rate=1e6,
  113. polarization_params={'angle': 45, 'ellipticity': 0.5}
  114. )
  115. # 类型检查并转换复数信号为实数
  116. if np.iscomplexobj(processed_signal):
  117. processed_signal = np.real(processed_signal)
  118. if np.iscomplexobj(jammed_signal):
  119. jammed_signal = np.real(jammed_signal)
  120. # 返回结果
  121. return ResponseDTO.SUCCESS({"jamming_signal": np.real(jammed_signal).tolist(),
  122. "anti_jamming_signal": np.real(processed_signal).tolist()}).to_json()
  123. @staticmethod
  124. def send():
  125. try:
  126. # 设置中心频率、采样率和增益
  127. center_freq = 100e6 # 2.4 GHz
  128. sample_rate = 1e6 # 1 MS/s
  129. duration = 10 # 以秒为单位
  130. gain = 20 # [dB] 建议一开始设置小一点,按照实际情况调整
  131. # 生成发送信号
  132. num_samples = 100
  133. tx_signal = np.random.randn(num_samples) + 0.1j * np.random.randn(num_samples) # 修复部分
  134. # 发送信号
  135. Service.usrp.send_waveform(tx_signal, duration, center_freq, sample_rate, [0], gain)
  136. # 接收信号
  137. rx_signal = Service.usrp.recv_num_samps(num_samples, center_freq, sample_rate)
  138. print('信号已发送:')
  139. print(rx_signal)
  140. print('信号已接收')
  141. except Exception as e:
  142. print('发送或接收信号异常', e)
  143. Service.status = 0 # 发送或接收信号失败,状态置为0
  144. Service.usrp = None # 重置USRP对象
  145. @staticmethod
  146. def _get_jamming_algorithm_method(policy: str) -> callable:
  147. # 干扰算法映射
  148. jam_algorithm_map = {
  149. JammingPolicy.FREQUENCY_MODULATION: JammingSignalAlgo.frequency_modulation,
  150. JammingPolicy.AMPLITUDE_MODULATION: JammingSignalAlgo.amplitude_modulation,
  151. JammingPolicy.REPEATER: JammingSignalAlgo.repeater_jamming,
  152. JammingPolicy.VELOCITY_DECEPTION: JammingSignalAlgo.velocity_deception,
  153. JammingPolicy.RANGE_DECEPTION: JammingSignalAlgo.range_deception
  154. }
  155. return jam_algorithm_map.get(policy)
  156. @staticmethod
  157. def _get_anti_jamming_algorithm(policy: AntiJammingPolicy, algorithm_type: str) -> callable:
  158. """
  159. 统一抗干扰策略路由方法
  160. :param policy: 策略名称
  161. :param algorithm_type: 算法类型['tx'发射端/'rx'接收端]
  162. """
  163. tx_algorithms = {
  164. AntiJammingPolicy.WAVEFORM_AGILITY: AntiJammingSignalAlgo.adaptive_filter,
  165. AntiJammingPolicy.FREQUENCY_AGILITY: AntiJammingSignalAlgo.time_frequency_filter
  166. }
  167. rx_algorithms = {
  168. AntiJammingPolicy.POLARIZATION_FILTER: AntiJammingSignalAlgo.polarization_filter
  169. }
  170. if algorithm_type == 'tx':
  171. return tx_algorithms.get(policy)
  172. elif algorithm_type == 'rx':
  173. return None if policy in {AntiJammingPolicy.WAVEFORM_AGILITY, AntiJammingPolicy.FREQUENCY_AGILITY} else rx_algorithms.get(policy)
  174. # main方法
  175. if __name__ == '__main__':
  176. Service.initialize_usrp()
  177. Service.data({"jamming_policy": "噪声调频", "anti_jamming_policy": "频率捷变"})