728x90
반응형
1. 목적
esp8266을 사용하여 아두이노와 PC가 WiFi, Socket을 사용하여 TCP로 데이터를 주고 받음
2. 설명
1) 만들 것 : 와이파이로 연결된 TCP/IP Client (Python)와 Server (esp8266)
2) 재료 : esp8266, 아두이노 UNO, FTDI
3) 회로
- 펌웨어 업로드 : esp8266의 통신속도를 늦춰주기 위해서 115200 -> 9600 (SoftwareSerial 라이브러리 사용위함)
1. esp의 RX는 FTDI의 TX와 TX는 RX와 연결
2. vcc는 3.3v
3. 펌웨어와 업로드 프로그램은 아래 참고 링크 참조.
참고 : http://kocoafab.cc/tutorial/view/592
- UNO-esp8266 : arduino-esp8266-master 라이브러리 사용
1. 코드 내에서 Rx, Tx 할당한 핀에 연결, (RX-TX, TX-RX로 연결하면됨)
2. vcc는 3.3v
라이브러리 다운 : https://github.com/Diaoul/arduino-ESP8266
참고 : http://m.blog.naver.com/damtaja/220311412393
3. 코드
<Client>
# python 버전은 2.7.13
import socket
HOST = '' # esp8266에 접속후 ipconfig 명령을 통해 알아낸 게이트웨이의 주소를 입력하면됨. ex) 192.168.4.1
PORT = 4000 # 정해둔 포트 사용
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
print 'socket created'
HOST = raw_input("IP: ")
s.connect((HOST, PORT))
print 'connet success'
while 1:
data = raw_input("data :")
s.send(data)
print 'send success'
s.close()
<Server>
#include <SoftwareSerial.h>
#include "ESP8266.h"
SoftwareSerial esp8266Serial = SoftwareSerial(10, 11); // 10번 11번을 rx tx로 설정함. (TIMEOUT 뜨면 아두이노에 연결한 rx tx 핀을 바꿔서 껴볼 것)
ESP8266 wifi = ESP8266(esp8266Serial);
void setup()
{
Serial.begin(9600);
// ESP8266
esp8266Serial.begin(9600);
wifi.begin();
wifi.setTimeout(1000);
/****** WiFi commands ******/
// setWifiMode
Serial.print("setWifiMode: ");
Serial.println(getStatus(wifi.setMode(ESP8266_WIFI_ACCESSPOINT))); // ESP를 AP로 사용
// setAPConfiguration
Serial.print("setAPConfiguration: ");
Serial.println(getStatus(wifi.setAPConfiguration("ESP8266", "awesomelib", 10, ESP8266_ENCRYPTION_WPA_WPA2_PSK))); // SSID 이름, 비밀번호, 채널, 암호화방식 설정
wifi.restart();
// getAPConfiguration
char ssid[32] = {};
char password[63] = {};
uint8_t channel;
ESP8266Encryption encryption;
wifi.getAPConfiguration(ssid, password, channel, encryption);
Serial.print("getAPConfiguration: ");
Serial.print(ssid);
Serial.print(", pw: ");
Serial.print(password);
Serial.print(", ch: ");
Serial.print(channel);
Serial.print(", encrypt: ");
Serial.println(encryption);//*/
// setDHCP
Serial.print("setDHCP STA: ");
Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_STATION, false)));
Serial.print("setDHCP AP: ");
Serial.println(getStatus(wifi.setDHCP(ESP8266_WIFI_ACCESSPOINT, true)));//*/
// getIP
IPAddress ip;
Serial.print("getIP STA: ");
Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_STATION, ip)));
Serial.print(" : ");
Serial.println(ip);
Serial.print("getIP AP: ");
Serial.print(getStatus(wifi.getIP(ESP8266_WIFI_ACCESSPOINT, ip)));
Serial.print(" : ");
Serial.println(ip);//*/
/****************************************/
/****** TCP/IP commands ******/
/****************************************/
// setMultipleConnections
Serial.print("setMultipleConnections: ");
Serial.println(getStatus(wifi.setMultipleConnections(true)));
// createServer
Serial.print("createServer: ");
Serial.println(getStatus(wifi.createServer(4000)));
}
int power=0;
void loop()
{
// Wi-Fi Command
// getConnectedStations -> esp8266이 AP모드일 때 연결된 장비들 보여줌
/*
ESP8266Station stations[5];
unsigned int stationCount;
Serial.print("getConnectedStations: ");
Serial.print(getStatus(wifi.getConnectedStations(stations, stationCount, 5)));
Serial.print(" : ");
Serial.println(stationCount);
for (uint8_t i = 0; i < stationCount; i++) {
Serial.print(" - ");
Serial.print(stations[i].ip);
Serial.print(" - ");
for (uint8_t j = 0; j < 6; j++) {
Serial.print(stations[i].mac[j], HEX);
if (j < 5)
Serial.print(":");
}
Serial.println();
}
delay(1000);
*/
/****************************************/
/****** TCP/IP commands ******/
/****************************************/
// getConnectionStatus -> TCP 연결된 기기들 주소 보여줌
/*
ESP8266Connection connections[5];
unsigned int connectionCount;
Serial.print("getConnectionStatus: ");
Serial.print(getStatus(wifi.getConnectionStatus(connectionStatus, connections, connectionCount)));
Serial.print(" : ");
Serial.println(connectionCount);
for (int i = 0; i < connectionCount; i++) {
Serial.print(" - Connection: ");
Serial.print(connections[i].id);
Serial.print(" - ");
Serial.print(getProtocol(connections[i].protocol));
Serial.print(" - ");
Serial.print(connections[i].ip);
Serial.print(":");
Serial.print(connections[i].port);
Serial.print(" - ");
Serial.println(getRole(connections[i].role));
}
delay(5000);
// 데이터 읽어옴
unsigned int id;
int length;
int totalRead;
char buffer[11] = {};
if ((length = wifi.available()) > 0) {
id = wifi.getId();
totalRead = wifi.read(buffer, 10);
if (length > 0) {
Serial.print("Received ");
Serial.print(totalRead);
Serial.print("/");
Serial.print(length);
Serial.print(" bytes from client ");
Serial.print(id);
Serial.print(": ");
Serial.println((char*)buffer);
}
}*/
}
String getStatus(bool status)
{
if (status)
return "OK";
return "KO";
}
String getStatus(ESP8266CommandStatus status)
{
switch (status) {
case ESP8266_COMMAND_INVALID:
return "INVALID";
case ESP8266_COMMAND_TIMEOUT:
return "TIMEOUT";
case ESP8266_COMMAND_OK:
return "OK";
case ESP8266_COMMAND_NO_CHANGE:
return "NO CHANGE";
case ESP8266_COMMAND_ERROR:
return "ERROR";
case ESP8266_COMMAND_NO_LINK:
return "NO LINK";
case ESP8266_COMMAND_TOO_LONG:
return "TOO LONG";
case ESP8266_COMMAND_FAIL:
return "FAIL";
default:
return "UNKNOWN COMMAND STATUS";
}
}
String getRole(ESP8266Role role)
{
switch (role) {
case ESP8266_ROLE_CLIENT:
return "CLIENT";
case ESP8266_ROLE_SERVER:
return "SERVER";
default:
return "UNKNOWN ROLE";
}
}
String getProtocol(ESP8266Protocol protocol)
{
switch (protocol) {
case ESP8266_PROTOCOL_TCP:
return "TCP";
case ESP8266_PROTOCOL_UDP:
return "UDP";
default:
return "UNKNOWN PROTOCOL";
}
}
cf. 라이브러리 기본 샘플 코드를 그대로 사용함, 라이브러리는 내부적으로 AT 커맨드를 사용함.
728x90
반응형
'Computer Science > Server & Network' 카테고리의 다른 글
[프로토콜] FTP (0) | 2022.03.11 |
---|---|
[서버] MariaDB 서버 구축 - 작성 중 (0) | 2022.03.09 |
[서버] Cent OS-7 설치 및 초기 설정 (0) | 2022.03.03 |
[라즈베리파이] 라즈비안 img 설치 (2022년 2월) (0) | 2022.02.20 |
[라즈베리 파이] 라즈비안 OS 설치하기 (0) | 2017.06.17 |
[라즈베리 파이] 라즈베리파이3 모델B 특징 및 구매 방법 (0) | 2016.08.12 |
댓글