본문 바로가기
IoT 디바이스 활용/Arduino

Arduino - WIFI - ESP8266 - 라이브러리 (WifiUtil.h)

by cooluk 2020. 10. 16.

ESP8266 라이브러리(WiFiEsp)


ESP8266 라이브러리

라이브러리 설치

WiFi 객체 주요 메서드

  • WiFi AP(공유기)에 접속하고 IP를 받는 역할

  • WiFi.init(&softSerial)

    • SoftwareSerial을 통해 초기화
  • WiFi.status()

    • AP 연결 상태 리턴
  • WiFi.begin(ssid, password)

    • AP 접속
    • 접속 성공시 IP 할당 받음
  • WiFi.SSID()

    • AP의 SSID 리턴
  • WiFi.localIP()

    • 할당 받은 IP (IPAddress 객체) 리턴
  • WiFi.RSSI()

    • AP의 신호 강도 리턴

AP 연결

#include <WiFiEsp.h>
#include <SoftwareSerial.h>

SoftwareSerial softSerial(2, 3); // RX, TX

char ssid[] = "SSID";        // your network SSID (name)
char pass[] = "pass";    // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status

void setup() {
    Serial.begin(115200);
    softSerial.begin(9600);
    WiFi.init(&softSerial);  //주소를 넘긴다.
    // softSerial *p : 포인터로 관리

    if (WiFi.status() == WL_NO_SHIELD) {  // ESP 연결 여부
        Serial.println("WiFi shield not present");
        while (true);  // ESP 가 없으면 진행하지 않는다.
    }

    while (status != WL_CONNECTED) {  // AP 접속 여부
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, pass);
    }
    Serial.println("You're connected to the network");

    printWifiStatus();
}
void loop() {
}

void printWifiStatus() {

    // print the SSID of the network you're attached to
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // print your WiFi shield's IP address
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    // print the received signal strength
    long rssi = WiFi.RSSI();
    Serial.print("Signal strength (RSSI):");
    Serial.print(rssi);
    Serial.println(" dBm");
}

[WiFiEsp] Initilization successful - 1.5.4

Attempting to connect to WPA SSID: SSID

[WiFiEsp] Connected to SSID

You're connected to the network

SSID: SSID

IP Address: 192.168.0.13

Signal strength (RSSI):-752 dBm


코드 재사용을 위한 클래스화

  • WifiUtil.h
#ifndef __WIFI_UTIL_H__
#define __WIFI_UTIL_H__

#include <SoftwareSerial.h>
#include <WiFiEsp.h>

class WifiUtil {
private:
    const char *ssid;
    const char *password;
    SoftwareSerial softSerial;
    int status = WL_IDLE_STATUS; // Status

public:
    WifiUtil(int rx, int tx);
    void init(const char *ssid, const char *password);
    void checkShield();
    void printInfo();
    int check();
};

#endif

  • WifiUtil.cpp
#include "WifiUtil.h"
WifiUtil::WifiUtil(int rx, int tx) : softSerial(rx, tx) {
}

// 쉴드 존재유무 확인
void WifiUtil::checkShield() {
    if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        while (true);
    }
}

// 와이파이 접속여부 확인 - 미접속이면 접속 시도
int WifiUtil::check() {
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, password);
        if (status == WL_CONNECTED) {
            printInfo();
            return 1; // 끊겼다가 다시 접속
        }
    }
    return 0; // 끊긴적 없음
}

// 초기화 및 AP 접속
void WifiUtil::init(const char *ssid, const char *password) {
    this->ssid = ssid;
    this->password = password;

    softSerial.begin(9600);
    WiFi.init(&softSerial);

    checkShield();
    check();
}

void WifiUtil::printInfo() {
    // 와이파이 접속정보
    Serial.println("You're connected to the network");
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    long rssi = WiFi.RSSI();
    Serial.print("Signal strength (RSSI):");
    Serial.print(rssi);
    Serial.println(" dBm");
    Serial.println();
}

  • app.ino
#include "WifiUtil.h"

const char SSID[] = "SSID";
const char PASSWORD[] = "pass";

WifiUtil wifi(2, 3);

void setup() {
    Serial.begin(9600);
    wifi.init(SSID, PASSWORD);
}

void loop() {
    if (wifi.check()) { // WIFI 연결 확인
        ;
    }
}

라이브러리로 구성

  • <문서>/Arduino/libraries/WifiUtil

    WifiUtil.h, WifiUtil.cpp


WiFiEspClient 클라이언트 객체

WiFiEspClient 객체

  • TCP Socket 처리 객체
  • connect(서버주소, 포트번호)
    • 지정 서버의 포트 번호로 접속
  • print(), println()
    • 메시지 출력
  • available()
    • 수신된 메시지 존재 여부
    • 수신된 메시지의 길이 리턴
  • read()
    • 수신 메시지의 1바이트 읽기
#include <WifiUtil.h>

const char SSID[] = "cooluk";
const char PASSWORD[] = "xofla1106!";
WifiUtil wifi(2, 3);
WiFiEspClient client;
void setup() {
    Serial.begin(9600);
    wifi.init(SSID, PASSWORD);
    request();
}
void loop() {
    response();
}

const char server[] = "arduino.cc";

void request() {
    // if you get a connection, report back via serial
    if (client.connect(server, 80)) {  // 80 : Web Server
        Serial.println("Connected to server");
        // Make a HTTP request
        client.println("GET /asciilogo.txt HTTP/1.1");
        client.println("Host: arduino.cc");
        client.println("Connection: close");
        client.println();
    }
}

void response() {
    while (client.available()) {
        char c = client.read();
        Serial.write(c);
    }
}

[WiFiEsp] Initilization successful - 1.5.4

Attempting to connect to WPA SSID: SSID

[WiFiEsp] Connected to SSID

You're connected to the network

SSID: SSID

IP Address: 192.168.0.91

Signal strength (RSSI):-732 dBm


[WiFiEsp] Connecting to arduino.cc

Connected to server

HTTP/1.1 200 OK

Server: nginx/1.4.2

Date: Thu, 17 Sep 2020 07:37:19 GMT

Content-Type: text/plain

Content-Length: 2263

Last-Modified: Wed, 02 Oct 2013 13:46:47 GMT

Connection: close

Vary: Accept-Encoding

ETag: "524c23c7-8d7"

Accept-Ranges: bytes

...

댓글