service.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. # 定义一组通道常量
  9. CHANNEL_1 = 0
  10. CHANNEL_2 = 1
  11. CHANNEL_3 = 2
  12. CHANNEL_4 = 3
  13. # 定义干扰策略集合,确保集合中的元素为合法的字符串常量
  14. JAMMING_POLICY = {
  15. "噪声调频", "噪声调幅", "噪声直放", "速度多假目标", "距离多假目标"
  16. }
  17. ANTI_JAMMING_POLICY = {
  18. "频率捷变", "波形捷变", "自适应极化滤波"
  19. }
  20. class Service:
  21. usrp = None # 静态类变量
  22. status = 0 # 静态类变量,用于存储设备状态,初始化为0
  23. _rlock = threading.RLock() # 可重入锁,用于线程锁
  24. @staticmethod
  25. def initialize_usrp():
  26. with Service._rlock:
  27. Service.get_sdr_status()
  28. if Service.status == 1:
  29. print('USRP设备已经初始化')
  30. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  31. try:
  32. Service.usrp = uhd.usrp.MultiUSRP()
  33. print('------SDR Devices initialize success!------')
  34. Service.status = 1 # 初始化成功,状态置为1
  35. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  36. except Exception as e:
  37. print('SDR设备异常', e)
  38. Service.status = 0 # 初始化失败,状态置为0
  39. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  40. @staticmethod
  41. def get_sdr_status():
  42. with Service._rlock:
  43. if Service.status == 0:
  44. return ResponseDTO.ERROR_MS_DATA('SDR设备异常',{"status": Service.status, "Error": "SDR设备未初始化"}).to_json()
  45. try:
  46. samples = Service.usrp.recv_num_samps(1, 100e6, 1e6, [0], 50)
  47. if samples is None:
  48. Service.status = 0 # 获取状态失败,状态置为0
  49. else:
  50. Service.status = 1
  51. return ResponseDTO.SUCCESS({"status": Service.status}).to_json()
  52. except Exception as e:
  53. print('SDR设备异常', e)
  54. Service.status = 0 # 获取状态失败,状态置为0
  55. Service.usrp = None # 重置USRP对象
  56. return ResponseDTO.ERROR_MS_DATA('SDR设备异常', {"status": Service.status, "Error": str(e)}).to_json()
  57. @staticmethod
  58. def data(payload):
  59. jamming_policy = payload['jamming_policy']
  60. anti_jamming_policy = payload['anti_jamming_policy']
  61. # 判断策略是否合法
  62. if jamming_policy not in JAMMING_POLICY or anti_jamming_policy not in ANTI_JAMMING_POLICY:
  63. return ResponseDTO.ERROR_MS_DATA('策略不合法', {"status": Service.status, "Error": "策略不合法"}).to_json()
  64. # 打印对应策略
  65. print(' jamming_policy:', jamming_policy)
  66. print(' anti_jamming_policy:', anti_jamming_policy)
  67. Service.send()
  68. # 生成两个长度为一百的浮点数组,代表侦察信号和返回的信号,数组元素随机
  69. surveillance_signal = np.random.randn(100)
  70. surveillance_signal_back = np.random.randn(100)
  71. # 返回结果
  72. return ResponseDTO.SUCCESS({"jamming_signal": surveillance_signal.tolist(),
  73. "anti_jamming_signal": surveillance_signal_back.tolist(),
  74. "status": Service.status}).to_json()
  75. @staticmethod
  76. def send():
  77. try:
  78. # 设置中心频率、采样率和增益
  79. center_freq = 100e6 # 2.4 GHz
  80. sample_rate = 1e6 # 1 MS/s
  81. duration = 10 # 以秒为单位
  82. gain = 20 # [dB] 建议一开始设置小一点,按照实际情况调整
  83. # 生成发送信号
  84. num_samples = 100
  85. tx_signal = np.random.randn(num_samples) + 0.1j * np.random.randn(num_samples) # 修复部分
  86. # 发送信号
  87. Service.usrp.send_waveform(tx_signal, duration, center_freq, sample_rate, [0], gain)
  88. # 接收信号
  89. rx_signal = Service.usrp.recv_num_samps(num_samples, center_freq, sample_rate)
  90. print('信号已发送:')
  91. print(rx_signal)
  92. print('信号已接收')
  93. except Exception as e:
  94. print('发送或接收信号异常', e)
  95. Service.status = 0 # 发送或接收信号失败,状态置为0
  96. Service.usrp = None # 重置USRP对象
  97. @staticmethod
  98. def demo():
  99. surveillance_radar = SurveillanceRadar(Service.usrp, rx=CHANNEL_1, tx=CHANNEL_1)
  100. # main方法
  101. if __name__ == '__main__':
  102. Service.initialize_usrp()