테스트
노드 설명
INJECT - 플로우를 시작하는 노드
FUNCTION - 데이터의 가공 등을 프로그래밍 할 수 있는 노드
SERIAL REQUEST - 시리얼 포트를 설정하는 노드
BUFFER_PARSER - 시리얼에서 전송 받은 직렬 데이터를 버퍼에 원하는대로 파싱하는 노드
DEBUG - 결과 값의 출력을 설정하는 노드
필요한 NODE-RED 팔레트 목록
node-red-contrib-buffer-parser
node-red-dashboard
node-red-node-mysql
node-red-node-serialport
red-contrib-string-binary-parser
테스트 방법
1. 처음과 끝에 시작 노드(INJECT)와 종료 노드(DEBUG)를 드랍시킨다.2. SERIAL REQUEST 노드를 사용하여 현재 컴퓨터에 USB로 연결된 COM 포트 번호를 찾고통신 속도, 데이터 비트의 개수, 패리티 비트, 종료 비트 등을 설정한다. (and deliver 설정은 binary buffers)3. FUNCTION 노드를 사용하여 16진수로 이루어진 프로토콜(데이터 요청)을 작성하여 msg.payload의 값으로 저장한다.
그리고 다음 노드로 보내기 위한 코드를 작성한다.
var hexValues = ["0x01", "0x04 ", "0x00", "0x64", "0x00", "0x01", "0x70", "0x15"];
// 국번, 명령어, 주소1, 주소2, 데이터개수1, 데이터개수2, CRC-16_1, CRC-16_2
msg.payload = Buffer.from(hexValues.map(hex => parseInt(hex, 16)));
node.send(msg);
node.send(msg); 코드를 작성하여 다음 노드로 msg 객체를 전송한다.* msg라는 객체를 사용하여 메시지를 주고 받는다. 데이터를 요청하거나 전달 받을 때 모두 같은 객체를 사용
4. INJECT - FUNCTION(요청 데이터 작성) - SERIAL REQUEST(시리얼 통신 설정) - DEBUG
위와 같이 플로우를 연결하면 msg 객체에 데이터가 담겨서 출력된다.
여기서 온도 값에 해당 하는 데이터 범위는 4번째에서 5번째 값이다(인덱스 범위로는 3, 4) 필요한 데이터만을 가져오기 위해서 BUFFER PARSER 노드를 사용한다.
5. 위 플로우에서 '전송 설정'과 '결과 출력 방식' 사이에 있는 연결선을 삭제한다.
그리고 그 사이에 BUFFER PARSER 노드를 넣고 설정 창을 연다.
위 사진과 같이 output 설정을 values only(array)로 변경하고 아래에 가져올 데이터 범위를 설정한다.
Type은 데이터의 타입을 의미한다. 16진수 형태의 데이터를 가져오기 때문에 hex로 설정한다.
Name은 자신이 원하는 이름으로 작성한다. Length(개수), Offset(위치)은 원하는 위치로부터 몇개의 데이터를 파싱하는지를 설정한다. 인덱스 기준으로 3번으로부터 총 2개의 데이터를 가져오는 것이다.
이 데이터는 msg.payload[n]로 가져올 수 있는데 위에서 데이터의 길이(Length)를 2개로 설정했기 때문에
msg.payload[0]의 값으로는 총 2개의 16진수 값이 순차적으로 연결되어 담긴다. 해당 값을 DEBUG 노드를
연결하여 출력해보면 16진수의 값이 출력된다. 예) '00eb'
6. 하지만 우리가 유효한 데이터 값을 얻기 위해서는 16진수 값이 아닌 10진수의 정수 값이 필요하다. 그러므로
출력하기 바로 이전에 FUNCTION 노드를 사용하여 데이터를 가공한다. 우선 플로우 형태는 아래와 같다.
'데이터 파싱'에 해당하는 FUNCTION 노드에서 아래와 같이 코드를 작성한다.
BUFFER PARSER 노드를 사용하여 2개의 데이터 길이를 가진 16진수 코드를 파싱했기 때문에
msg.payload[0]에 해당 데이터가 담겨 있다. 우선은 우리는 16진수 데이터를 10진수로 가공하여
다시 온도 값을 표현하는 소수점 형태로 가공한 후 저장해야 한다.
parseInt 함수를 사용하면 10진 정수 형태로 형변환을 할 수 있는데 변환이 필요한 값과 해당 진수(16)을
파라미터로 추가로 입력하면 16진수를 10진수로 변환시켜 준다.
그렇게 하면 msg.payload[0]에는 '247'과 같은 형태로 소수점 없이 저장이 되는데 우리는 '24.7'과 같이
표현되기를 원하기 때문에 247을 10으로 나누어 실수(Float)형태로 형 변환 해야 한다. 여기에서는
parseFloat 함수를 사용하면 된다.
그리고 최종적으로는 또 다시 노드로 전송하는게 아니라 결과 값을 출력해야 하므로
return msg; 코드를 통해서 결과 값을 반환한다.
모든 과정을 정확히 따라하면 아래와 같이 데이터가 산출된다.
댓글