아두이노 피지컬컴퓨팅 교구로 활용할 수 있는 실 생할용품 메이킹 프로젝트(워터맨IOT) 여섯번째.
1) STA(Station)모드 : ESP8266이 스마트폰이나 일반기기 처럼 WIFI Client로 작동하는 모드이다. 따라서 다른 WIFI공유기를 통하여 인터넷 접속을 할 수 있는 상태이다. 본 프로젝트에서는 기본적으로 이 STA모드로 인터넷 클라우드 서비스에 접속하고 통신한다.
2) AP(Acess Point) 모드 : ESP8266 자신이 AP 즉, 공유기 역할을 하는 모드이다. 따라서 스마트폰 등 다른 기기에서 ESP8266을 공유기로 인식하여 접속할 수 있고 서로 통신할 수 있다. 하지만 ESP8266 자체는 인터넷에 연경되어 있지 않기 떄문에 이를 통해 외부 인터넷에 접속할 수는 없는 상태이다. 외부기기에서 ESP8266에 접속하여 설정값을 지정해 주는 설정기능 등을 구현할 때 사용한다.
STA(Station) 모드 테스트
- #include <ESP8266WiFi.h>
- WiFiClient client;
- char ssid[30] = "pnit";
- char password [30] = "cointoppnit";
- const char* test_server = "www.naver.com";
- void setup() {
- Serial.begin(115200);
- Serial.println("==waterman IOT START==");
- WiFi.mode(WIFI_STA);
- WiFi.disconnect();
- Serial.println("Try connectting AP ");
- WiFi.begin(ssid, password);
- for ( int i= 0; i < 10; i++ ) {
- Serial.print(".");
- if ( WiFi.status() == WL_CONNECTED ) {
- break;
- }
- delay(1000);
- }
- if ( WiFi.status() != WL_CONNECTED ) {
- Serial.println("connectting AP-- FAIL ");
- return;
- }
- Serial.println("connectting AP-- SUCCESS ");
- if (client.connect(test_server, 80)) {
- Serial.println("Test Server connected ");
- client.print("GET ");
- client.print("HTTP/1.1\r\n");
- client.print("Host: " + String(test_server) + "\r\n");
- client.print("Connection: close\r\n\r\n");
- delay(500);
- String line= client.readString();
- Serial.println(line);
- client.stop();
- }
- else {
- Serial.println("Test Server connect FAIL");
- }
- }
- void loop() {
- }
3~4 line: 인터넷에 연결하기 위해 접속하고자 하는 공유기의 명칭과 password를 지정
5 line: 인터넷으로 접속하고자 하는 서버 주소
9 line: WIFI모드를 STA 모드로 지정
10 line: WIFI 초기화
12 line: AP(공유기)에 접속하기
13~19 line: AP접속상태가 정상이 될때 까지 재시도 ( 10회 재시도)
20~24 line: AP접속 성공여부 확인
25 line: 인터넷상의 서버 접속하기 (서버URL, 포트번호 80:웹서비스 )
27~30 line: 접속된 서버에 http 데이터 전송 (웹브라우저에서 서버로 전송하는 데이터 형식)
32~33 line: 서버에서 응답되는 데이터를 받아 시리얼 모니터로 표시해 보면 다음과 같음
HTTP/1.1 302 Moved Temporarily
Server: NWS
Date: Sun, 16 Sep 2018 06:06:53 GMT
Content-Type: text/html
Connection: close
Location: https://www.naver.com/err/notfound.html
Vary: Accept-Encoding,User-Agent
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center> NWS </center>
</body>
</html>
위와 같이 html형식 데이터가 포함된 응답이 되돌아 오는데 웹브라우저에서는 이를 보기좋게 화면에 표시하는 것임.
- #include <ESP8266WiFi.h>
- #include <ESP8266WebServer.h>
- ESP8266WebServer server(80);
- const char *ap_ssid = "WatermanIOT_1";
- const char *ap_pass = "";
- void procAProot() {
- String strHtml = "<!DOCTYPE html><head><meta name='viewport' content='width=device-width,initial-scale=1.0' /></head>";
- strHtml = strHtml+ "<form action='/setting' method='POST'><table width=100%><tr><td align=center><h3> Setting Waterman IOT</h3><br></td></tr>";
- strHtml = strHtml+ "<tr><td>ID: <input type=text name='ID' /><br></td></tr>";
- strHtml = strHtml+ "<tr><td>Password: <input type=text name='PW' /><br></td></tr><tr><td align=center> <input type=submit value='confirm' /></td></tr></table></form>";
- server.send(200,"Text/html",strHtml);
- }
- void procAPsetting() {
- server.send(200,"Text/html","<br><h1>Registered OK!<h1>");
- String inputID = server.arg("ID");
- String inputPW = server.arg("PW");
- Serial.print("procAPsetting ID=");
- Serial.print(inputID .c_str());
- Serial.print("=,PW=");
- Serial.print(inputPW.c_str());
- Serial.println("====");
- }
- void setup() {
- Serial.begin(115200);
- Serial.println("==waterman IOT START==");
- WiFi.mode(WIFI_AP);
- Serial.println("strart AP MODE ");
- WiFi.softAP(ap_ssid,ap_pass );
- IPAddress myIP = WiFi.softAPIP();
- Serial.print("AP mode ip=");
- Serial.println(myIP);
- server.on("/",procAProot);
- server.on("/setting",procAPsetting);
- server.begin();
- Serial.println("AP mode Server start");
- }
- void loop() {
- server.handleClient();
- delay(500);
- }
7~13 line: 웹서버의 역할을 정의하는 모듈. 데이터를 입력하기 위한 화면을 출력한다.
8~11 line: 출력될 화면을 HTML형식으로 작성해서 strHTML에 저장
12 line: 웹서버로서 데이터를 전송한다 ( 코드, 형식,전송할 데이터 )
15~24 line: 웹서버의 역할을 정의하는 모듈. 입력된 데이터를 처리한다.
16 line: 웹서버에서 데이터를 잘 전송받았다는 메시지를 응답한다.
17 line: 입력데이터 중에서 name이 ID인 항목의 데이터를 받아 inputID라는 이름으로 저장
18 line: 입력데이터 중에서 name이 PW인 항목의 데이터를 받아 inputPW라는 이름으로 저장
19~23 line: String을 변환하여 시리얼 모니터에 출력
28 line: WIFI mode를 AP모드로 지정
30 line: 기동될 AP의 SSID(명칭)과 password를 지정. 스마트폰으로 WIFI검색해 보면 이 SSID 명칭이 접속대상 공유기LIST에 표시된다. 따라서 주변의 다른 AP들의 명칭과 중복되지 않는 고유한 이름으로 지정해 주어야 한다.
31 line: AP 자신의 IP Address를 읽어낸다. ESP8266의 경우 192.168.4.1 이라는 주소가 기본적으로 할당되므로 스마트폰에서 AP에 접속한 후 웹브라우저로 http://192.168.4.1 로 접속하면 본 AP에 웹서버기능으로 접속할 수 있게 된다.
34 Line: 웹서버로서의 기능을 정의한다. 아무 지정없이 접속하면 procAProot라는 함수를 호출하여 수행하라는 의미이다.( 7~13 line 기능)
35 Line: 웹서버로서의 기능을 정의한다. /setting으로 접속하면 procAPsetting이라는 함수를 호출하여 수행하라는 의미이다.( 15~24 line 기능)
36 line: 웹서버 기능 Start
41 line: 접속된 Client 단말로부터 입력된 데이터를 처리한다.
'아두이노 피지컬컴퓨팅 키트 > 워터맨IOT' 카테고리의 다른 글
(피지컬컴퓨팅키트) 워터맨 IOT 8.ThingSpeak 기능 활용 (3) | 2019.01.03 |
---|---|
(피지컬컴퓨팅키트) 워터맨 IOT 7.ThingSpeak 소개와 설정 (2) | 2019.01.03 |
(피지컬컴퓨팅키트) 워터맨 IOT 5.센서 사용하기 (0) | 2019.01.01 |
(피지컬컴퓨팅키트) 워터맨 IOT 4. 하드웨어 조립 (0) | 2018.12.31 |
(피지컬컴퓨팅키트) 워터맨 IOT 3.ESP8266 개발환경 및 테스트 (0) | 2018.12.30 |