본문 바로가기

CONCEPT

LoRa 수신 데이터 가공 처리, TCP 전송 게이트웨이 시스템 설계



  기본 스케치


  • LoRa WAN, LoRa P2P 2가지 모드로 게이트웨이에 신호를 송신하는 태그.
  • 게이트웨이에는 이 두가지 모드로 수신되는 데이터를 처리할수 있는 프로그램이 각각 존재.
  • WAN의 경우에는 오픈소스 완제 프로그램(C언어)에서 CRC 검사까지 수행하기 때문에 내가 건들 필요 없이 그대로 LoRa 서버로 전송하면 됨.
  • P2P모드의 데이터를 온전하게 확인 할 수 있는 프로그램(이 프로그램도 C언어)은 기본적으로 logging을 목적으로 만들어졌음.
  • 내가 원하는 기능은,
  1. logging 되는 데이터 유형에서 순수 payload만 가로채
  2. 필요에 맞게 파싱하고
  3. 데이터 출력 시스템(유선 TCP 연결된 디바이스)에 TCP 전송.
  • 기존에는 AP-HTTP 통신방법에 따라 게이트웨이 내부의 웹서버를 구현하였다. 
  • 자연스럽게 logger 프로그램에서 수신한 payload를 웹서버로 전달했고
  • 전체 시스템에서 필요한 포맷의 데이터 가공기능(parsing)출력 시스템의 요청에 따른 응답웹서버에서 한번에 처리했다.
  • 웹서버가 더이상 필요하지 않기때문에 웹서버는 사라지지만 웹서버에서 동작하던 기능들은 살아 있어야 한다.
  • 게이트웨이 시스템의 안정성을 위해 
  • logger 프로그램은 오로지 LoRa P2P 데이터 수신만을 수행하고,
  • parsing 프로그램은 parsing 프로그램대로, 출력시스템 전송 프로그램 또한 오로지 전송하는 기능만을 수행 시키고 싶다.


  구상도

  • 웹서버를 삭제하고 웹서버에서 수행한 기능을 분리시켜 독립된 프로세스로 구동.
  • Message Broker인 ZeroMQ를 사용하여 각 프로그램의 안정적인 동시 수행을 기대하고 프로그램들의 언어차이 극복을 꾀함. 

  프로그램별 기능

  • Message Broker <ZeroMQ> : 게이트웨이내에서 독립적으로 동작하는 프로그램들이 만들어내는 데이터들이 들고 나는 창구 역할을 하는 라이브러리
  • Packet logger <C언어 프로그램> : 태그에서 송신하는 LoRa P2P 형식의 데이터를 수신하여 logging 하는 특정 LoRa 모듈 오픈소스 프로그램.
  • Message parser <Python 프로그램> : logger에서 가로챈 payload 데이터를 출력 시스템으로 전송하기전 약속한 포맷에 맞게 가공하는 프로그램.
  • 출력 시스템 전송 프로그램 <Python 프로그램> : 구동되어 브로커로부터 전달되는 데이터를 대기하다가 수신하는 데이터 발생시 출력 시스템에 전송하는 TCP 통신 프로그램.



  기존 구현 내용


  게이트웨이↔출력 시스템 통신방법

  • AP 모드로 동작하는 게이트웨이에 출력 시스템이 붙는다. 
  • 출력시스템에서 HTTP 요청, 게이트웨이에서 응답.

  게이트웨이 내부 프로그램과 수행 절차

  • logger 프로그램(계속 등장하는 그 프로그램)
  • 게이트웨이 내부 web server 프로그램(python) (이하 웹서버)
  • maria DB
  1. logger 프로그램에서 태그의 LoRa P2P 신호 데이터를 수신한다.
  2. logging 중 payload 처리시 웹서버로 데이터를 전달한다.
    - <관련 포스트> C언어로 HTTP/POST 보내기(curl.h , libcurl)
  3. 웹서버에서는 수신되는 데이터 발생시 출력 시스템과 약속한대로 데이터를 파싱하고 DB에 저장한다.
    - <관련 포스트> C에서 보내는 HTTP-POST 데이터 python flask로 받기
  4. 출력 시스템으로부터 HTTP 요청이 생기면 DB에 저장해둔 데이터를 최근 10개 데이터를 반환하여 응답한다.



  고민거리

  • makefile로 컴파일하는 logger 프로그램.
  • logger 프로그램에서 기존 웹서버로 payload 전송시 사용한 curl 라이브러리의 컴파일이 너무너무 힘들었다.
  • 외부 라이브러리인 mysql 컴파일은 도저히 해낼수가 없어서ㅠㅠ 포기하고 찾은 대체제가 curl 라이브러리였다.
  • 내부 제공 라이브러리인 libcurl도 더듬더듬 makefile 옵션들을 짚어가면서 컴파일 했다..
  • 누가봐도 외부 라이브러리인 zeroMQ의 컴파일 성공이 가장 걱정됨.