Прошу, у кого есть возможность, проверить код на своей дуине...

maxi_10
Offline
Зарегистрирован: 05.01.2012
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,167 }; // IP address you wish to assign to Arduino
char server[] = "www.yandex.ru"; // IP address of your POP3 server
char inString[165]; // Number of characters to be collected
int i = 0;
int mailNum1 = 0; // First digit of the email number
int mailNum2 = 0; // Second digit
int mailTotal = 0; // Total # of messsage
char d;
int ledPin = 9;

EthernetClient client; 

long updateTimer;
boolean clientConnected = false;
//================================================================================================
void setup()
{
  //  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}
//==================================================================================================
void loop()
{

  updateClient();
  d = checkAvail();
  if (d >= 10){
    getMailNum();
  }

}

/*========================================
 Functions
 =========================================*/
//==================================================================================================
void updateClient() //This function contacts the POP3 server
{
  if ((millis() - updateTimer) > 5000)
  {
    Ethernet.begin(mac, ip);
    //    Serial.println("connecting...");
    delay(1000);
    if (client.connect(server, 110))
    {
      //    Serial.println("connected");
      client.println("user Your.Name"); //Insert your usual email login name
      client.println("pass PassWord"); //And your password here
      client.println("quit");
      client.println();
      clientConnected = true;
    }
    else
    {
      //    Serial.println("connection failed");
    }
    updateTimer = millis();
  }
}
//==================================================================================================
char checkAvail() //This checks if there is data available and returns a char
{
  if (clientConnected)
  {
    if (client.available())
    {
      char c = client.read();
      return(c);
    }
    if (!client.connected())
    {
      //    Serial.println();
      //    Serial.println("disconnecting.");
      client.stop();
      clientConnected = false;
    }
  }
}
//================================================================================================
int getMailNum() //This actually loads the char returned by checkAvail() and puts in into an array
{
  inString[i] = d;
  i++;
  if (i == 165){
    i = 0;
    client.flush();
    mailNum1 = inString[106] - 48; //Array position 106 contains the first digit
    mailNum2 = inString[107] - 48; //Array position 107 contains the 2nd digit if it is available
    if ((mailNum2 >= 0) && (mailNum2 <= 9)){ //If mailNum2 is present, then it is a two digit mail count
      mailTotal = (mailNum1 * 10) + mailNum2; //when 2 digits are present, multiply the 1st by 10 then add to mailTotal
      //            Serial.print("Total emails:  ");
      //            Serial.println(mailTotal);
      blinkLED(); //Run the blink function as many times as there are emails
    }
    else {
      if ((mailNum1 >= 0) && (mailNum1 <= 9)){//if there is only one digit, then that is mailTotal
        mailTotal = mailNum1;
        //        Serial.print("Total emails:  ");
        //        Serial.println(mailTotal);
        blinkLED(); //Blink the LED
      }
    }
  }
}
//=================================================================================================
void blinkLED(){ //Blinks the LED for as many times as indicated by mailTotal
  for(int x = mailTotal; x >= 1; x--){
    digitalWrite(ledPin, HIGH);
    delay(200);             
    digitalWrite(ledPin, LOW);
    delay(200);
  }
}
//==================================================================================================

 

 

 

Код не мой, но немного переработанный и измененный согластно текущей версии IDE.

Данный скеч должен проверить почту и сигнализировать об этом.

Зарание спасибо.

 

P.S.

Прошу прощение за "корявость" пишу с планшета.

9ser
Offline
Зарегистрирован: 18.11.2012

mega2560+W5100 пойдёт?

Опиши что за скетч?

9ser
Offline
Зарегистрирован: 18.11.2012

Скетч залил

Раскоментировал данные в порт

не конектится

с компа пингуется

С браузера ничего не грузится

maxi_10
Offline
Зарегистрирован: 05.01.2012

Немного подправил код.

до сервервера "конектица" количество писем получает. Но вот как заставить выполнять действие пока немогу разобратся. :(

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,35 }; // IP address you wish to assign to Arduino
byte server[] = { 94,100,180,74 }; // IP address of your POP3 server
char inString[165]; // Number of characters to be collected
int i = 0;
int mailNum1 = 0; // First digit of the email number
int mailNum2 = 0; // Second digit
int mailTotal = 0; // Total # of messsage
char d;
int ledPin = 9;

EthernetClient client; 

long updateTimer;
boolean clientConnected = false;
//==========================================================================================
void setup()
{
    Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}
//======================================================================================
void loop()
{

  updateClient();
  d = checkAvail();
  if (d >= 10){
    getMailNum();
  }

}

/*========================================
 Functions
 =========================================*/
//=================================================================================
void updateClient() //This function contacts the POP3 server
{
  if ((millis() - updateTimer) > 5000)
  {
    Ethernet.begin(mac, ip);
        Serial.println("connecting...");
    delay(1000);
    if (client.connect(server, 110))
    {
          Serial.println("connected");
      delay(100);
      client.println("user хххх-m"); //Insert your usual email login name
      delay(100);
      client.println("pass ххххх"); //And your password here
      delay(100);
      client.println("stat");
      delay(100);
      client.println("quit");
      delay(100);
      client.println();
      clientConnected = true;
    }
    else
    {
          Serial.println("connection failed");
    }
    updateTimer = millis();
  }
}
//=======================================================================================
char checkAvail() //This checks if there is data available and returns a char
{
  if (clientConnected)
  {
    if (client.available())
    {
     // Serial.println("--- chtenie bufera ---");
      char c = client.read();
      Serial.print(c);
      return(c);
    }
    if (!client.connected())
    {
          Serial.println();
          Serial.println("disconnecting.");
      client.stop();
      clientConnected = false;
    }
  }
}
//============================================================================================
int getMailNum() //This actually loads the char returned by checkAvail() and puts in into an array
{
  inString[i] = d;
  i++;
  if (i == 165){
    i = 0;
    client.flush();
    mailNum1 = inString[106] - 48; //Array position 106 contains the first digit
    mailNum2 = inString[107] - 48; //Array position 107 contains the 2nd digit if it is available
    if ((mailNum2 >= 0) && (mailNum2 <= 9)){ //If mailNum2 is present, then it is a two digit mail count
      mailTotal = (mailNum1 * 10) + mailNum2; //when 2 digits are present, multiply the 1st by 10 then add to mailTotal
                  Serial.print("Total emails:  ");
                  Serial.println(mailTotal);
      blinkLED(); //Run the blink function as many times as there are emails
    }
    else {
      if ((mailNum1 >= 0) && (mailNum1 <= 9)){//if there is only one digit, then that is mailTotal
        mailTotal = mailNum1;
              Serial.print("Total emails:  ");
              Serial.println(mailTotal);
        blinkLED(); //Blink the LED
      }
    }
  }
}
//============================================================================================
void blinkLED(){ //Blinks the LED for as many times as indicated by mailTotal
 // for(int x = mailTotal; x >= 1; x--){
    digitalWrite(ledPin, HIGH);
    delay(5000);             
    digitalWrite(ledPin, LOW);
 //   delay(200);
 // }
}
//============================================================================================

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

в качестве адреса сервера указываем pop.ya.ru - для яндекса (87.250.250.37)

                                                               pop.mail.ru - для mail.ru (94.100.180.74)

ИТД.

 

PS

Незабываем указыват свои логин и пароль в строках 60 и 62

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

9ser пишет:

mega2560+W5100 пойдёт?

Опиши что за скетч?

Уменя такой же набор :)

 

Задача: Проверять почтовый ящик на наличие новых писем, и при обнаружении оных сигнализировать ("махать" "лапкой" (Хочу серво вшить в мягкую игрушку)). Все это хочу собрать и подарить девушке :)

Основной код нашел на просторах глобальной сети, немного изменил его для работы с pop3 сервером, но некак не могу разобратся в фунциях автора :( 

1) почему в функции 

void updateClient()

изначального варианта он коннектится к серверу но нечего там не делает!

    if (client.connect(server, 110))
    {
      //    Serial.println("connected");
      client.println("user Your.Name"); //Insert your usual email login name
      client.println("pass PassWord"); //And your password here
      client.println("quit");
      client.println();
      clientConnected = true;
    }
    else
    {
      //    Serial.println("connection failed");
    }
    updateTimer = millis();
  }

2) очень хочется понять что должна делать эта функция

int getMailNum()

 

Надеюсь кто нибудь сможет мне помочь :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

maxi_10 пишет:

2) очень хочется понять что должна делать эта функция

int getMailNum()

При коннекте телнетом по  pop3 протоколу (110-й порт) после предъявления правильной пары пароль/логин сервер выдает число - количество почтовых сообщений, лежащих в ящике. Вот это количество и призвана интерпретировать данная функция. Правда что она покажет, если число будет из трех знаков - это вопрос. :) Подробнее - надо читать хаутушки http://www.winsov.ru/net063.php и проверять - что реально Вам возвращает сервер.

maxi_10
Offline
Зарегистрирован: 05.01.2012

При коннекте к серверу pop.mail.ru не сообщяет нечего кроме

+OK

в последней версии своего кода по команде STAT получаю количество писем

но пока не понял как это можно использовать.

Интересно есть команда для POP сервера которая выведет только количество непрочитанных или новых писем?

9ser
Offline
Зарегистрирован: 18.11.2012

разобрались, работает?

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

Спасибо, налаживаем...

к серверу коннектится, но тут теперь проблема с определением новых писем.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

maxi_10 пишет:

Интересно есть команда для POP сервера которая выведет только количество непрочитанных или новых писем?

Как Вы думаете - откуда сервер знает: новые письма они для Вас или старые? :)

Как это делают большие MUA: сервер выдает количество писем, затем клиент запрашивает UID-ы писем с сервера, они идут списком с номерами. Клиент сравнивает с тем, что есть у него в базе и запрашивает новые к загрузке... Вот только тут появляется "новые". А флаг "прочитано" на сервере - можно ставить в imap протоколе, но, боюсь, мощности ардуины не хватит на такую реализацию...

maxi_10
Offline
Зарегистрирован: 05.01.2012

Спасибо!

Как я понял мне необходи мледующий алгоритм работы моего устройства:

1) конектимся к серверу

2) с помощью команды STAT получаем количество писем в ящике

3) сравниваем текущее количество писем с количеством ранее сохраненным

4) если количество отличается в большую сторону сигнализируем о новом письм(е/ах), запоминаем текущее количество писем

4.1) если пользователь заметил сигнал о новых письмах, пользователь нажимает кнопку ("я вижу...")

4.2) отключаем сигнализацию о новых письмах

5) если количество отличается в меньшую сторону запоминаем текущее количество писем, отключаем сигнализацию о новых письмах.

6)дисконектимся

7) ждем 90 секунд

8) go to 1:

 

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Ну, можно и так... Хотя у протокола pop3 есть еще одна грабля: если два разных клиента, а ардуино и пользователь - это два разных клиента, коннектятся к одному и тому же ящику, то сервер может одному из клиентов ответить "mailbox is locked". Так что смысла в таком опросе pop3 ящика лично я не вижу никакого: вот если бы запрашивать From и слать его по xmpp на телефон...

maxi_10
Offline
Зарегистрирован: 05.01.2012

Моя цель именно указывать что есть новое письмо.

В последствии в мягую игрушку будет вшит сервопривод (медвеженок будет махать лапками)

Поэтму мне достаточно того чтобы програма видела наличие новых писем.

Спасибо всем.

Пойду учится парсить текст в arduino.