WIZnet Developer Forum

[WIZ550S2E] 관련 문의

WIZ550S2E 모듈을 사용하여 제품을 개발 중입니다.

Client mode로 통신을 해야 하고, 저희가 개발한 Firmware 기반의 제품에서 Ethernet Module 을 제어해야 합니다.
Data 길이가 4K 정도 되는 경우가 있어 Data Mode에서 DATA를 송수신 해야 합니다.

test를 하다가 몇가지 문의 사항이 있습니다.

  1. 모듈의 전원이 꺼진 상태에서 켜지면 미리 설정된 서버 주소로 TCP 연결을 시도합니다.
    이 기능을 없앨 수 있는 방법이 있는지요?

  2. Data Mode에서 전송할 수 있는 최대 Data 길이는 얼마인지요?

  3. Reconnection 기능을 비활성화 할 수 있는 방법이 무엇인지요?
    -. AT Command로 가능한지 알고 싶습니다.

  4. Data Mode에서 AT Command Mode로 진입을 하기 위한 명령이 "+++"인데, 만약 Data Mode에서 전송할 Data 중 "+++"이 있다면 어떻게 처리해야 하는지요?

안녕하세요.

각 질문에 대해 답변 드립니다.

  1. Client는 주기적으로 Server에 연결을 시도하는 것이 일반적입니다.
    만약 특정 외부 인터럽트(버튼 등)에 의해서만 연결을 시도하시길 원하시거나
    최초 부팅 후 일정 시간이 흐른 뒤에 연결 시도하기를 원하신다면, 펌웨어를 직접 수정하셔야 합니다.

  2. 최대 Data길이라는 것이 어떤것을 말씀하시는 건가요?
    한번에 보낼 수 있는 최대 패킷의 길이를 말씀하시는 거라면, 표준 Protocol에 의하여 Ethernet Packet 기준 1500바이트입니다.
    버퍼 자체는 1Kbyte이며, 링버퍼로 동작하고 있습니다.
    추가로, Socket Size를 어떻게 설정하시느냐에 따라 한번에 최대로 받거나 보낼 수 있는 데이터 크기가 정해집니다.
    이 경우 역시 펌웨어를 직접 수정하셔야 합니다. (기본 소켓 사이즈는 2Kbyte)

  3. AT Command로는 해당 명령이 없습니다.
    ConfigTool을 사용하여 변경할 수 있습니다.

    • 전후로 500ms 이상의 시간동안 데이터가 없으면 커맨드 모드 트리거로 인식합니다.
      즉, +++ 전후 500ms 시간 안에 데이터가 있다면 일반 데이터로 인식합니다.
      예를 들어, “++++++++++++++++++++++++++++++” 라는 데이터를 한번에 전송하면 데이터로 인식하고
      "abcd+++" 라고 한번에 전송해도 데이터로 인식합니다.
      앞뒤(500ms 안으로) 전송 없이 "+++(3byte)"만 단독으로 보낼 시 커맨드모드 트리거로 인식합니다
      혹은 ConfigTool을 사용하여 AT Command를 Disable시킨 상태로 사용하여야 합니다.

감사합니다.

답변 감사합니다.

추가로 문의 드립니다.

AT Mode에서 Data Mode로 전환 후 바로 Data를 전송할 경우 서버 측에서 Data를 수신하지 못하는 경우가 있습니다.
그래서 delay를 500ms 정도 주면 어느 정도 개선이 되는 것 같은데요.

AT Mode에서 Data Mode로 전환시 Delay를 최소 얼마 이상 줘야 하는지요?
반대로 Data Mode에서 AT Mode로 전환시에도 Delay가 필요한지요?

답변 부탁드리겠습니다.

먼저, AT Mode에서 "AT+MDATA"명령어로 Data Mode로 전환시에 걸리는 시간은 <1ms 입니다.
500ms 딜레이의 경우, 문의주신 분께서 모듈을 Client로 사용하고 있기때문에 발생하는 시간이며,
이는 네트워크 상황마다 다릅니다.

만약 데이터를 바로 전송해야 하는 경우라면, 소켓 상태가 Establish인지 체크하고 진행하는 것이 일반적입니다.

마찬가지로, Data Mode에서 AT Mode로 전환하는 경우에도 <1ms 시간이 소요됩니다.
다만 이 경우는 AT Command가 정상적으로 인식되어 Trigger로써 인식되었을 때에 걸리는 시간입니다.

감사합니다.

네 답변 감사드립니다.

말씀하신대로 Client 로 동작을 하고 있는데요, 말씀하신 Establish 체크는 어떻게 하는 건지요?

저희가 AT Command 를 통해서만 제어를 해야 하기에 AT Command로 Establish 체크 하는 방법을 알려 주시면 감사하겠습니다.

포럼 이전 시, 메일로 답변 드린 내용을 아래와 같이 기록합니다.


우선 사용하시면 되는 AT커맨드는 AT+NSOCK? 입니다.

간단한 예시를 보여드리기 위해 아래와 같이 화면 첨부하였으며,
상이한 차이점을 통해 Establish를 상태를 확인할 수 있습니다.

0,C,5000,192.168.11.226,5000

위에서 볼드체 부분은 각각 목적지(서버) IP, Port번호입니다.
즉, AT+NOPEN 명령을 통해 지정한 정보가 출력되어야 합니다.

Establish가 안되었다면 NOPEN명령을 주었더라도 아래와 같이 목적지 네트워크 정보를 반환하지 못합니다.

다만, 연결된 상태에서 서버가 Listen상태를 해제한 뒤 바로 체크할 경우에는 Establish되어 있다고 판단할 수 있으므로 이점 유의하여 사용하시길 바랍니다.

( 상호 Disconnect 하는 상황에서 발생하는 정상적인 현상입니다 – TCP/IP )

추가로,

만약, 코드 수정이 가능하시다면, 레지스터를 통해 Establish상태를 확인할 수 있습니다.
바로 아래의 함수를 사용하시면 해당소켓(sock)의 상태(SO_STATUS)를 특정 변수(&sock_state)에 받아올 수 있습니다.

getsockopt(sock, SO_STATUS, &sock_state);

그리고 아래와 같은 방식으로 비교하여 Established 상태를 확인할 수 있습니다.

if(sock_state == SOCK_ESTABLISHED)

이 방식은 S2E.c 에서 그 용례를 확인하실 수 있습니다.
( Github 코드 기준 620라인부터~ )

위 함수 내부로 들어가시면 레지스터값을 직접 읽어오는 내용이 있으니,
함수를 사용하고 싶지 않으시다면 참조하시길 바랍니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.