raspberrypiを用いたFTPサーバを以下のサイトを参考に構築し、複数のESP-WROOM-02から温湿度データを送信する環境としていました。
たった1分でftpサーバーをたてる
以前までは問題なく接続が可能でデータの取得もできていましたが
現在ではFTPサーバに接続できない状況になってしまいました。
ESP-WROOM-02 Arduinoのプログラムは
Arduino
1#include <SoftwareSerial.h> 2#include <FS.h> 3#include <ESP8266WiFi.h> // ESP8266用ライブラリ 4#include <WiFiUdp.h> // UDP通信を行うライブラリ 5#define PIN_CAM 13 // IO 13(5番ピン)にPch-FETを接続する 6#define TIMEOUT 2000 // タイムアウト 2秒 7 8#include <Arduino.h> 9#include <Wire.h> 10#include <time.h> 11#include "Adafruit_SHT31.h" 12Adafruit_SHT31 sht31 = Adafruit_SHT31(); 13 14#define JST 3600*9 //日時 15 16#define SSID "*******" // 無線LANアクセスポイントのSSID 17#define PASS "*******" // 無線LANアクセスポイントのパスワード 18 19#define SENDTO "192.168.0.255" // UDP送信先IPアドレス(変更する必要なし) 20#define PORT 1024 // UDP送信ポート番号(変更する必要なし) 21 22//FTPサーバーと接続するための設定 23#define FTP_TO "192.168.******" // FTP 送信先のIPアドレス(入力されているのは例です。ご自分のIPに変えてください) 24#define FTP_USER "uploader" // FTP ユーザ名 25#define FTP_PASS "raspberrypi" // FTP パスワード 26#define FTP_DIR "" // FTP ディレクトリ 27 28 29#define FILENAME "/SHT31-1.txt" //FTPサーバーに送るファイル名(保存するファイル名) 30 31File file; 32WiFiUDP udpFtp; // UDP通信用のインスタンスを定義 33WiFiServer server(80); // Wi-Fiサーバ(ポート80=HTTP)定義 34 35void setup() { 36 37 SPIFFS.begin(); 38 Serial.begin(115200); // 動作確認のためのシリアル出力開始 39 WiFi.mode(WIFI_STA); // 無線LANをSTAモードに設定 40 WiFi.begin(SSID, PASS); // 無線LANアクセスポイントへ接続 41 while (WiFi.status() != WL_CONNECTED) { // 接続に成功するまで待つ 42 Serial.print("."); 43 delay(500); // 待ち時間処理 44 } 45 46 if (! sht31.begin(0x45)) 47 { 48 Serial.println("Couldn't find SHT31"); 49 while (1) delay(1); 50 51 configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); 52 } 53 54 55 server.begin(); // サーバを起動する 56 57 File file = SPIFFS.open(FILENAME, "r"); // 保存のためにファイルを開く 58 if (file == 0) sleep(); // ファイルを開けれなければ戻る 59 60 file.seek(1, SeekSet); 61 char c = file.read(); 62 Serial.println(""); 63 Serial.print("spiffs:"); 64 Serial.println(c); 65 file.close(); 66} 67 68void loop() { 69 70 configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); 71 float tem = sht31.readTemperature(); 72 float hum = sht31.readHumidity(); 73 Serial.println(tem); 74 Serial.println(hum); 75 76 time_t t; 77 struct tm *tm; 78 t = time(NULL); 79 tm = localtime(&t); 80 81 server.begin(); // サーバを起動する 82 83 File file = SPIFFS.open(FILENAME, "r"); // 保存のためにファイルを開く 84 if (file == 0) sleep(); // ファイルを開けれなければ戻る 85 86 file.seek(1, SeekSet); 87 char c = file.read(); 88 Serial.println(""); 89 Serial.print("spiffs:"); 90 Serial.println(c); 91 file.close(); 92 93 File f = SPIFFS.open(FILENAME, "a"); // 保存のためにファイルを開く(追記モードでオープン) 94 95 f.print(tm->tm_hour); 96 f.print(":"); 97 f.print(tm->tm_min); 98 f.print(":"); 99 f.print(tm->tm_sec); 100 f.print(","); 101 f.print(tem); 102 f.print(","); // 文字列の書き込み(書き込みたい文字にしてください) 103 f.println(hum); 104 f.close(); //ファイルを閉じる 105 106 byte ret = doFTP(FILENAME); // FTPで送信する 107 if (ret) { 108 Serial.print("FTP Err :"); 109 Serial.println(ret); 110 delay(3000); 111 } 112 Serial.print("http://"); // デバイス名をシリアル表示 113 Serial.print(WiFi.localIP()); // 本機のIPアドレスをシリアル表示 114 Serial.println(FILENAME); // ファイル名をシリアル表示 115 udpFtp.beginPacket(SENDTO, PORT); // UDP送信先を設定 116 udpFtp.print(", http://"); // デバイス名を送信 117 udpFtp.print(WiFi.localIP()); // 本機のIPアドレスを送信 118 udpFtp.println(FILENAME); // ファイル名を送信 119 udpFtp.endPacket(); // UDP送信の終了(実際に送信する) 120 121 delay(3*60*1000); 122 123} 124 125void sleep() { 126 Serial.println("F Err"); // ファイルを呼び出せなかった時のエラー表示 127}
これまで確認できていることは
・Arduinoのシリアルモニタ上では
spiffs:⸮ SPIFFS open fail FTP Err :11 http://192.168******/1-today.csv 24.26 64.93
・WinのFFFTPで同じアドレス、ホスト名、パスワードで接続することができる
・UbuntuのFile Zillaにおいても接続ができる
よろしくお願いします。
追記
エラーに対応するのは以下のコードになります
#define FTP_WAIT 1 #define BUFFER_SIZE 128 byte doFTP(char *filename){ char ftpBuf[BUFFER_SIZE]; WiFiClient client; WiFiClient dclient; int i; File file = SPIFFS.open(filename,"r"); if(!file){ Serial.println("SPIFFS open fail"); return 11; } Serial.println("SPIFFS opened"); if (client.connect(FTP_TO,21)) { Serial.println("Command connected"); } if(eRcv(client,ftpBuf)) return 21; sprintf(ftpBuf,"USER %s\r\n",FTP_USER); client.print(ftpBuf); delay(FTP_WAIT); Serial.print(ftpBuf); if(eRcv(client,ftpBuf)) return 22; sprintf(ftpBuf,"PASS %s\r\n",FTP_PASS); client.print(ftpBuf); delay(FTP_WAIT); Serial.println("PASS"); if(eRcv(client,ftpBuf)) return 23; client.print("Type I\r\n"); delay(FTP_WAIT); Serial.println("Type i"); if(eRcv(client,ftpBuf)) return 25; client.print("PASV\r\n"); delay(FTP_WAIT); Serial.println("PASV"); delay(100); if(eRcv(client,ftpBuf)) return 26; char *tStr = strtok(ftpBuf,"(,"); if(tStr == NULL) return 27; int array_pasv[6]; for (i = 0; i < 6; i++) { tStr = strtok(NULL,"(,"); array_pasv[i] = atoi(tStr); if(tStr == NULL){ Serial.println("Bad PASV Answer"); return 28; } } unsigned int hiPort,loPort; hiPort = array_pasv[4] << 8; loPort = array_pasv[5] & 255; Serial.print("Data port: "); hiPort = hiPort | loPort; Serial.println(hiPort); if (dclient.connect(FTP_TO,hiPort)) { Serial.println("Data connected"); }else{ Serial.println("Data connection failed"); client.stop(); file.close(); return 31; } sprintf(ftpBuf,"STOR %s%s\r\n",FTP_DIR,filename); client.print(ftpBuf); delay(FTP_WAIT); Serial.print(ftpBuf); if(eRcv(client,ftpBuf)){ dclient.stop(); file.close(); return 32; } Serial.println("Writing"); i=0; while(file.available()){ ftpBuf[i]=file.read(); i++; if(i >= BUFFER_SIZE){ if(!dclient.connected()) break; dclient.write( (byte *)ftpBuf, BUFFER_SIZE); i=0; Serial.print("."); delay(1); } } if(i > 0){ if(dclient.connected()){ dclient.write((byte *)ftpBuf, i); } } dclient.stop(); Serial.println("Data disconnected"); if(eRcv(client,ftpBuf)) return 33; client.print("QUIT\r\n"); delay(FTP_WAIT); Serial.println("QUIT"); if(eRcv(client,ftpBuf)) return 91; client.stop(); Serial.println("Command disconnected"); file.close(); Serial.println("SPIFFS closed"); return 0; } byte eRcv(WiFiClient &client,char *ftpBuf){ byte thisByte,i=0,len=0; while(!client.available()){ delay(FTP_WAIT); if(!client.connected()){ Serial.println("FTP:eRcv:disC"); return 11; } i++; if(i>1000){ // 200ms以上必要 Serial.println("FTP:eRcv:noRes"); return 12; } } while(client.connected()){ if(!client.available()){ delay(FTP_WAIT); if(!client.available()) break; } thisByte = client.read(); if(thisByte==(byte)'\r'); else if(thisByte==(byte)'\n'){ Serial.write('>'); Serial.println(ftpBuf); if(ftpBuf[0] >= '4'){ client.print("QUIT\r\n"); delay(FTP_WAIT); Serial.println("QUIT"); return 1; } if(len>3 && ftpBuf[3] == ' '){ return 0; } len = 0; }else if(len < BUFFER_SIZE - 1 ){ ftpBuf[len] = thisByte; len++; ftpBuf[len] = 0; } } return 0; } void efail(WiFiClient &client){ byte thisByte = 0; client.print("QUIT\r\n"); delay(FTP_WAIT); while(!client.available()){ if(!client.connected()) return; delay(1); } while(client.available()){ thisByte = client.read(); Serial.write(thisByte); } client.stop(); Serial.println("Command disconnected"); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/22 08:15