mqttServiceForDevice.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import mqtt from 'mqtt';
  2. import { MQTT_BROKER_URL } from '../API/config';
  3. import emitter from '../utils/eventEmitter';
  4. interface MqttMessage {
  5. IDX: string;
  6. TYPE: string;
  7. CMD: string;
  8. KEY: string;
  9. CONTEXT: string;
  10. Ver: string;
  11. Transaction: string;
  12. HANDLE: {
  13. ROUTE: string;
  14. FLAGS: string;
  15. LANG: string;
  16. HANDLEID: string;
  17. OWNERID: {
  18. EBUSID: string;
  19. MACHINEID: string;
  20. PROCID: string;
  21. ADDR: string;
  22. };
  23. DEVID: {
  24. EBUSID: string;
  25. MACHINEID: string;
  26. PROCID: string;
  27. ADDR: string;
  28. };
  29. };
  30. TOPIC: string;
  31. PUBLISH: string;
  32. }
  33. const MQTT_TOPIC_2 = 'CCOS/DEVICE/Generator/Notify/GENERATORSYNCSTATE'; //发生器
  34. const MQTT_TOPIC = 'CCOS/DEVICE/Detector/Notify/XrayON';
  35. const MQTT_TOPIC_DETECTOR = 'CCOS/DEVICE/Detector/Notify/DetectorStatus'; //探测器
  36. const options = {
  37. clean: true,
  38. connectTimeout: 4000,
  39. username: 'mqttx1112',
  40. password: '',
  41. };
  42. let mqttClient;
  43. const handleMqttMessage = (message: MqttMessage) => {
  44. console.log(`[mqttServiceForDevice] 收到message.CONTEXT ${message.CONTEXT}`);
  45. if (message.CONTEXT === '0') {
  46. emitter.emit('GENERATOR_RAD_OFF');
  47. } else if (message.CONTEXT === '1') {
  48. emitter.emit('ACQUISITION_STARTED');
  49. emitter.emit('GENERATOR_RAD_PREPARE');
  50. } else if (message.CONTEXT === '2') {
  51. emitter.emit('GENERATOR_RAD_READY');
  52. } else if (message.CONTEXT === '3') {
  53. emitter.emit('ACQUISITION_STARTED');
  54. } else if (message.CONTEXT === '4') {
  55. emitter.emit('GENERATOR_STATUS_STANDBY'); //发生器ready
  56. }
  57. };
  58. const handleMqttMessageFromDetector = (message: MqttMessage) => {
  59. console.log(
  60. `[mqttServiceForDevice] 收到来自于Detector 的 message.CONTEXT ${message.CONTEXT}`
  61. );
  62. if (message.CONTEXT === '4') {
  63. //探测器状态会被通知为4(表示准备就绪)
  64. emitter.emit('DETECTOR_ACQUISITION_STARTED');
  65. } else if (message.CONTEXT === '5') {
  66. //探测器状态首先被通知为5(表示正在采集)
  67. emitter.emit('DETECTOR_ACQUISITION_INPROGRESS');
  68. } else {
  69. //探测器出错
  70. emitter.emit('DETECTOR_ACQUISITION_ERROR');
  71. }
  72. };
  73. const startListening = () => {
  74. mqttClient = mqtt.connect(MQTT_BROKER_URL, options);
  75. mqttClient.on('connect', () => {
  76. console.log('[mqttServiceForDevice] Connected to MQTT broker');
  77. mqttClient.subscribe(MQTT_TOPIC, (err) => {
  78. if (err) {
  79. console.error(
  80. '[mqttServiceForDevice] Failed to subscribe to topic',
  81. err
  82. );
  83. }
  84. });
  85. mqttClient.subscribe(MQTT_TOPIC_2, (err) => {
  86. if (err) {
  87. console.error(
  88. '[mqttServiceForDevice] Failed to subscribe to topic',
  89. err
  90. );
  91. }
  92. });
  93. mqttClient.subscribe(MQTT_TOPIC_DETECTOR, (err) => {
  94. if (err) {
  95. console.error(
  96. '[mqttServiceForDevice] Failed to subscribe to topic MQTT_TOPIC_DETECTOR',
  97. err
  98. );
  99. }
  100. });
  101. });
  102. mqttClient.on('error', (error) => {
  103. console.log('[mqttServiceForDevice] Connection failed:', error);
  104. });
  105. mqttClient.on('message', (topic, message) => {
  106. if (topic === MQTT_TOPIC) {
  107. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  108. handleMqttMessage(parsedMessage);
  109. }
  110. if (topic === MQTT_TOPIC_2) {
  111. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  112. handleMqttMessage(parsedMessage);
  113. }
  114. if (topic === MQTT_TOPIC_DETECTOR) {
  115. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  116. handleMqttMessageFromDetector(parsedMessage);
  117. }
  118. });
  119. };
  120. const stopListening = () => {
  121. mqttClient.end();
  122. console.log('[mqttServiceForDevice] Stopped listening to MQTT broker');
  123. };
  124. export { startListening, stopListening };