[앱스킷](WIFI-ON V1) ESP8266 WIFI 모듈 사용방법 알아보기 - 5편

두 개의 ESP8266 간 TCP 데이터를 송수신하는 방법을 알아보겠습니다.
WIFI 무선 네트워크를 구성하여 사물데이터를 전송할 때 유용합니다.
ESP8266 하나는 SoftAP로 설정하여 TCP 서버로 설정하고
다른 ESP8266 하나는 Station으로 설정하여 TCP 데이터 전송을 합니다.
두 개의 확장-스탠드에 장착된 U-HUB V1 허브-모듈 각각에 빈 스케치를 업로드하고
두 개의 WIFI-ON V1 노드-모듈 각각을 AT 명령어로 제어합니다.
ESP8266 WIFI 모듈 2, 3, 4편을 보신 분들은 아래 내용을 건너뛰고
(본 편 시작) 부터 참고하시면 됩니다.
설명에 앞서 참조할 문서는 "ESP8266 AT Instruction Set Ver.2.0.0" 입니다. Ver.3.0은 최근 버전인 만큼 지원되지 않는 AT 명령어가 있어 Ver2.0.0을 참조했습니다.
*ESP8266 AT 명령어 SET 버전 2.0.0 (링크)
본 포스팅에 사용한 APPSKIT 구성은 U-HUB V1 허브-모듈과 PWR-ON V1 노드-모듈을 장착한 모듈과, WIFI-ON V1 노드-모듈을 NODE-STAND V1 확장-스탠드에 장착하여 구성했습니다.
(U-HUB V1과 WIFI-ON V1 두 모듈만 결합해서도 사용할 수 있습니다.)

[U-HUB V1, PWR-ON V1, WIFI-ON V1과 NODE-STAND V1 결합 사진]
본 예제는 PC 아두이노 시리얼모니터에서 AT-Command를 WIFI-ON V1 모듈로 직접 전송하려고 합니다. U-HUB V1의 Hardware Serial(RX, TX)를 통해 WIFI-ON V1 노드-모듈의 UART에 직접 연결해서 AT-Command를 테스트해보는 예시입니다.
다음은 위에서 설명한 하드웨어 연결을 도시하였습니다.

[U-HUB V1 허브모듈의 USB 기능을 경유한 WIFI-ON V1의 UART 연결 도시]
본 동작을 위해 U-HUB V1 허브-모듈은 아두이노 개발환경의 보드매니저에서 "Arduino PRO or PRO Mini"를 선택하고 빈 스케치를 업로드합니다.
해당 동작을 위해서 다음과 같은 조작이 필요합니다.
첫째, 빈 스케치를 U-HUB V1 허브-모듈에 업로드하기 위해 WIFI-ON V1 노드-모듈의 "시리얼 선택 스위치"를 위로 올립니다.
둘째, 아두이노 IDE 환경에서 빈스케치를 만들어 U-HUB V1에 업로드합니다.
세째, 아두이노의 Hardware Serial(0번 핀, 1번 핀)과 WIFI-ON V1 모듈의 시리얼 포트를 연결하기 위해 WIFI-ON V1 모듈의 "시리얼 선택 스위치"를 아래로 내립니다.
네째, 아두이노 IDE 환경 내 시리얼 모니터를 실행시키고 통신속도는 "9600"을 선택합니다.
(WIFI-ON V1 노드-모듈은 출고 시 9600bps로 설정되어 있습니다)
다섯째, AT Command를 전송합니다. AT-Command를 전송할 때 유의해야 할 점은 AT-Command 끝에 "Both NL & CR"을 붙여야 합니다.

[아두이노 IDE 환경 내 시리얼모니터 실행 후 옵션 설정 화면]
다음은 위에서 설명한 U-HUB V1 허브모듈의 USB를 경유하여 WIFI-ON V1 노드-모듈의 UART를 통해 AT 명령어를 테스트해 보는 예제 동작 영상입니다.
"AT" 명령어가 내려가면 "OK"로 응답합니다.
"AT+GMR" 명령어는 ESP-12E 모듈의 펌웨어 버전을 출력합니다.
(제조사에 따라 펌웨어 버전과 출력되는 메시지는 다를 수 있습니다.)
[아두이노 시리얼모니터에서 Hardware Serial을 통해 WIFI-ON V1 노드-모듈 직접 제어하기]
(본 편 시작)
본 테스트를 위한 구성을 살펴 보겠습니다.
하드웨어는 두 개의 확장-스탠드(#1과 #2)로 구성했습니다.
확장-스탠드 #1은 "SoftAP 모드"로 설정하고 TCP 서버를 구동시킬 것이고,
확장-스탠드 #2는 "Station 모드"로 설정하고 TCP 클라이언트로 구동시키려고 합니다.
소프트웨어는 PC 한 대에서 "SerialPortMon" 2개를 실행시켜 사용했습니다.
확장-스탠드 #1용 SerialPortMon과 확장-스탠드 #2용 SerialPortMon입니다.
(아두이노 시리얼모니터는 한 대의 PC에서 동시에 2개의 시리얼 통신을 연결할 수 없어 이렇게 구성하였습니다.)
확장-스탠드 #1의 U-HUB V1 허브-모듈에는 빈 스케치가, 확장-스탠드 #2의 U-HUB V1 허브-모듈에는 시리얼을 사용하지 않고 OLED만 구동되는 스케치가 업로드된 상태이며, 각각의 WIFI-ON v1 노드-모듈의 시리얼선택스위치는 아래로 내려 SerialPortMon으로 직접 제어합니다.

[테스트 환경 구성]
다음 그림은 확장-스탠드 #1과 #2입니다.
확장-스탠드 #1(왼쪽)은 SoftAP 모드로 설정해서 TCP 서버로 동작하며, 확장-스탠드 #2(오른쪽)는 Station 모드로 설정해서 TCP 클라이언트로 동작합니다.

[하드웨어 구성]
먼저 PC에서 사용할 시리얼통신 프로그램은 "SerialPortMon" 프로그램입니다.
"ESP8266 WIFI 모듈 - 4편"에서 사용한 동일한 프로그램입니다.
상기 사이트로 이동하여 실행 파일을 다운로드 받습니다.

해당 프로그램을 다운로드 받으셨다는 전제로 다음과 같은 단계로 진행하겠습니다.
먼저 TCP 서버로 동작시킬 확장-스태드 #1과 연결할 SerialPortMon입니다.
(총 7단계)
단계1. 확장-스탠드 #1과 연결할 첫번째 SerialPortMon 프로그램을 실행합니다.
프로그램이 실행되면 "Connect" 버튼을 누릅니다.

단계2. 연결 대화 상자가 나타나면 설정을 마치고 시리얼 포트를 연결합니다.
연결형태는 "Serial(COM)", 연결 포트는 확장-스탠드 #1의 U-HUB V1 허브-모듈의 "COM15", 통신속도는 "9600", 데이터비트는 "8", 패리티는 "None", 정지비트는 "1", 흐름제어는 "None"으로 설정합니다.
설정이 완료되었으면 "Connect" 버튼을 누릅니다.
(연결 포트는 사용자마다 다를 수 있습니다.)

정상적으로 연결이 되었으면 포트정보와 "Connected" 메시지가 나타납니다.
다음 보내는 문자열 편집 항목 중 뒤에 붙이기 란에, ESP-12E 모듈의 AT 명령어 규칙에 맞게 끝에 "\r\n"을 넣어줍니다.
(아두이노 시리얼모니터의 "Both NL & CR"과 같은 기능입니다.)

단계3. 확장-스탠드 #1에 장착된 WIFI-ON V1 노드-모듈을 SoftAP로 설정합니다.
보내는 문자열 편집 항목 중 문자열 입력창에 <AT+CWMODE_CUR?> AT 명령어로 현재 WIFI 모드를 확인합니다. 현재 "SoftAP + Station" 모드입니다.

<AT+CWMODE_CUR=2> AT 명령어로 WIFI 모드를 "SoftAP" 모드로 변경합니다.

단계4. 설정한 SoftAP의 SSID와 PASSWORD를 설정합니다.
<AT+CWSAP_CUR="APPSKIT_SOFTAP","01110111",5,3> AT 명령어로 SSID와 PASSWORD를 설정합니다.

단계5. 설정한 SoftAP의 다중 연결(클라이언트)을 허용하도록 설정합니다.
<AT+CIPMUX=1> AT 명령어로 다중연결을 허용합니다.

단계6. SoftAP의 서버 주소, 게이트웨이 주소 및 서브넷마스크를 설정합니다.
<AT+CIPAP_CUR="192.168.5.1","192.168.5.1","255.255.255.0"> AT 명령어로 설정합니다.

단계7. SoftAP를 TCP 서버로 설정합니다.
<AT_CIPSERVER=1,8080> AT 명령어로 설정합니다.

이상으로 확장-스탠드 #1을 TCP 서버 설정을 마쳤습니다.
지금부터 확장-스탠드 #2를 TCP 클라이언트로 설정을 시작하겠습니다.
(총 5단계)
단계1. 확장-스탠드 #2와 연결할 두번째 SerialPortMon 프로그램을 실행합니다.
프로그램이 실행되면 "Connect" 버튼을 누릅니다.

단계2. 연결 대화 상자가 나타나면 설정을 마치고 시리얼 포트를 연결합니다.
연결형태는 "Serial(COM)", 연결 포트는 확장-스탠드 #2의 U-HUB V1 허브-모듈의 "COM4", 통신속도는 "9600", 데이터비트는 "8", 패리티는 "None", 정지비트는 "1", 흐름제어는 "None"으로 설정합니다.
설정이 완료되었으면 "Connect" 버튼을 누릅니다.
(연결 포트는 사용자마다 다를 수 있습니다.)

정상적으로 연결이 되었으면 포트정보와 "Connected" 메시지가 나타납니다.
다음 보내는 문자열 편집 항목 중 뒤에 붙이기 란에, ESP-12E 모듈의 AT 명령어 규칙에 맞게 끝에 "\r\n"을 넣어줍니다.
(아두이노 시리얼모니터의 "Both NL & CR"과 같은 기능입니다.)

단계3. 확장-스탠드 #2에 장착된 WIFI-ON V1 노드-모듈을 Station으로 설정합니다.
보내는 문자열 편집 항목 중 문자열 입력창에 <AT+CWMODE_CUR?> AT 명령어로 현재 WIFI 모드를 확인합니다. 현재 "SoftAP + Station" 모드입니다.

<AT+CWMODE_CUR=1> AT 명령어로 WIFI 모드를 "Station" 모드로 변경합니다.

단계4. 무선 공유기 리스트를 검색합니다.
<AT+CWLAP> AT 명령어로 무선 공유기 리스트를 검색합니다.
앞서 확장-스탠드 #1에서 설정한 "APPSKIT_SOFTAP" SSID가 검색됩니다.

단계5. 확장-스탠드 #1의 "APPSKIT_SOFTAP" 무선 공유기와 연결합니다.
<AT+CWJAP_CUR="APPSKIT_SOFTAP","01110111"> AT 명령어로 확장-스탠드 #1의 무선 공유기와 연결해서 로컬 IP를 할당받습니다.

<AT+CIFSR> AT 명령어로 할당 받은 IP를 확인합니다.

이상으로 확장-스탠드 #2을 TCP 클라이언트 설정을 마쳤습니다.
지금부터 TCP 서버와 TCP 클라이언트 간 데이터를 송수하겠습니다.
(총 6단계)
단계1. TCP 클라이언트에서 TCP 서버로 연결합니다.
<AT+CIPSTART="TCP","192.168.5.1",8080> AT 명령어로 할당 받은 IP를 확인합니다.
(연결하려고 하는 TCP 서버 IP와 포트번호를 보내면 간단하게 연결됩니다.)

아래 화면은 TCP 서버 SerialPortMon 화면으로 클라이언트와 연결이 되면 "0,CONNECT"라는 메시지가 출력됩니다. "0"은 클라이언트 ID로 TCP 서버가 데이터를 보낼 때 클라이언트를 구분하는데 사용됩니다.

단계2. 연결된 TCP 서버로 데이터 길이를 입력합니다.
<AT+CIPSEND=6> AT 명령어로 전송할 데이터 길이를 입력합니다.
전송하고자 하는 문자는 "TEST" 입니다. 전송할 문자 "TEST"는 길이가 4바이트인데 <6>인 이유는 ESP-12E 모듈 통신 규격 상 "TEST" 뒤에 "\r\n" 두 바이트가 더 추가되기 때문입니다.

단계3. TCP 서버로 전송할 문자를 입력합니다.
TCP 전송 모드로 바뀌었기 때문에 AT 명령어 없이 전송할 문자를 바로 입력합니다.

아래 화면은 TCP 서버로 구동 중인 확장-스탠드 #1과 연결된 SerialPortMon 화면으로,
TCP 클라이언트에서 데이터가 들어오면 "+IPD,0,6:TEST"라고 출력됩니다.
(+IPD-접두어, 0-0번 ㅋㄹ라이언트 ID, 6-데이터길이)

TCP 서버로 다시 전송하기 위해서는 <AT+CIPSEND=(전송문자길이)>를 입력 후 문자를 넣는 과정을 반복합니다.
단계4. 이번에 반대로 TCP 서버에서 TCP 클라이언트로 데이터를 전송하겠습니다.
<AT+CIPSEND=0,6> AT 명령어로 전송할 데이터 길이를 입력합니다.
(길이 정보만 보냈던 TCP 클라이언트 명령어와 달리 클라이언트 ID와 데이터 길이를 보냅니다.)

단계5. TCP 서버로 전송할 문자를 입력합니다.
AT 명령어 없이 전송할 문자를 바로 입력합니다.

다음은 TCP 서버 SerialPortMon 화면으로, TCP 클라이언트에서 데이터가 들어오면 "+IPD,6:TEST"라고 출력됩니다.

단계6. TCP 클라이언트에서 TCP 서버와의 연결을 종료합니다.
<AT+CIPCLOSE> AT 명령어를 입력하면 연결이 종료됩니다.

다음은 TCP 서버로 구동 중인 확장-스탠드 #1과 연결된 SerialPortMon 화면으로,
"0,CLOSED", 즉 "0"번 ID 연결이 종료되었다는 메시지가 출력됩니다.

다음은 위에서 설명한 TCP 서버-클라이언트 데이터 송수신에 대한 동영상입니다.
[PC TCP 서버와 WIFI-ON V1 노드-모듈간 TCP 데이터 송수신 동영상]
지금까지 APPSKIT의 확장-스탠드 2개를 사용해서 TCP 서버와 TCP 클라이언트를 구성해서 상호간 데이터 송수신하는 방법에 대한 설명을 마치겠습니다.
감사합니다.
앱스킷 구매처
앱스킷 공식 홈페이지