Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- transfer
- setInterval 정지
- AntDesign
- 1883
- Replication
- setInterval 중지
- 서버동기화
- timepicker
- setInterval clear
- invalid data
- pm2 설치
- c# datagridview 데이터 넣기
- pm2 시작
- pm2 상태 확인
- setInterval 외부 정지
- listener 1883
- mosquitto
- pm2
- pm2 확인
- html #select #option #multiple
- DatePicker
- 맥 어드레스
- 공인IP
- mosquitto.conf
- mySQL_Replication
- DataGridView 직접 입력
- map이 undefined가 뜰 때
- datagridview 직접입력
- allow_anonymouse
- 데이터테이블 데이터 넣기
Archives
- Today
- Total
개발 노트
[실패]mqtt로 받은 메세지 컴포넌트 내부에 전달 본문
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가 추가되지않아서 현재 실패상태
'React' 카테고리의 다른 글
정렬버튼 추가하기 (0) | 2024.02.26 |
---|---|
web-worker로 가져온 MQTT Data를 세부 컴포넌트에 적용시키기 (0) | 2024.02.26 |
MQTT/web-worker 다중 컴포넌트 연동 (0) | 2024.02.22 |
[Next.js] web worker을 이용한 mqtt와 웹소켓 적용하기 (0) | 2024.02.06 |
webWorker관련 참고자료 (0) | 2024.02.05 |