개발 노트

[실패]mqtt로 받은 메세지 컴포넌트 내부에 전달 본문

React

[실패]mqtt로 받은 메세지 컴포넌트 내부에 전달

한츄 2024. 2. 23. 18:33

1. 컴포넌트 내부에서 messages배열을 호출하여 상황에 맞게 처리하려고 함 ->update실패

    const splitTopic = message.topic.split('/');
    const farmCode = splitTopic.length > 2 ? splitTopic[2] : '';

    // 시간 값을 추출
    const time = extractTime(message.message);
    const robotMilkingformState = {
      cpu: 0,
      ram: 0,
      hdd: 0,
      sql: 0,
      farmName: farmCode,
      errorState: false,
      errorList: true,
      robotCount: 0,
      gateCount: 0,
      robotMessage: '',
      gateMessage: '',
      robotErrorState: false,
      gateErrorState: false,
      robotRunningTime: '',
      gateRunningTime: '',
      rmanTime: '',
      webTime: '',
      rmanErrorState: false,
      webErrorState: false,
    };
    // 토픽을 분류하여 robotMilkingformState에 맞는 값을 설정
    let stateUpdate = {};
    const parsedMessage = JSON.parse(message.message);
    const cmd = parsedMessage.CMD;
    const newState = { ...robotMilkingformState, ...stateUpdate };

    if (splitTopic[1] === 'Robot') {
      if (cmd === 'ROBOT_STATUS') {
        if (parsedMessage.WORK === 'MILK') {
          stateUpdate = { robotMessage: '착유 중', robotRunningTime: extractTime(message.message) };
        } else if (parsedMessage.WORK === 'WAIT') {
          stateUpdate = { robotMessage: '대기 중', robotRunningTime: extractTime(message.message) };
        }
      } else if (cmd === 'MILKEND') {
        stateUpdate = { robotMessage: '착유 완료', robotRunningTime: extractTime(message.message) };
      } else if (cmd === 'REQ_COW_FEEDER_END') {
        stateUpdate = { robotMessage: '급이 중', robotRunningTime: extractTime(message.message) };
      }
    } else if (splitTopic[1] === 'SMARTGATE') {
      if (cmd === 'REQ_SMARTGATE_STATUS') {
        switch (parsedMessage.STATE) {
          case '00_SG_Init':
            stateUpdate = { gateMessage: '초기화', gateRunningTime: extractTime(message.message) };
            break;

          case '01_SG_Idle_Wait':
            stateUpdate = { gateMessage: '대기 중', gateRunningTime: extractTime(message.message) };
            break;

          case '02_SG_Wait_Read_Tag_ID':
            stateUpdate = { gateMessage: '태그 읽는 중', gateRunningTime: extractTime(message.message) };
            break;

          case '03_SG_Wait_Gate_Direction':
            stateUpdate = { gateMessage: '게이트 방향 대기 중', gateRunningTime: extractTime(message.message) };
            break;

          case '04_SG_Wait_Opening_Door':
            stateUpdate = { gateMessage: '도어 열림', gateRunningTime: extractTime(message.message) };
            break;

          case '05_SG_Wait_Cow_StepIn':
            stateUpdate = { gateMessage: '소입장', gateRunningTime: extractTime(message.message) };
            break;

          case '06_SG_Wait_Cow_Out':
            stateUpdate = { gateMessage: '소퇴장', gateRunningTime: extractTime(message.message) };
            break;

          case '07_SG_Wait_Closing_ExitDoor':
            stateUpdate = { gateMessage: '입장문 닫기 대기 중', gateRunningTime: extractTime(message.message) };
            break;

          case '08_SG_Manual_Mode':
            stateUpdate = { gateMessage: '수동 모드', gateRunningTime: extractTime(message.message) };

            break;
        }
      }
    } else if (splitTopic[1] === 'RMAN') {
      if (cmd === 'COM_HDD_STATUS') {
        stateUpdate = {... stateUpdate, hdd: parsedMessage.Message}
      } else if (cmd === 'MYSQL_PROCESSLIST') {
        stateUpdate = {... stateUpdate, sql: parsedMessage.Message}
      } else if (cmd === 'COM_MEM_STATUS') {
        stateUpdate = {... stateUpdate, ram: parsedMessage.Message}
      } else if (cmd === 'COM_CPU_STATUS') {
        stateUpdate = {... stateUpdate, cpu: parsedMessage.Message}
      }
    } else 
    if (splitTopic[1] === 'ALIVE') {
      if (splitTopic[4] === 'WEB') {
        stateUpdate = { webTime: extractTime(message.message) };
      } else if (splitTopic[4] === 'RMAN') {
        stateUpdate = { rmanTime: extractTime(message.message) };
      }
    }
    if (!groups[farmCode]) {
      groups[farmCode] = [];
    }

 

 

2. 값을 입력받아서 변경하는 부분을 zustand내부에서 추가할 때 관리하는 방향으로 변경

import { extractTime } from '@/utils/extractTime';
import { create } from 'zustand';

export type Message = { topic: string; message: string; time: string };
type Store = {
  messages: Message[];
  addMessage: (payload: Message) => void;
  findMessagesByTopics: (topics: string[]) => Message[];
};

export const useMqttStore = create<Store>((set, get) => ({
  messages: [],
  addMessage: (payload: Message) => {
    const splitTopic = payload.topic.split('/');
    const parsedMessage = JSON.parse(payload.message);
    const cmd = parsedMessage.CMD;

    // 특정 조건에 따라 추가 필드 설정
    let additionalFields = {};
    if (splitTopic[1] === 'Robot') {
      if (cmd === 'ROBOT_STATUS') {
        additionalFields = {
          robotMessage: parsedMessage.WORK === 'MILK' ? '착유 중' : '대기 중',
          robotRunningTime: extractTime(payload.message),
        };
      } else if (cmd === 'MILKEND') {
        additionalFields = { robotMessage: '착유 완료', robotRunningTime: extractTime(payload.message) };
      } else if (cmd === 'REQ_COW_FEEDER_END') {
        additionalFields = { robotMessage: '급이 중', robotRunningTime: extractTime(payload.message) };
      }
    } else if (splitTopic[1] === 'SMARTGATE') {
      if (cmd === 'REQ_SMARTGATE_STATUS') {
        switch (parsedMessage.STATE) {
          case '00_SG_Init':
            additionalFields = { gateMessage: '초기화', gateRunningTime: extractTime(payload.message) };
            break;
          case '01_SG_Idle_Wait':
            additionalFields = { gateMessage: '대기 중', gateRunningTime: extractTime(payload.message) };
            break;

          case '02_SG_Wait_Read_Tag_ID':
            additionalFields = { gateMessage: '태그 읽는 중', gateRunningTime: extractTime(payload.message) };
            break;

          case '03_SG_Wait_Gate_Direction':
            additionalFields = { gateMessage: '게이트 방향 대기 중', gateRunningTime: extractTime(payload.message) };
            break;

          case '04_SG_Wait_Opening_Door':
            additionalFields = { gateMessage: '도어 열림', gateRunningTime: extractTime(payload.message) };
            break;

          case '05_SG_Wait_Cow_StepIn':
            additionalFields = { gateMessage: '소입장', gateRunningTime: extractTime(payload.message) };
            break;

          case '06_SG_Wait_Cow_Out':
            additionalFields = { gateMessage: '소퇴장', gateRunningTime: extractTime(payload.message) };
            break;

          case '07_SG_Wait_Closing_ExitDoor':
            additionalFields = { gateMessage: '입장문 닫기 대기 중', gateRunningTime: extractTime(payload.message) };
            break;

          case '08_SG_Manual_Mode':
            additionalFields = { gateMessage: '수동 모드', gateRunningTime: extractTime(payload.message) };
            break;
        }
      }
    } else if (splitTopic[1] === 'RMAN') {
      if (cmd === 'COM_HDD_STATUS') {
        additionalFields = { hdd: parsedMessage.Message };
      } else if (cmd === 'MYSQL_PROCESSLIST') {
        additionalFields = { sql: parsedMessage.Message };
      } else if (cmd === 'COM_MEM_STATUS') {
        additionalFields = { ram: parsedMessage.Message };
      } else if (cmd === 'COM_CPU_STATUS') {
        additionalFields = { cpu: parsedMessage.Message };
      }
    } else if (splitTopic[1] === 'ALIVE') {
      if (splitTopic[4] === 'WEB') {
        additionalFields = { webTime: extractTime(payload.message) };
      } else if (splitTopic[4] === 'RMAN') {
        additionalFields = { rmanTime: extractTime(payload.message) };
      }
    }

    // 추가 필드를 포함한 메시지를 저장
    set((state) => ({
      messages: [...state.messages, { ...payload, ...additionalFields }],
    }));
  },
  findMessagesByTopics: (topics: string[]) => {
    const store = get();
    return store.messages.filter((message) => topics.includes(message.topic));
  },
}));


additionalFilds가 추가되지않아서 현재 실패상태