mqttServiceForDevice.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. }
  55. };
  56. const handleMqttMessageFromDetector = (message: MqttMessage) => {
  57. console.log(
  58. `[mqttServiceForDevice] 收到来自于Detector 的 message.CONTEXT ${message.CONTEXT}`
  59. );
  60. if (message.CONTEXT === '4') {
  61. //探测器状态会被通知为4(表示准备就绪)
  62. emitter.emit('DETECTOR_ACQUISITION_STARTED');
  63. } else if (message.CONTEXT === '5') {
  64. //探测器状态首先被通知为5(表示正在采集)
  65. emitter.emit('DETECTOR_ACQUISITION_INPROGRESS');
  66. } else {
  67. //探测器出错
  68. emitter.emit('DETECTOR_ACQUISITION_ERROR');
  69. }
  70. };
  71. const startListening = () => {
  72. mqttClient = mqtt.connect(MQTT_BROKER_URL, options);
  73. mqttClient.on('connect', () => {
  74. console.log('[mqttServiceForDevice] Connected to MQTT broker');
  75. mqttClient.subscribe(MQTT_TOPIC, (err) => {
  76. if (err) {
  77. console.error(
  78. '[mqttServiceForDevice] Failed to subscribe to topic',
  79. err
  80. );
  81. }
  82. });
  83. mqttClient.subscribe(MQTT_TOPIC_2, (err) => {
  84. if (err) {
  85. console.error(
  86. '[mqttServiceForDevice] Failed to subscribe to topic',
  87. err
  88. );
  89. }
  90. });
  91. mqttClient.subscribe(MQTT_TOPIC_DETECTOR, (err) => {
  92. if (err) {
  93. console.error(
  94. '[mqttServiceForDevice] Failed to subscribe to topic MQTT_TOPIC_DETECTOR',
  95. err
  96. );
  97. }
  98. });
  99. });
  100. mqttClient.on('error', (error) => {
  101. console.log('[mqttServiceForDevice] Connection failed:', error);
  102. });
  103. mqttClient.on('message', (topic, message) => {
  104. if (topic === MQTT_TOPIC) {
  105. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  106. handleMqttMessage(parsedMessage);
  107. }
  108. if (topic === MQTT_TOPIC_2) {
  109. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  110. handleMqttMessage(parsedMessage);
  111. }
  112. if (topic === MQTT_TOPIC_DETECTOR) {
  113. const parsedMessage: MqttMessage = JSON.parse(message.toString());
  114. handleMqttMessageFromDetector(parsedMessage);
  115. }
  116. });
  117. };
  118. const stopListening = () => {
  119. mqttClient.end();
  120. console.log('[mqttServiceForDevice] Stopped listening to MQTT broker');
  121. };
  122. export { startListening, stopListening };