새로운 강의는 이제 https://memi.dev 에서 진행합니다.
memi가 Vue & Firebase로 직접 만든 새로운 사이트를 소개합니다.

바로가기


Communication(통신) 2. Protocol

1 분 소요

가상의 바이너리 프로토콜을 만들어 232 혹은 소켓등에서 어떤 방법으로 데이터를 취득해야 하는지 알아보도록 하겠다..

사실 프로토콜은 어렵게 접근할 것이 아닌 사전적의미 그대로의 약속이다.

프로토콜 설계는 간단하다 이미 기존에 잘되어 있는 것을 써도 되고 보안이나 추가 필드가 필요하면 이미 쓰이고 있는 개념에서 약간의 변형만 해주면 된다.

설계

자동화쪽에서 많이 쓰는 프로토콜 중에 모드버스라는 것이 있다 232/422/485/tcp통신등에서 다양하게 쓰이기 때문에 이중 필요한것만 개념만 가져와서 만들어보겠다.

모드버스도 종류가 여러가지가 있다 아스키,바이너리,tcp 등이 있고 각각 당연히 내용도 다르다.

그 중 중요한 개념만 가져다 쓰면

  • 시작과 끝 구분
  • 데이터 길이, 데이터
  • 데이터 유효성 판단

개념을 토대로 3단 프레임을 짜본다.

해당 내용 컬럼 정의는 취향 껏 하면 된다..

  1. Header(or Head, Top)
    • Start(or STX, First): 시작 byte 혹은 bytes(1바이트는 약하지만 귀찮으니 일단 하나만..)
    • Command(Option) : 명령 구분
    • Length : Data의 길이
  2. Data(or Body, Middle) : 데이터.. 커맨드별 따로 정의
  3. Footer(or Tail, Bottom)
    • Checksum(or crc) : 데이터 유효성 판단.. 데이터 부분을 개수만큼 다 더한 값..(데이터가 없을때 판단이 어려워서 헤더부 crc가 좋지만 편의상..) 소켓에선 이미 처리되어있으므로 대부분 안쓰지만 범용성을 위해 넣었다.
    • End(or ETX, Last) : 마지막 byte 혹은 bytes(역시 1바이트는 약하다.. 귀찮으니 일단 하나만..)

표로 만들어 보았다

frame

  Start Command Length Data Checksum End
길이 1 1 4 가변 2 1
정의 0x09 0~9 가변 가변 가변 0x90

0x09, 0x90 등 선정 이유는 대부분 아스키 표현은 0x20~0x7f 까지인데 그 외의 제어문자등으로 나름 “나 아스키프로토콜 아니야” 라고 말하는 느낌을 주기 위함이다..

command

이제 커맨드 별로 데이터를 정의하면 된다.

  • 0x00 : 메세지 전송
send
  받는 사람 내용
길이 10 1~140
유형 char char
ack
  내용
길이 1
유형 int
  • 0x01 : 사진 전송
send
  받는 사람 사진
길이 10 0x100~0xffffffff
유형 char bin
ack
  내용
길이 1
유형 int

결론

개념 이해를 돕기 위한 프로토콜이므로 실제 사용시엔 헤더에 몇가지 필드(대용량 데이터 처리를 위한 인덱스/카운트 개념, 아이덴티티 등)가 더 추가되어야한다.

너무 간결해서 문제될 것 같은 프로토콜이지만..
대화형이고 길이가 가변이기 때문에 상당히 자유롭게 응용이 가능하다..

댓글남기기