짧은 질문, 긴 답변 (with socket통신)
질문:
아두이노 예제에서 초기 전원 투입시 초기화 하고 서버측 IP및 port 지정하여 연결 시켜서 데이터 보낸 후에도 계속 연결 되어 있는 상태로 쓰고 있는데 TCP서버 측의 연결이 끊겼을 때 이를 감지하여 재연결 하는 라이브러리가 있을까요?
답변:
재연결하는 라이브러리 함수는 따로 없습니다.
질문하신 내용 관련해서 정리한 자료 및 어떻게 프로그래밍 하셔야 하는지 알려드리겠습니다.
먼저, CATM1에서 세션이 종료되는 것은 두가지 이벤트로 확인할 수 있습니다.
첫번째는,
TCP 세션은 일반적으로 계속 연결되어 있지 않습니다. 기본 Idle Timeout값이 60초 입니다. 타임아웃 되기 전에
TCP로 세션으로 송수신하지 않을 경우 자동으로 컨넥션이 끊어 집니다.
<메뉴얼 원문>
TCP idle timer in seconds (0-300, default: 60). When there is no client/server activity over the predefined time, the socket is deactivated (Socket option TCP_KEEPINTVL)
두번째는,
peer에 의해 세션이 제거되었을때 이벤트가 발생합니다.
모뎀에서 체크할 수 있는 방법은 아래의 순서로 프로그래밍 하셔야 합니다.
1. 이벤트 셋팅
AT%SOCKETEV=<event_id>,<mode>
Defined values:
<event_id>: integer:
0 - All events, used only in execution command
1 - Rx buffer has more Bytes to read
2 - Socket deactivate due to idle timer expiry.
3 - Socket terminated by peer
4 - New connected socket is accepted/spawned from parent listening socket
<mode>: integer; unsolicited result response presentation:
0 - disabled
1 - enabled
이 경우 모든 이벤트를 체크하게 하는것이 좋습니다. 따라서 AT%SOCKETEV=0,1 로 이벤트 트리거를 활성화 합니다.
2. 이벤트 모니터링
말씀하신 소켓이 연결해제 되었는지 detection 하려면, 모뎀에서 출력되는 unsollicited 메시지를 체킹하셔야 합니다.
아래 4가지의 이벤트가 비주기적으로 트리거 됩니다.
4 cases:
1. Rx buffer has more Bytes to read.
2. Socket termination due to Idle timer expiration.
3. Socket terminated by peer.
4. New connected socket is accepted/spawned from listening socket.
이중에서 해당사항이 있는건 2,3번 이벤트 입니다. 아래와 같은 메시지로 이벤트가 출력 됩니다.
%SOCKETEV: <event_id> , <mode>, <socket_id>,<connected_socket_id>
여기서 첫번째 event_id만 파싱해서 값을 쓰시면 될것 같네요.
구현하시려면 RTOS에서 별도의 태스크를 만들어서 waitqueue에 걸어 두시고 체크루틴을 만들어서
해당 이벤트에 트리거 되었을때 다시 소켓 연결함수를 호출하시면 될 것 같습니다.
LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의, vodafone IoT유심 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr
Vodafone Global IoT SIM Card : codezoo
[codezoo] IoT Global SIM, IoT Connectivity, IoT Device
smartstore.naver.com