Помогите с простой реализацией Nano + ESP8266. Get запрос + обработка ответа.

ciryulnik
Offline
Зарегистрирован: 23.07.2016

Добрый день господа профи!!
Помогите пожалуйста с вроде как относительно простой задачей.
Разбираюсь уже неделю, перечитал пол-интернета и сотню примеров.
Есть Nano + ESP8266(v0.9.2.2).
Требуется посылать запрос на сервер.
Получить ответ (json), отфильтровать хедер, json разобрать по переменных.
Немогу никак ответ от ESP8266 и от сервера записать в переменную для дальнейшей обработки.
Тоесть хотел чтение из 'softserial' сделать не через цикле loop просто для дебага, а после каждой команды в 'softserial' чтобы получить ответ в переменную в дальнейшем.

Схема простая:
TX-10
RX-11
CH_PD,VCC-3.3V
GND-GND
Также пробовал подключать к TX, RX к 0 и 1
Также пробовал подключать стандартные библиотеки <WiFi.h> но при этом не знаю как подключить ESP8266 к свему Nano.

Вот то что есть последнее из кода:

#include <SoftwareSerial.h>

String SID = "ххххххххх";
String PAS = "хххххххх";
String IP = "api.ipify.org";

String s = "";
//String GET = "GET /?format=json HTTP/1.1\r\nHost: "+IP+"\r\nConnection: close\r\n\r\n";
String GET = "GET /?format=json HTTP/1.1\r\nHost: "+IP+"\r\n\r\n";

SoftwareSerial softserial(10, 11); // RX, TX

void setup() {
  softserial.begin(9600);
  Serial.begin(9600);

  softserial.println("AT");
  serialread();

  softserial.println("AT+CWMODE=1");
  serialread();
  delay(1000);
  
  softserial.println("AT+CWJAP=\"" + SID + "\",\"" + PAS + "\"");
  serialread();
  delay(5000);
  
  softserial.println("AT+CIPSTART=\"TCP\",\"" + IP + "\",80");
  serialread();
  delay(500);
  
  softserial.print("AT+CIPSEND=");
  softserial.println(GET.length() + 2);
  serialread();
  delay(100);
  
   softserial.println(GET);
   serialreadd(); 
}

void loop() {
}

void serialread() {
  while (softserial.available()) {
    delay(20);
    if (softserial.available() > 0) {
      char c = softserial.read();
      s += c;
    }
  }
  Serial.println(s);
  s = "";
}

Ответ в сериел монитор:
 

AT


OK

AT+CWMODE=1

no change

AT+CWJAP="dlink16","380937957490"


OK

AT+CIPSTART="TCP","api.ipify.org",80


OK
Linked

AT+CIPSEND=53

> 
GET /?format=json HTTP/1.1
Host: api.ipify.org



SEND OK

+IPD,184:HTTrtni 7hr0

Последний ответ от сервера +IPD... не полностью считывается. Не пойму почему.

Помогитепожалуйста расставить все по местам.
Можем у кого-то буду другие идеи и может я копаю вообще не в том направлении.
Заранее благодарен.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ciryulnik, сроки, конечно, высокоуровневая конструкция, с которой удобно работать, но она достаточно прожорлива с точки зрения расхода памяти. Вы же использование памяти никак не контролируете. Первая мысль - Вам просто не хватает оперативной памяти, чтобы принять ответ полностью.

Araris
Offline
Зарегистрирован: 09.11.2012

Попробуйте так : 

void serialread() {
 delay(500);
  while (softserial.available()) {
    delay(50);
    char c = softserial.read();
    s += c;
    }
  }
  Serial.println(s);
  s = "";
}

Величина пауз для начала побольше, затем методом "тыка" определите минимально рабочие значения.

ciryulnik
Offline
Зарегистрирован: 23.07.2016

Спасибо, Araris.

Перепробовал. Всевравно получаю на последнем єтапе:

+IPD,184:HTTP/1.10
vCynika
tT iooaS2l65 
ee V1e
i925O

Может быть что для моей задачи действительно технически нужно что то серъезнее чем Nano + ESP8266 ??
Спасибо.
ciryulnik
Offline
Зарегистрирован: 23.07.2016

И можно ли использовать всетаки стандартную библиотеку <WiFi.h> для Nano + ESP8266 ? Может кто знает?
Как подключать тогда 
Nano к ESP8266 ?
Спасибо.

Araris
Offline
Зарегистрирован: 09.11.2012

Похоже, в ответ приходит объём информации, переполняющий приёмный буфер softserialа (64 байта по умолчанию, можно увеличить), и превращающий содержимое его в "кашу".

А попробуйте-ка ещё так :

void serialread() {
 delay(50); // или вообще без него
  while (softserial.available()) {
 //   delay(50);
    char c = softserial.read();
    s += c;
    }
  }
  Serial.println(s);
  s = "";
}

 

ciryulnik
Offline
Зарегистрирован: 23.07.2016

Тоже самое ((.
Может есть другие методы дебага?
Или другие пути реализации задачи без использования softserial ?

Araris
Offline
Зарегистрирован: 09.11.2012

Так-с. А попробуйте вместо api.ipify.org с сайтом Гугла побороться, отправьте

GET / HTTP/1.0\r\n

Host: google.com\r\n

\r\n

ciryulnik
Offline
Зарегистрирован: 23.07.2016

ничего ((

AT+CIPSEND=34
> GET HTTP/1.1
Host: google.com
SEND OK
 
+
T/r
L6Sl3
Pheaumvoieu,v"e4nty{phf2,fkf2gy%a9ex3x{dwoeo0rd:a edletaeand{geoipgguw.s/oer.eipon-n#g(gailoo4o%1bgwc/g/l_pes m-ionwc/g/l_ppiu0#l-gi}O, /lpoe<>4i™r qL.wus вen
OK
Unlink
 
Araris
Offline
Зарегистрирован: 09.11.2012

Увы, не пойму я, что у Вас не так (((.

Простите, что не смог помочь.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ciryulnik, перенесите Serial.println(s); внутрь цикла while. Для отладочных целей можете еще добавить перед ним длину строки и объем свободной памяти. "Простыня", правда, получится будь здоров, но, возможно, удастся понять, в каком точно месте возникает проблема.

ciryulnik
Offline
Зарегистрирован: 23.07.2016

Да, спасибо.
Разобрался. Вся проблема с доступной памятью.
У меня функция "void serialread()" не в постоянном цикле поэтому переменная s не очищается "заполняется при ответах до максимума".
Для начала увеличил "#define _SS_MAX_RX_BUFF 1024" (было 64) в \hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h
Ну и переместил чтение в цыкл loop.
Еще нашел неплохой пример сдесь - http://rootpower.com/?p=73
Всем спасибо.
 

Vasa211
Offline
Зарегистрирован: 29.09.2017

Сейчас делаю тоже самое, не могу понять Ваши изменения которые вы описали в последнем сообщении

 

И не могу понять где мне увидить контент страницы