Sida 1 av 1

ESP8266 problem

Postat: 23 december 2017, 08:11:48
av svanted
jag försöker mig på ett projekt med ESP8266,
syftet är att bygga en knapplåda med en arduino och en ESP8266 som via wifi och socket connect ska få kontakt med en
raspberry pi.
men ack...
har fått igång allt mha exempelprogrammet nedan:

fungerar mot raspen, den kopplar upp och hämtar index.html och skickar ut det på serieporten i klartext.
men efterssom jag även vill ha en webserver på raspen vill jag använda en annan port, t.e.x. 23
som ju är standard telnet...
så jag byter 80 till 23 i koden...
där tar det stopp,
den kopplar upp och allt som den ska men allt den skriver ut är typ:

WiFi connected
IP address:
192.168.10.171
Connected to server
ÿý�ÿý ÿý#ÿý'

ovan är taget från ett likadant problem på nätet där det inte fanns någon lösning på problemet...
min hade inte exakt samma tecken. typ upp och nervända ?

och sedan inget..
vad jag än skickar till raspen kommer inget svar ö.h.t.
jag vill ju ha loginprompt?
för att kunna koppla och typ skicka/ta emot data...
inte säkert mot port 23 och telnet utan en egen socket server...
fast telnet skulle funka för att köra script på raspen att göra det man vill.

vad har jag förbisett?

det funkar givetvis att telnetta in mha en vanlig dator och telnet och att logga in, hur bra som helst,
men icke från ESP8266an...

är det ett teckenkodningsproblem i telnetservern?
då borde det inte gå att telnetta in på port 80 och skicka en GET request som då skriver ut index.html.

vad är det för skillnad mellan socket connects mellan portarna 80 och 23 som jag inte lyckas hitta svar på?

Kod: Markera allt

/*
 *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
 *
 *  You need to get streamId and privateKey at data.sparkfun.com and paste them
 *  below. Or just customize this script to talk to other HTTP servers.
 *
 */

#include <ESP8266WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";

const char* host = "data.sparkfun.com";
const char* streamId   = "....................";
const char* privateKey = "....................";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

int value = 0;

void loop() {
  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");
}

Re: ESP8266 problem

Postat: 23 december 2017, 08:18:04
av Jan Almqvist
Ett problem jag ofta ser är att WiFiClient ligger i funktionen loop(). Då kommer tcp/ip anslutningen att kopplar ner för varje "varv".

Re: ESP8266 problem

Postat: 23 december 2017, 08:30:52
av svanted
jo, men loopen väntar ju på att läsa radslut innan den kopplar ner och går vidare?

och har testat att flytta upp loginfunktionerna i exemplet till "init" och sedan bara vänta på alla tecken som borde komma som svar,
har tyvärr inte koden tillgänglig just nu...

men ALLTID samma krumelurer till svar och sedan stendött,
vad jag än gör...

det är:

Kod: Markera allt

while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
som ska läsa svaret och jag har testat med \r\n, \r eller \n
ingen skillnad.

responsen från telnetservern via en telnet klient är ju klartext och inga d-a krumelurer :evil:

Re: ESP8266 problem

Postat: 23 december 2017, 08:38:03
av Jan Almqvist
Jag läser tecken för tecken vid all kommunikation. Kanske skriver readStringUntil() sönder någon variabel?

Edit: Det kan också vara att Serial.print() inte klarar lägre strängar än 64 tecken.

Re: ESP8266 problem

Postat: 23 december 2017, 09:48:16
av hawkan
Telnet har en liten förhandling alldeles i början t ex om echo och så. Det är det du ser som tecken.
Ditt program får svara tillbaks på detta på ett relevant sätt innan sjäva kommunikationen startar.
Föreslår en studie av källkoden till en telnet-klient för se hur förhandlingen ska gå till.

Re: ESP8266 problem

Postat: 23 december 2017, 11:10:19
av svanted
oiiiii!
gracias!
hittade:
https://stackoverflow.com/questions/104 ... -answering
tack! :D


å God Jul!

på er alla...

Re: ESP8266 problem

Postat: 22 januari 2018, 19:11:33
av svanted
tar upp tråden igen med nästa problem...
ESP8266 verkar vara ooootroligt långsam?
tanken är att använda den som sändare/mottagare till en fjärrkontroll,
knappsats->atmega328->ESP8266*******WIFI*******raspberry pi

men responsen från ESP8266 till raspen är seg som attan,
allt mellan 0.5 till 3 - 4 sekunder, det kommer inte att gå.
har isolerat segheten till ESP8266an och googlat runt i någon timme efter en lösning...

den kopplar upp sig snyggt och prydligt men strängarna in på serieporten tar allt mellan 0.5 och 5 sekunder att nå
socketporten på raspen.

någon som har en idé?

Kod: Markera allt

#include <dummy.h>

/*
 *  Simple HTTP get webclient test
 */

#include <ESP8266WiFi.h>


const char* ssid     = "Pi3-AP";
const char* password = "raspberry";

const char* host = "172.24.1.1";
  WiFiClient client;
int status = WL_IDLE_STATUS;                     // the Wifi radio's status
  const int port = 10001;


  
void setup() {
  Serial.begin(9600);
  delay(100);

  // We start by connecting to a WiFi network

  client.setNoDelay(true);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("Trying to Connect....\r\n");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Netmask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(WiFi.gatewayIP());


  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections



  
}

int value = 0;

void loop() {

String command;

  
  if (!client.connected()) {
  

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }

  }

while (Serial.available()==0) {             //Wait for user input
  
  }
  command=Serial.readString();


  
  
  client.print(command);
  //delay(500);
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  

}

Re: ESP8266 problem

Postat: 22 januari 2018, 19:19:55
av nifelheim
ta bort atmega'n och kör koden direkt på esp8266 utan serieports omvägen

Re: ESP8266 problem

Postat: 23 januari 2018, 06:26:09
av svanted
det har jag gjort, direkt från programmeringsdatorn,
samma eländiga delayer...

om du menar det?
vad gäller atmegan så läser den av en knappmatris med 16 knappar = 8 pinnar, ESPn har bara typ 2/3 pinnar...
så det blir omöjligt att köra matriskoden på den.
kanske HF moduler vore bättre men det vore kul att komplettera med appar som fjärr senare.

Re: ESP8266 problem

Postat: 23 januari 2018, 06:40:37
av Borre
Vad har du för ESP då?
Det är väl ändå en 10-11 användbara pinnar på en ESP, så skaffa kort där alla är utdragna till paddar.

Re: ESP8266 problem

Postat: 23 januari 2018, 08:38:23
av hawkan
Multiplexningen verkar inte vara helt optimal tycker jag. Men det kanske funkar.
Tänker att du kan ligga fast i den ena .available - loopen och det händer saker som behöver tas hand om den andra kanalen.
En variant är att kolla kolla både Serial och client . available samtidigt och om någon av de behöver ha något gjort tar du först reda på vilken det var som triggade available och gör det som ska göras. Sedan tillbaks att kolla båda. Vet inte om det hjälper.

Annars går det bra att tajma de olika delarna i din kod, det är inte så mycket, så tre-fyra mätningar av de olika operationerna borde ge dej en förståelse efter vilken del av koden som tar tid.

Re: ESP8266 problem

Postat: 23 januari 2018, 14:05:01
av svanted
Skärmavbild 2018-01-23 kl. 11.53.53.png
en sådan,
använder just nu 12 pinnar på atmegan, och behöver två lysdioder åckså för wifi status.

det händer bara saker på serial, det är där atmegan skickar data p.g.a. knapptrycknigarna.
client är sekundärt och behöver bara innehålla "ACK" från raspen.

det verkar vara seriekommunikationen in till ESPn som tar tid?

men det är två knappar som är tidskritiska,
har kopplat dem direkt på ESPn så att den skickar kommandona direkt...
och de skickas momentant...
så det kanske löser problemet.

prototypen..
Skärmavbild 2018-01-23 kl. 14.00.29.png