ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 언제든지 데이터를 수신 받아서 처리하고 싶어요.
    Socket 통신 2022. 11. 21. 16:31

    CodeZoo에서는 LTE CATM1 내장형 모뎀으로 여러 가지 오픈소스를 제작했습니다. 

    그중 가장 많이 사용하시는 아두이노 라이브러리의 경우 Command & Response 구조로 구현되어 있습니다.

     

    쉽게 표현해서 명령을 내리고 그 명령에 대한 응답을 처리하는 구조입니다. 

    CATM1 모뎀의 동작모드는 크게 AT Command, PPP 모드로 분류되는데, 

    PPP모드의 경우 데이터 stream 형태로 동작되어 별도의 네트워크 소프트웨어 스택이 필요하기 때문에

    구조가 복잡하지만 사용자가 입맛에 맞게 여러가지를 추가하거나 개선하는 것이 가능합니다.

     

    하지만 AT Command 모드의 경우 모듈 제조사 (CATM1 내장형 모뎀의 경우 murata 전자)에서 제공한 명령어로 밖에 사용할 수 없어서 확장성이 떨어집니다. 하지만 간단한 명령으로 동작시킬 수 있으므로 소프트웨어 구조가 매우 간결해집니다.

     

    아두이노 라이브러리의 경우 AT Command 명령어를 호출, 응답, 해석할 수 있도록 동작 시킬수 있도록 코드주에서 직접 제작했습니다.

    이 라이브러리는 아쉽게도 실시간 처리는 불가능합니다. 그 이유에 대해서 간단한 TCP 소켓통신으로

    살펴보도록 하겠습니다. 그리고 어떻게 개선할 수 있는지도 살펴보겠습니다. 

     

    먼저 사용하는 AT Command 테스트 스크립트(명령어 나열)입니다. 

    <테스트 스크립트>

    AT%SOCKETEV=0,1

    AT%SOCKETCMD="ALLOCATE",0,"TCP","OPEN","52.215.34.155",7,1500

    AT%SOCKETCMD="ACTIVATE",1

    AT%SOCKETDATA="SEND",1,3,"30310A"

    %SOCKETEV:1,1

    AT%SOCKETDATA="RECEIVE",1,1000

    AT%SOCKETCMD="DEACTIVATE",1

    AT%SOCKETCMD="DELETE",1

     

    한줄한줄 살펴보겠습니다.

    AT%SOCKETEV=0,1 

    //1. 소켓통신 중 모든 이벤트를 활성화합니다.

     

    AT%SOCKETCMD="ALLOCATE",0,"TCP","OPEN","52.215.34.155",7,1500 

    //2. IP (52.215.34.155), Port(7)로 TCP 소켓을 셋업 합니다. 받는 최대 패킷사이즈는 1500바이트 입니다.

     

    AT%SOCKETCMD="ACTIVATE",1

    //3. 2에서 만든 소켓을 실제로 연결합니다

     

    AT%SOCKETDATA="SEND",1,3,"30310A"

    //4. 연결한 소켓 서버에 3바이트 데이터를 전송합니다. (0x30, 0x31, 0x0A)

     

    %SOCKETEV:1,1

    //5. 소켓 이벤트가 발생했습니다. 해당 메시지는 모뎀 사용자가 입력한 것이 아닌 모뎀이 사용자에게 발신한 메시지입니다. 전문적인 용어로 unsolicited message라고 합니다. 

     

    AT%SOCKETDATA="RECEIVE",1,1000

    //5. 소켓 읽기 명령으로 데이터를 읽어 옵니다. 1000은 읽는 최대 바이트 값입니다. 실제 들어온 값만큼 읽어 옵니다.

    //아래는 읽어 온 값입니다. 

    %SOCKETDATA:1,3,0,"30310A" //모뎀 수신 버퍼에서 3바이트 0x30, 0x31, 0x0A 읽어 옴
    OK

     

    AT%SOCKETCMD="DEACTIVATE",1

    //6. 소켓 연결을 해제합니다.

     

    AT%SOCKETCMD="DELETE",1

    //7. 만든 소켓을 제거합니다.

     

    위와 같이 모뎀에 연결된 MCU에 아무런 소프트웨어 스택 없이 명령어 만으로 모뎀 내부에 소켓을 생성하고

    연결하고 데이터를 송수신하고 연결 해제하고 소켓을 제거했습니다. 상당히 손쉽게 사용할 수 있도록 구성되어 있습니다. 

    테스트 환경은 아래와 같이 구성했습니다. 

    CATM1 내장형 모뎀 + USB TTL(CP2102)
    (CATM1 내장형 모뎀 RESET 풀업처리)
    USB TTL(3V3) --> IOREF, USB TTL(5V) --> 5V, USB TTL(GND) --> GND 연결
    USB TTL(TXD) --> 1번, USB TTL(RXD) --> 0번 연결
    PC 연결 --> QCOM 실행

    동작 녹화 영상입니다.

     

    CATM1 내장형 모뎀 AT커맨드 TCP소켓 테스트 (with 에코서버)

    에코 서버는 모뎀에서 데이터를 받게 되면 받은 데이터를 바로 모뎀으로 보내주기 때문에

    소켓 수신 이벤트가 발생됩니다. 이벤트 확인되면 모뎀 read명령어로 모뎀 내부 버퍼에 수신된 데이터를 읽어 옵니다.

    이벤트 발생 주기를 사용자가 예측할 수 없으므로 실시간 처리를 위한 방법을 구현해 놓아야 합니다.

    그래야 언제든지 통신을 통해 들어오는 메시지들을 처리할 수 있습니다. 

     

    실시간 처리를 위해서는 세 가지가 병행되어야 합니다.

    1. 모뎀으로 들어오는 메시지를 놓치지 않아야 한다. 

    들어오는 모든 메시지를 어딘가에 저장해 두어야 합니다.

     

    2. 들어오는 메시지를 조합해서 의미를 해석할 수 있는 해석기가 있어야 합니다.

    메시지가 한 글자씩 들어오기 때문에 잘 모아서 해석해야 합니다. 

     

    3. 해석기가 실시간으로 동작해야 한다. 그리고 해석기와 다른 일들이 겹치지 않게 잘 동작해야 합니다. 

     

    일반적으로 MCU 기반 펌웨어 프로그램으로는 1,2를 만족하는 내용으로 프로그램을 작성하기는 그렇게 어렵지 않습니다.

    하지만 3의 경우 실시간성을 확보해야 하기 때문에, 분기로 동작하는 일반 프로그램보다는 스케쥴러에 의해 동작하는 RTOS로 구현하는 것이 훨씬 나은 선택이라고 생각합니다. freertos, threadx와 같은 rtos를 사용해서 작업 단위를 나누고 실시간으로 동작할 수 있도록 만들어야 합니다. 구현 방법이 작업 단위이고 스케쥴러를 다뤄야 하기에 아두이노 라이브러리로 구현 시 복잡성이 증가해서 해당 내용은 최대한 심플하게 명령어를 주고 응답을 받을 수 있도록 구현했습니다. 

     

    또 다른 ppposclient 프로젝트, ppposclientSecure 프로젝트, linux ppp 프로젝트와 같은 경우 실시간 처리가 가능합니다. 

    특히 ppposclient 프로젝트의 경우 arduino main에서 callback 함수를 통해 사용자에게 이벤트를 알려줄 수 있도록 구현되어 있습니다. 어떤 식으로 동작하는지 좀 더 탐구해 보면 실시간성에 대해서 좀 더 이해하시는데 도움이 될 거라 생각됩니다. 

    https://github.com/codezoo-ltd/ppposclient 

     

    GitHub - codezoo-ltd/ppposclient: A client library for gsm ppp protocol. This library can be used to make GET and POST requests

    A client library for gsm ppp protocol. This library can be used to make GET and POST requests and to connect mqtt with PubSubClient. It supports ESP32. - GitHub - codezoo-ltd/ppposclient: A client ...

    github.com

    Murata Type1SC 모듈 구매, 자료 관련 문의
    (주)아성코리아
    전지만 이사 010-5418-8812 mlcc@asung.com
    박상인 수석 010-6556-5405 sipark@asung.com

    LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
    (주)코드주
    장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr

     

    https://www.devicemart.co.kr/goods/view?no=14077527 

     

    LTE-CatM1 내장형 모뎀 / 사물인터넷 통신모듈

    사물인터넷 개발을 위한 LTE 모듈입니다. / CodeZoo / 사물인터넷 통신모듈 / 유심은 상품상세의 링크에서 별도 구매가 필요합니다.

    www.devicemart.co.kr

    https://smartstore.naver.com/codezoo/products/7153689192

     

    Vodafone Global IoT SIM Card : codezoo

    [codezoo] IoT Global SIM, IoT Connectivity, IoT Device

    smartstore.naver.com

     

    태그
Designed by Tistory.