페이지

글목록

레이블이 IDE인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IDE인 게시물을 표시합니다. 모든 게시물 표시

2017년 2월 12일 일요일

[ESP8266] WiFi FTP Server with SD-Card[3] (Soft AP mode)

1. 오류 발생 : 파일을 전송하는데 처음에만 되고 그 이후로는 안되서 오류 분석 중. 추가로 파일 전송을 하고 난 후, 디렉토리가 없어짐.
2. 오류 원인 : 이름이 한글로된 파일이나 이름에 콤마가 2개 이상인 파일이 문제를 일으켜서 FTP 서버가 동작을 안하는 경우가 있었다.
3. 해결책 : 위의 종류의 파일을 취급하지 않거나, LFN(Long File Name)을 지원하거나 UNICODE(한글 지원)이 되도록 프로그램을 고쳐야 함. (디렉토리 해결책은 다음 글에 올려 놨음)


안녕하세요, 이번에는 Soft AP 를 이용한 8266 FTP Server를 만들어 봤습니다.

주변의 공유기에 붙여서 IP를 할당받아서 사용하는 방법이 아니라, 
8266 자체가 Ftp Server가 됩니다.

이것도 FTP Server가 공식적인 예제가 아니여서인지, 처음에는 Soft AP 는 잘 구현되어서 
SSID 와 Password를 치고 들어갔는데 Ftp Server 동작이 안됐었습니다.

많이 고생을 했는데, 알고 보니 SoftAPIP 주소가 아니라 localIP 주소에 의해 Ftp Server가 동작되도록 되어 있었습니다.
아직 Esp8266 과 네트웍 개념도 없고 c++ 문법도 잘 몰라서 SoftIP 주소에 의해 동작하도록 하는 방법으로 수정할 순 없겠고,
localIP 주소를 수정해서 동작하도록 만들었습니다.

예전의 SD 카드에 의해 동작하는 FTP 예제에서 아두이노 스케치 코드만 조금 고쳐주면 됩니다.

SoftAP 로 동작하는 데에는 독립적인 SSID 와 비밀번호가 필요하니 정의해 놓고,
1
2
3
const char* ssid = "FISI_Server";
const char* password = "0317358631";
 
cs

FTP 에서 사용할 IP 및 Gateway,subnetMask 주소를 정의했습니다.
1
2
3
4
5
// config static IP
IPAddress apIP(19216841);  
IPAddress gateway(19216841); // set gateway to match your network
IPAddress subnet(2552552550); // set subnet mask to match your network
 
cs

config 함수로 실제 local IP,Gateway,SubnetMask 주소를 세팅합니다.
그리고 아무 상관은 없지만 기분이 찝찝하니 SoftAP Ip,gateway,subnetmask 주소도 세팅해 주고,
WiFi.softAP 함수로 위에서 정의해 둔, SSID 와  비밀번호로 AP를 만듭니다.
1
2
3
4
5
6
7
8
9
10
  WiFi.config(apIP, gateway, subnet);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.mode(WIFI_AP);
  WiFi.disconnect();
  delay(100);
  WiFi.softAPConfig(apIP, gateway, subnet);
  WiFi.softAP(ssid, password);
 
cs


위의 소스코드에서 쓸데없이 들어있는 것도 있을텐데, 또 할일들이 많아서 더 테스트는 못했습니다.

전체 아두이노 IDE의 스케치 파일의 소스 코드는 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266FtpServer.h>
 
const char* ssid = "FISI_Server";
const char* password = "0317358631";
 
// config static IP
IPAddress apIP(19216841);  
IPAddress gateway(19216841); // set gateway to match your network
IPAddress subnet(2552552550); // set subnet mask to match your network
 
 
ESP8266WebServer server(80);
FtpServer ftpSrv;   //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial
 
 
 
void handleRoot() {
  server.send(200"text/plain""hello from esp8266!");
 
}
 
void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404"text/plain", message);
}
 
void setup(void){
  delay(1000);
  Serial.begin(115200);
 
  Serial.println("");
  Serial.println(WiFi.SSID());
  Serial.println(WiFi.psk());
  WiFi.config(apIP, gateway, subnet);
 
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.mode(WIFI_AP);
  WiFi.disconnect();
  delay(100);
  WiFi.softAPConfig(apIP, gateway, subnet);
  WiFi.softAP(ssid, password);
 
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
 
  Serial.println("");
  Serial.println("");
 
  WiFi.printDiag(Serial);
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
 
  /////FTP Setup, ensure SPIFFS is started before ftp;  /////////
  
  if (SD.begin(4)) {
      Serial.println("SD opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    
      Serial.println("FTP server On!");
  /*
  if (SPIFFS.begin()) {
      Serial.println("SPIFFS opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    */
}
 
void loop(void){
  ftpSrv.handleFTP();        //make sure in loop you call handleFTP()!!  
  server.handleClient();
 
}
cs

다 준비가 됐으니, Wifi 로 미리 설정해 둔 SSID 와 비번으로 Esp8266 에 접속합니다.



접속이 됐으면 이번에는 랜드폰 앱으로 FTP Client 앱을 받아서 설치합니다.
여러가지가 있는데 저는 터보 클라이언트라는 앱을 사용했습니다.


FTP 프로그램을 실행해서 설정을 다음과 같이 했습니다.


그리고 FTP 서버에 접속하니 SD 카드에 들어있는 내용이 나왔습니다. SOFT AP 도 완료. ~` ^^;

2017년 2월 5일 일요일

[ESP8266] SmartConfig 소개. (ARDUINO IDE)

ESP8266 으로 FTP Server를 만들었는데, 장소를 옮겨서 다른 공유기에 연결하려고 할 때,
그 자리에서 SSID 와 Password를 수정하려면, 
펌웨어를 바꿔주거나 외부에서 UART 또는 SD-Card 의 설정 파일의 내용을 바꿔 주는 방법밖에 생각이 안들었다. 

그러니까, 8266 의 SSID 와 Password를 쉽게 바꿀 수 있는 방법이 없다는 말입니다.

이것을 쉽게 할 수 있는 방법이 SmartConfig 기능이다.
먼저 핸드폰의 SmartConfig APP 프로그램이 필요하다.
이 앱의 기능은 스마트폰이 ESP8266과 접속하면 ESP8266에게 SSID 와 Password를 전달해 준다.
즉, WiFi.begin(ssid, password); 함수를 Smartconfig 기능이 대체해 준다. 
대신 이과정에서 SmartConfig APP이 사용된다.
그 다음은, ESP8266 프로그램에서 전달받은 SSID 와 Password 를 사용해서 FTP 를 하든 WEB을 붙이든 하면 된다.

기존의 FTP 나 웹서버 등등의 SSID 와 Password 를 사용해서 연결하는 아두이노 IDE 소스 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const char* ssid = "SSID";
const char* password = "PASSWORD";
   ...
void setup(void){
  WiFi.begin(ssid, password);
  Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
....
}
cs

이것을 다음과 같이 고치고,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup(void){
  WiFi.mode(WIFI_STA);
  delay(500);
  WiFi.beginSmartConfig();
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if(WiFi.smartConfigDone()){
      Serial.println("WiFi Smart Config Done.");
    }
...
  }
cs


Smartconfig APP 은 구글 Play Store에서 smartconfig 로 검색하면 찾을 수 있다.



SmartConfig APP을 실행해 주면 접속할 SSID 와 Password를 입력해 준다.


그리고 confirm 을 눌러주면 SSID 와 Password가 8266에 전달된다. ESP serial 창에 보면 
대기중에 ....... 이 출력되고 SSID 와 PASSWORD가 전달되면 Wifi Smart Config Done. 이 출력된다.


이 이후는, 사용자가 알아서 용도에 맞게 프로그램을 만들면 됩니다.

저도 스마트콘피그가 뭔 내용인지 모르다가, 해 보고서야 이해가 되는데, 참 괜찬은 기능인 것 같습니다. ^^

2017년 1월 25일 수요일

[ESP8266] 아두이노 IDE 개발 환경 구축

아두이노 보드를 사용하는 것이 아니라, 아두이노 개발환경만 사용해서 ESP8266 개발키트를 프로그램할 수 있네요.

이제 검색해서 알았는데, 제가 산 개발키트 이름이 NODE MCU DEVKIT V1.0 입니다.

먼저 아두이노 IDE를 다운 받아야 하는데, 다운 받을 수 있는 주소는 다음과 같습니다.

저는 IBM PC를 사용하므로 Windows Install 을 선택했습니다.
 현재 최신버전은 1.8.1 입니다. 어떤 사이트에서는 상위 버전은 버그가 있으니 1.6.5를 받으라 했는데,
그동안 버전이 많이 올라가서 수정됐다 싶어서 1.8.1 을 받아서 깔았는데 오류는 없는 것 같습니다.

Just DOWNLOAD 클릭하면 파일이 다운로드 됩니다.


다운로드 받은 설치 파일을 실행합니다.





 바탕화면에 단축아이콘이 생기는데 클릭해서 실행 하십시요.


 ESP8266 계열의 보드와 예제를 추가하기위해서, 파일->환경설정 으로 가서,
추가적인 보드 매니저 URL 란에 http://arduino.esp8266.com/stable/package_esp8266com_index.json 를 추가합니다.


 툴->보드->보드매니저로 이동.


 ESP-8266 계열의 보드 라이브러리 설치.


 파일->예제->ESP8266 에서 간단한 예제 BLINK 를 열어봅시다.


 툴->보드 로 이동해서, 자신이 갖고 있는 보드와 맞는 개발키트 이름을 선택합니다.
다른 보드를 선택했더니 에러가 나서 다운로드가 안되더군요. 맞는 보드를 잘 선택 하시기 바랍니다.


 툴->포트로 이동해서, 프로그램을 업로드하거나 시리얼 모니터링을 하기 위해서 통신 포트 번호를 맞춥니다.


 보드를 플래쉬 모드로 설정한다. 

나중에 알게된 사실인데, 현재 개발 보드 NODE MCU DEVKIT V3.0 은 업로드를 하면  자동으로 플래쉬모드가 설정되므로 아래 업로드 설정 방법은 필요 없었다. 하지만 수동으로 해도 플래쉬 모드에 들어간다. 이 보드에서는 의미 없지만..


 업로드 버튼을 누르면 컴파일이 된 후, 프로그램이 ESP-8266 개발키트에 업로드됩니다.


 툴->시리얼 모니터를 실행 시키면 시리얼 터미날 창이 뜹니다.


 시리얼 모니터링 창의 보레이트를 74880bps 로 맞춘다. (이런 보레이트 처음 보네요. 특이하다. ^^)
이 상태에서 리셋 버튼을 누르면 몇 줄의 메세지가 뜨면서 프로그램이 실행된다.


 BLINK 프로그램은 포트가 HIGH,LOW 로 반복 출력되는 프로그램인데.. 어떤 핀이 토글되는지 몰라서 그냥 스코프로 여기저기 찍어 보니 보드상에 D0 핀이 토글되는 것을 오실로 스코프로 확인하였다.
뭐 LED를 달아서 테스트 해도 좋다. ^^


[블링크 예제 테스트 영상]