✅ 목표 (Goal)

✅ 내용 (Contents)

  1. 복잡한 시리얼 입출력 온/습도를 읽어서 서버로 보낸다고 가정합시다. 현재 온도가 23.4도이고 습도가 56.7%라면 이를 서버로 어떻게 보내야 할까요? 아래와 같이 보내면 될까요? 23.4/56.7 센서 노드가 여러 개라면 어떻게 보내야 할까요? 아래와 같이 보내면 되겠죠 A123/23.4/56.7 /는 델리미터라 하여 구분자 입니다. 보내는 쪽에서 A12323.456.7 이라 보내면 상당히 헷갈릴테니까요. 델리미터는 꼭/ 를 쓰지 않더라도 ,나 |등 편한 것을 쓰면 됩니다. 저 같은 경우는 ,를 주로 쓰는 편입니다. 그리고 시작과 끝을 알려주기 위해서 STX 문자 0x02, 0x03을 앞뒤로 붙여주고, 마지막에 개행 문자도 붙여줍니다. STXA123,23.4,56.7ETX 수신 받는 쪽에서는 STX와 ID ,를 기준으로 값을 판단하면 됩니다.

이제부터 조금 복잡해 지는데, 수신 받는 쪽은  데이터가 언제 올지 모르고  데이터가 중간에 끊어질수도 있다는 점입니다. 송신측에서 갑작스럽게 전원이 끊어지면 데이터가 안가겠죠. 그래서 STXA123,23.4,56 까지만 왔다면 수신측은 56.7이라는 데이터는 못받아도 EXT와 \n을 받으려고 무한정 대기하면 안된다는 겁니다. 수신측에서는 일정 시간 기다렸다가 데이터가 안오면 그에 따른 대책을 세워야 합니다. 이런 경우 보통  재요청합니다.  포기합니다.

🥕 파서 개요

임베디드 시스템에서는 “어떤 장비”로부터 데이터가 “특정한 형식”으로 수신, 송신하는 경우가 많다.

예를 들어 여러 개의 온습도 센서를 받는 서버의 경우를 살펴보자.

123,4.8,215,25.4,57<CR><LF>

123이라는 센서 노드에서 수신 받은 데이터인데, 각각 노드의 전압, 전류, 온도, 습도를 의미한다.

, 대신에 필드(?) 레코드(?)를 구분할수 있는 문자를 구분자Delimiter라 한다. 구분자는 데이터와 확연히 구분되는 문자를 사용하는 것이 좋다. .이나 숫자는 데이터와 구분되지 않으므로 사용하지 않는다. 물론, 센서 노드에서 보내는 데이터가, 실수는 전혀 없고, 정수만 있다면 .을 사용해도 되긴 하지만, 구분자는 가급적 , |와 같은 특이한(?) 문자를 사용하는 것이 좋다.

위 필드에서 데이터는 전압, 전류, 온도, 습도와 같은 순서로 데이터를 송수신하지만, 송수신측 개발자들이  서로 협의하여 온도,습도,전압,전류와 같이 순서를 바꿔도 무방하다.

이렇듯 사용자들이 정하는 프로토콜을 사용자 정의 프로토콜User Define Protocol 혹은 커스텀 프로토콜Custom Protocol이라고 한다.

데이터가 단순할 경우에는 크게 문제가 없지만, 송수신할 데이터가 많고, 필드가 복잡한 산업에서는 사용자정의 프로토콜 대신에 산업용 프로토콜을 사용한다.