Ви не увійшли.
Большое всем спасибо. Было приятно пообщаться с умными людьми.
https://uk.wikipedia.org/wiki/Base64
https://www.arduinolibraries.info/libraries/base64
Honey, большое Вам спасибо, мысль уловил - буду работать.
И, если позволите, последний (вернее крайний) вопрос. Передавать большой текстовый файл получается, а вот бинарное фото - нет.
"Нарыл", что протокол SMTP не умеет работать с бинарным кодом, нужно преобразовать в BASE64. Отсюда вопрос: как в среде Arduino IDE на "железе" NANO реализовать преобразование бинарного файла в BASE64 ? Буду признателен за любые примеры по этому поводу (можно на Си для AтМеги).
Приблизно якось так
int8_t sim800l_cmd(char *cmd, char *ok_res, int timeout) {
String res = "";
sim800l.println(cmd);
uint64_t start = millis();
while (millis() - start < timeout) {
if (sim800l.available() > 0)
res += sim800l.readString();
if (res.indexOf(ok_res) >= 0)
return 0;
if (res.indexOf("ERROR") >= 0)
return -1;
}
return -2;
}
if (sim800l_cmd("AT+SMTPSEND", "OK", 5000))
Serial.println("error or timeout");
Kino, Вы были правы. Модем не был готов принимать файл (+SMTPFT: 2, 25). После smtpsend приходил ответ OK, а вот +smtpft: 1,1360 не успевал. Увеличил задержку - все заработало. Огромное Вам спасибо.
Может у кого есть пример кода, как анализировать программно ответы от sim800 (что бы не применять задержки) - буду очень признателен (taras150162@gmail.com).
Додайте рядок
Это не обязательно, если вы передали именно сколько запросили. Модем сам хавает.
Додайте рядок
sim800l.println("\"");
перед
sim800l.println("AT+SMTPFT=0");
Ну варианта два, отслеживать ответ от модема, что он готов принимать файл (+SMTPFT: 2, 25) и по завершению передачи 25-и байт отслеживать ответ ОК.
Или вариант попробовать без карточки послать туда просто любую информацию, например какие-нибудь символы, 25 раз.
Ну или задержку после передачи тоже поставь, может он не успевает сохранить файл на сервере, а ты уже даешь команду на разрыв связи, перед вот этой строкой sim800l.println("AT+SMTPFT=0"); //завершить передачу
Спасибо, исправил, но, к сожалению, не сработало. Приходит на почту вложение TEST.TXT с размером "0". Буду рад любому совету.
Скорее проблема с символом ". Чтобы его послать как символ, надо перед ним ставить обратный слеш. Так как для компилятора это служебный символ начала и конца строки
sim800l.println("AT+SMTPFILE=1,\"TEST.TXT\",0");
.
И так везде, где этот символ используется внутри строки.
Уважаемые форумчане прошу помощи.
Есть Ардуино Nano, модуль SD карты и sim800l (1418B05SIM800L24). В среде Arduino IDE нужно взять файл из SD-карты прикрепить к email и отправить по GPRS на указанную почту. Что сделано. Файл с SD читается, содержимое можно вывести в монитор порта. Письмо успешно отправляется и доходит до адресата, доходит и вложенный файл, но проблема в том что он ПУСТОЙ, т.е. не могу заполнить его данными. Если команды запускаю с монитора порта, то любое вводимое значение сохраняется в файл вложения и он успешно доходит до адресата. А вот с программы - никак. Уже "все мозги разбил на части, все извилины заплел".
Мой код:
#include <SoftwareSerial.h>
#include <Sim800L.h>
#include <SD.h>
#include <SPI.h>
-----тут не важно-------------
sim800l.println("AT+SAPBR=3,1,"APN","Internet"");
delay(4000);
sim800l.println("AT+SAPBR=1,1");
delay(4000);
//sim800l.println("AT+SAPBR=2,1");
//delay(4000);
sim800l.println("AT+EMAILCID=1");
delay(4000);
sim800l.println("AT+EMAILTO=30");
delay(4000);
sim800l.println("AT+EMAILSSL=1");
delay(4000);
sim800l.println("AT+SMTPSRV="smtp.*.*",465");
delay(4000);
sim800l.println("AT+SMTPAUTH=1,"email","password"");
delay(4000);
sim800l.println("AT+SMTPFROM="email","Arduino"");
delay(4000);
sim800l.println("AT+SMTPRCPT=0,0,"email","Denis"");
delay(4000);
sim800l.println("AT+SMTPSUB="test"");
delay(4000);
sim800l.println(touse);
delay(4000);
sim800l.println(msg);
delay(4000);
sim800l.println((char ) 26 );
delay(4000);
sim800l.println("AT+SMTPFILE=1,"TEST.TXT",0");
delay(5000);
sim800l.println("AT+SMTPSEND");
delay(2000);
sim800l.println("AT+SMTPFT=25"); //сколько байт передать
delay(4000);
//========= вот здесь не могу запихнуть 25 байт в sim 800l ================
//1)---- этот кусок не работает-----
char* file_name = "TEST.TXT";
dataFile = SD.open(file_name);
if (dataFile) {
Serial.println("Opening the file: "+String(file_name)+" done.");
}
else {
Serial.println("Error opening " + String(file_name));
}
while(dataFile.available()>0){
sim800l.write(dataFile.read());
}
//1)----------------------------------------
//2)--- этот то же ------------------------
unsigned int var=0;
while(var < 25){
sim800l.write(dataFile.read());
var++;
}
//2)------------------------------------------
dataFile.close();
//===================================================
sim800l.println("AT+SMTPFT=0"); //завершить передачу
delay(1000);
sim800l.println("AT+SAPBR=0,1");