JanP
Forum Replies Created
-
AuthorPosts
-
HRothParticipant
Hallo ins Forum,
mein NanoESP-Projekt, bestehend aus einer “klassischen” Arduino-Steuerung und einer zugehörigen kleineren Webseite, platzt aus allen Speichernähten. Andererseits hat der integrierte ESP8266 genug freies SRAM und Flash-Speicher und auch einen leistungsfähigen Prozessor. Deshalb will ich die Webseite in den ESP8266 verlagern. Die Steuerung soll im Nano verbleiben, schon wegen der Anzahl an IOs, die das Projekt benötigt. Eine Handvoll Variable (int, float, char[]) sind zwischen Nano und ESP8266 auszutauschen.
Ganz allgemein halte ich die angedachte Struktur für vorteilhaft für viele Projekte. Denn diese Aufgabenverteilung bringt ein deterministischeres Verhalten der Steuerung, während parallel dazu vom anderen Prozessor asynchron und transparent die Internetanbindung bearbeitet wird.
Nun ergeben sich für mich Fragen, die ich vortragen möchte, bevor ich den ESP8266 des NanoESPs selbst zu programmieren beginne und dabei vielleicht zerschieße.
1) Ein AT+GMR liefert
AT version:0.22.0.0(Mar 20 2015 10:04:26)
SDK version:1.0.0
compile time:Mar 20 2015 11:00:32Wie kann ich eines Tages diesen Zustand wieder herstellen? Kann man das Image auslesen und sichern? Kann man irgendwo genau dieses Original-Binary runterladen? Oder genügt es, ein BareMinimum-Sketch aus der Arduino-IDE zu flashen? Ein USBASP AVR-Programmer mit 5V <-> 3,3V-Umsetzung ist vorhanden.
2a) Man müsste noch die AT-Befehle um die Möglichkeit erweitern, bidirektional Variablenwerte zwischen Nano und ESP8266 auszutauschen. Sind die Quelltexte des ESP8266 irgendwo erhältlich?
Oder
2b) Ich habe etwas von “custom-specific AT commands” gehört, aber nicht verstanden. Hat jemand damit schon mal gearbeitet?
Ich bin gespannt auf eure Beiträge und bedanke mich vorab dafür!
owagottParticipantHallo zusmmen,
mein Pretzel Board ist im WLAN und Ping fleißig vor sich her, doch eigentlich möchte ich Informationen auf meiner Website darstellen.
Wo gehts hier eigentlich zum Internet?
Also ich möchte ein HTTP Get absetzen, alla
http://www.mustermann.de/login.php?user=NanoESP&pass=fkainka&login=1
oder so in der Art.Das Ergebnis ist dann ein
<html><head><title>Login</title></head><body>Login sucessfull</head>Gruß
christianjodebrezelParticipantNetzwerk-Pager:
Bei Eingabe, ES GIBT ESSEN!!!
wird nur der obere und linke Display-Teil beschrieben.
wo könnte der Fehler liegen ?
LG jodebrezeljodebrezelParticipantNetzwerk-Pager:
Bei Eingabe, ES GIBT ESSEN!!!
wird nur der obere und unter linke Display-Teil beschrieben.
wo könnte der Fehler liegen ?
LG jodebrezelDanielParticipantHallo,
mein NanoESP misst die Temperatur. Diese Temperatur soll er nun per WLAN in einer Datei auf ein Storage ablegen.
Im WLAN ist der NanoESP. aber wie bekomme ich ihn dazu eine Datei auf dem Storage abzulegen?
Danke für HilfeKlausParticipantOha, ich glaube da hast Du Dir was vorgenommen.
In jedem Fall muss der NanoESP die gleiche “Sprache” sprechen, wie die NAS, sprich ein Kommunikationsprotokoll. Das könnte Samba, FTP, Apple oder NFS sein (es gibt auch noch mehr). Ich weiß nicht, ob es dafür Bibliotheken gibt. Könnte aber sein, dass Du damit den Speicher des Mikrocontrollers füllst. Du müsstes die komplette Kommunikation (Authentifizierung, Befehle an die NAS, Datenübertragung) nachprogrammieren. Hinzu kommt, dass heutige Systeme oft gar keine unverschlüsselte Verbindung mehr annehmen. Die verschlüssselte Kommunikation wird mehr und mehr zum Standard. Der NanoESP kann allerdings keine Verschlüsselung. Dafür wäre ein extra Cryptochip nötig, da der Algorithmus für den Controller zu umfangreich ist.
Definitiv einfacher wäre es, wenn Du einen “Dienst” schreibst, der die Daten entgegen nimmt. Das könnte im einfachsten Fall ein PHP-Script sein was auf einem Webserver läuft. Je nachdem welche NAS Du hast, bietet diese einen Webserver an.DanielParticipantDanke für die Antwort Klaus. Mein Storage(Synology) hat ein PHP Paket installiert und läuft (wofür auch immer).
wie müsste ich jetzt weitermachen?KlausParticipantDann würde ich ein PHP-Script schreiben. Ich bin allerdings kein Synology-Experte. Deswegen kann ich Dir nicht sagen, wo Du den Speicherort im Dateisystem findest, damit Du dann auch per Freigabe an die Datei dran kommst.
Ich würde die Messwerte per URL (….?parameter=wert) übertragen und per PHP-Script in die Datei schreiben lassen.KlausParticipantP.S.
Ich weiß nicht was Du damit vor hast. Aber wenn Du ne Synology hast, kannst Du darauf ja auch ne Datenbank installieren und die Messwerte stattdessen in die Datenbank schreiben. Vielleicht ist das für Deinen Zweck ja zweckmäßiger.DanielParticipantDas klingt auch gut. Dann könnte ich mir in einer Webseite sogar den Verlauf anzeigen lassen.
Ich möchte eigendlich nur wissen welche Temperatur er gerade gemessen hat und dazu nicht in den Keller gehen, Laptop anschließen und Seriellen Monitor auslesen. Mit der Datenbanklösung müsste ich ja sogar ein Diagramm darstellen können.
Nur wie? Bin kein Programmierer und hangel mich so durch.KlausParticipantDa kann ich jetzt leider nur sagen – üben. Ohne Programmierung wirst Du sowas nicht hin bekommen. PHP ist vom Prinzip keine schwere Sprache. Hinzu kommt dann allerdings zur Anzeige noch HTML für die Darstellung. Dir wird also leider nix anderes übrig bleiben, als Dich etwas in C (für den NanoESP), SQL (Datenbankabfrage), PHP und HTML einzuarbeiten. Als Datenbank würde ich Dir eine MySQL/MariaDB empfehlen. Da findest Du im Internet auch massig Anleitungen.
Du kannst das recht gut auf dem PC mit Xampp üben. Das ist ein Komplettpaket aus für Deinen Fall Webserver, PHP, MySQL-Datenbank. Ist etwas bequemer zum üben, als auf der Synology zu arbeiten und bereits fertig konfiguriert (sogar portabel einsetzbar).
Als Oberfläche, um die Datenbank zu administrieren und zu schauen, ob Deine Scripte das machen was sie sollen, kann ich PHPmyAdmin empfehlen. Ist bei Xampp auch bereits integriert.PhilippParticipantHallo zusammen,
ich möchte gern von der Seite openweathermap.com meine Wetterdaten abziehen und später in einem Display darstellen.
Nun ergibt sich folgende Problematik. Ich habe mir die Libs von Hrn. Kainka zu nutze gemacht (Danke schon mal dafür), um die Daten von der Website abzuzeiehen. Dies klappt soweit:Serielle Ausgabe:
WLAN Connected
AT+CIFSR
+CIFSR:STAIP,”192.168.XXX.XXX”
+CIFSR:STAMAC,”18:fe:34:XX:XX:XX”OK
Internet Connection OK
Ping: 305ms
CONNECTED TO SERVER
REQUEST SEND
{“coord”:{“lon”:9.72,”lat”:53.7},”weather”:[{“id”:802,”main”:”Clouds”,”description”:”scattered clouds”,”icon”:”03d”}],”base”:”stations”,”main”:{“temp”:12,”pressure”:1019,”humidity”:81,”temp_min”:12,”temp_max”:12},”visibility”:10000,”wind”:{“speed”:7.2,”deg”:320},”clouds”:{“all”:40},”dt”:1509097800,”sys”:{“type”:1,”id”:4883,”message”:0.1779,”country”:”DE”,”sunrise”:1509084727,”sunset”:1509119812},”id”:2911298,”name”:”Hamburg”,”cod”:200}CONVERTING DATA
DISCONNECTED FROM SERVERNun will ja den String ja nicht hoch und runter aus einanderschnibbeln. Sondern schön über die JSON-Lib auslesen.
Schheinbar verträgt sich http-Request bzw. die WiFi-Verbindung nicht so gut mit dem JSON-Parser.
Um zu prüfen, ob die Daten richtig sind und um die Buffergröße usw. zu ermitteln habe ich folgendes genutzt:
JSON-AssistentDie Seite gibt einem auch schön den Code wieder, welchen wir zum auslesen der einzelnen Felder benötigen.
Sobald ich diesen aber nutze, bzw. ab dem Moment (JsonObject& root = jsonBuffer.parseObject(json);) kann das System die Daten nicht mehr aus dem Internetziehen und selbst wenn ich dem Parser die Daten vorgebe, schlägt es fehl.Nach dem ich google ein wneig beschäftigt habe, bin ich auch auf folgendes gestoßen:
why-arduinojson-is-slow aber weitergekommen bin ich damit leider auch nicht, da ich kein Profi in Sachen Programmierung bin.Könnt ihr einmal drüber schauen und mit ggf. Verbesserungsvorschläge geben oder sagen woran es liegt? DANKE :)
(Zeile 118 ist der Parser)
#include <NanoESP.h> // #include <NanoESP_HTTP.h> //NanoESP_HTTP http = NanoESP_HTTP(nanoesp); //http.sendRequest(1, "GET", servername + page); #include <ArduinoJson.h> #include <SoftwareSerial.h> #define DEBUG true #define LED_WLAN 13 #define SSID "SSID meines WLAN" #define PASSWORD "Mein super geheimer Key" #define servername "api.openweathermap.org" #define APIKEY "Mein API-KEY" #define CityID "2911298" NanoESP nanoesp = NanoESP(); //----------------- die NanoESP-Konfiguration vornehmen void setup() { Serial.begin(19200); nanoesp.init(); if (!nanoesp.configWifi(STATION, SSID, PASSWORD)) { debug(F("Error: WLAN not Connected\n")); } else { debug(F("WLAN Connected\n")); digitalWrite(LED_WLAN, HIGH); } //Print IP in Terminal debug(nanoesp.getIp()); //Time for Ping int vTime = nanoesp.ping(servername); if (vTime > 0 ) { debug("Internet Connection OK\nPing: " + String(vTime) + "ms"); } else { debug(F("Error: Internet Connection")); } } //----------------- unsere Dauerschleife void loop() { connectServer(); convertData(readData()); disconnectServer(); delay(300000); } //----------------- Verbinden mit dem openwaethermap-Server und Request senden void connectServer() { String page = "/data/2.5/weather?id=" + String(CityID) + "&units=metric&APPID=" + String(APIKEY); String getRequest = "GET " + page + " HTTP/1.1\r\n" + "Host:" + servername + "\r\n\r\n"; //"Connection: close\r\n\r\n" ; //"Connection: keep-alive\r\n\r\n" ; if (nanoesp.newConnection(1, "TCP", servername, 80)) { debug("CONNECTED TO SERVER"); if (nanoesp.sendData(1, getRequest)) { debug("REQUEST SEND"); } else { debug("BAD REQUEST RESPONSE"); } } else { debug("COULD NOT CONNECT TO SERVER"); } } //----------------- Verbindung mit dem openwaethermap-Server aufheben void disconnectServer() { if (nanoesp.closeConnection(1)) { debug("DISCONNECTED FROM SERVER"); } else { debug("\r\nCOULD NOT DISCONNECT FROM SERVER"); } } //----------------- die angeforderten Daten aus dem NanoESP lesen String readData() { String data; char endOfHeaders[] = "\r\n\r\n"; while (!nanoesp.available()) {}; //warten auf NanoESP while (nanoesp.available()) { if (nanoesp.find(endOfHeaders)) //damit wir nur die JSON-Daten auslesen { data = nanoesp.readString(); Serial.print(data); } else { debug("COULD NOT READ DATA"); } } return data; } //----------------- die Daten aus dem JSON-Format konvertieren void convertData(String data) { //{"coord":{"lon":9.72,"lat":53.7},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],"base":"stations","main":{"temp":13.37,"pressure":1019,"humidity":76,"temp_min":13,"temp_max":14},"visibility":10000,"wind":{"speed":4.6,"deg":280},"clouds":{"all":75},"dt":1509029400,"sys":{"type":1,"id":4883,"message":0.003,"country":"DE","sunrise":1508998236,"sunset":1509033510},"id":2911298,"name":"Hamburg","cod":200} debug("CONVERTING DATA"); const char* json = data.c_str(); //Serial.println(json); const size_t bufferSize = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(12) + 390; DynamicJsonBuffer jsonBuffer(bufferSize); //const char* json = "{\"coord\":{\"lon\":9.72,\"lat\":53.7},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"base\":\"stations\",\"main\":{\"temp\":13.37,\"pressure\":1019,\"humidity\":76,\"temp_min\":13,\"temp_max\":14},\"visibility\":10000,\"wind\":{\"speed\":4.6,\"deg\":280},\"clouds\":{\"all\":75},\"dt\":1509029400,\"sys\":{\"type\":1,\"id\":4883,\"message\":0.003,\"country\":\"DE\",\"sunrise\":1508998236,\"sunset\":1509033510},\"id\":2911298,\"name\":\"Hamburg\",\"cod\":200}"; JsonObject& root = jsonBuffer.parseObject(json); // // const char* name = root["name"]; // "London" // // if (!root.success()) { // Serial.println("parseObject() failed"); // } // Serial.println(name); } //----------------- entsprechend der globalen Vorgabe debuggen wir oder nicht void debug(String Msg) { if (DEBUG) { Serial.println(Msg); } }
PhilippParticipantIch habe am readData() und convertData() noch ein wenig geschraubt, aber trotzdem schlägt das parsing fehl :/
Die richtigen Daten kommen schon beim JSON-Datenelement an, aber warum es diese nicht versteht gute Frage.Ich habe in einem abgespecktem Programm auch ein wenig experimentiert und es kamen tolle Dinge beim parsing rum.
Alleine ein else-Zweig beim if (!root.success()) { Serial.println(“parseObject() failed”); } führte dazu, dass es nicht mehr ging. :///----------------- die angeforderten Daten aus dem NanoESP lesen String readData() { String data; char endOfHeaders[] = "\r\n\r\n"; while (!nanoesp.available()) {}; //warten auf NanoESP while (nanoesp.available()) { if (nanoesp.find(endOfHeaders)) //damit wir nur die JSON-Daten auslesen { data = nanoesp.readString(); //Serial.print(data); return data; } else { debug("COULD NOT READ DATA"); return "FAILED"; } } //----------------- die Daten aus dem JSON-Format konvertieren void convertData(String data) { debug("\r\nCONVERTING DATA"); const char* json = data.c_str(); Serial.println(json); debug("CONVERTED TO JSON"); const size_t bufferSize = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(12) + 400; DynamicJsonBuffer jsonBuffer(bufferSize); //StaticJsonBuffer<1024> jsonBuffer; JsonObject& root = jsonBuffer.parseObject(json); String location = root["name"]; float temperature = root["main"]["temp"]; if (!root.success()) { Serial.println("parseObject() failed"); } Serial.println("In " + location + " sind es aktuell " + temperature + "°C."); }
shbertParticipantHallo zusammen,
gibt es irgendjemanden, der bereits geprüft hat ob der NanoESP “anfällig” gegen den KRACK Bug ist. Ich nehme an, da der ESP2866 mit seiner Firmware angreifbar war ist es auch der NanoESP. Hat jemand eine Idee, wie das gefixt werden kann?* https://www.heise.de/security/artikel/KRACK-so-funktioniert-der-Angriff-auf-WPA2-3865019.html
* https://github.com/esp8266/Arduino/issues/3725KlausParticipantAlles was es an Updates für den ESP8266 gibt, kannst Du auch in den NanoESP spielen. Der NanoESP ist einfach ein Arduino Nano mit angeflanschtem ESP8266. Es gibt hier auch Anleitungen, wie Du Firmwares einspielst. Oder die Stiftleiste einlöten. Das ist die direkte Schnittstelle zum ESP-Modul.
Ich hatte bisher noch nix von einem KRACK-Update gesehen, war jetzt aber auch ne Woche im Krankenhaus. Muss ich mir aber auch mal ansehen, weil ich da auch sehr interessiert dran bin. Hab auch noch ESP-Module einzeln.
-
AuthorPosts