北斗定位
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DipperDataAsyncTaskServiceImpl.java 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.telpo.dipperposition.service.impl;
  2. import com.telpo.dipperposition.common.HexConvert;
  3. import com.telpo.dipperposition.common.RedisUtil;
  4. import com.telpo.dipperposition.common.SocketClient;
  5. import com.telpo.dipperposition.config.SchedulingExecutorConfig;
  6. import com.telpo.dipperposition.service.IDipperDataAsyncTaskService;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.scheduling.annotation.Async;
  10. import org.springframework.stereotype.Service;
  11. import static java.lang.Thread.sleep;
  12. /**
  13. * @program: DipperDataAsyncTaskServiceImpl
  14. * @description: 获取星历数据。
  15. * @author: king
  16. * @create: 2021-01-10 14:01
  17. */
  18. @Service
  19. @Slf4j
  20. public class DipperDataAsyncTaskServiceImpl implements IDipperDataAsyncTaskService {
  21. private static String DIPPER_DATA_KEY = "TaidouDipperData";
  22. private static String DIPPER_ALL_DATA_REQ = "616C6C";
  23. @Autowired
  24. private RedisUtil redisUtil;
  25. @Autowired
  26. private SchedulingExecutorConfig schedulingExecutorConfig;
  27. @Override
  28. @Async("asyncServiceExecutor")
  29. public void pullAstEPH(int tryTimes) throws InterruptedException {
  30. tryTimes--;
  31. // (1) 发送bds获取星历数据
  32. byte[] dipperData = pullEPHFromDipper();
  33. // (2) 获取星历数据
  34. if (dipperData == null) {
  35. log.error("获取星历数据错误,取不到星历数据。");
  36. if (tryTimes>0) {
  37. log.info("等待10秒再获取1次。");
  38. sleep(10000);
  39. pullAstEPH(tryTimes);
  40. }
  41. } else {
  42. // 保存到DB或者缓存
  43. log.info("保存到DB或者缓存");
  44. redisUtil.set(DIPPER_DATA_KEY,dipperData);
  45. }
  46. }
  47. private byte[] pullEPHFromDipper() {
  48. // 创建Socket客户端实例;
  49. String serverAddr = schedulingExecutorConfig.getAstServer();
  50. int serverPort = schedulingExecutorConfig.getAstEphAstHexPort();
  51. SocketClient client = new SocketClient(serverAddr,serverPort,schedulingExecutorConfig.getAstTimeout());
  52. // astTimeCmd 组装
  53. String astTimeCmd = DIPPER_ALL_DATA_REQ;
  54. String checkSum = HexConvert.makeChecksum(astTimeCmd.toString()).toUpperCase();
  55. StringBuilder astCheckSumBuf = new StringBuilder();
  56. astCheckSumBuf.append(checkSum);
  57. while (astCheckSumBuf.length()<4) {
  58. astCheckSumBuf.insert(0,"0");
  59. }
  60. checkSum = astCheckSumBuf.toString();
  61. String hexIn = astTimeCmd + checkSum.substring(0,2) + " " + checkSum.substring(2,4);
  62. byte[] sendResult = null;
  63. //String ackAckCheckRef = "233E010102000421293C";
  64. sendResult = client.sendCmd(hexIn);
  65. client.closeConnection();
  66. return sendResult;
  67. }
  68. @Override
  69. public byte[] getAstEPH(){
  70. // String dipperData = pullEPHFromDipper();
  71. byte[] dipperData;
  72. if (!redisUtil.hasKey(DIPPER_DATA_KEY)) {
  73. try {
  74. this.pullAstEPH(1);
  75. } catch (InterruptedException e) {
  76. log.error("获取星历数据发生异常:", e);
  77. }
  78. }
  79. dipperData = (byte[])redisUtil.get(DIPPER_DATA_KEY);
  80. return dipperData;
  81. }
  82. }