Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller über Ethernet verbinden


von Peter H. (borntopizza)


Angehängte Dateien:

Lesenswert?

Hi,

ich bin gerade dabei eine Steuerung für meine Fussbodenheizung zu bauen. 
Ich würde diese gerne über einen ATMEGA 328 via Ethernet steuern. Ich 
benutze ein enc28j60 Modul mit dem der Mikrocontroller über SPI mit dem 
Netzwerk verbunden ist.

Ich habe den Beispiel Sketch "Web Server" aus der "Ethercard.h" Library 
ein wenig angepasst, sodass ich die LED bzw. das Relais auch schon ein 
und ausschalten kann.

Nun möchte ich aber dass ein zweiter ATMEGA, der genau so mit dem 
Netzwerk verbunden ist, dem anderen ATMEGA sagt dass er jetzt das Relais 
ein bzw. ausschalten soll.

Müsste da der ATMEGA, der das Relais schaltet, als Client laufen und 
sich vom anderen (Web Server?) die Info holen "Relais an" bzw. "Relais 
aus" ?
Wie löst man so etwas am geschicktesten? Ich dachte anfangs daran auf 
der Website vom Web Server ein Feld zu machen, das entweder eine 1 oder 
eine 0 anzeigt. Das liest dann der Client und Schaltet dann.
Ich weiß leider nicht wie man diese Info mit dem Client aus der Website 
einliest.

Ich hoffe ihr könnt mir ein wenig auf die Sprünge helfen.

Danke und viele Grüße

Peter

von Wolfgang (Gast)


Lesenswert?

Peter H. schrieb:
> Müsste da der ATMEGA, der das Relais schaltet, als Client laufen und
> sich vom anderen (Web Server?) die Info holen "Relais an" bzw. "Relais
> aus" ?

Die einfachste Lösung ist möglicherweise, wenn du die Information per 
UDP rüber schickst.

von STK500-Besitzer (Gast)


Lesenswert?

Peter H. schrieb:
> Müsste da der ATMEGA, der das Relais schaltet, als Client laufen und
> sich vom anderen (Web Server?) die Info holen "Relais an" bzw. "Relais
> aus" ?
Jepp.

> Wie löst man so etwas am geschicktesten? Ich dachte anfangs daran auf
> der Website vom Web Server ein Feld zu machen, das entweder eine 1 oder
> eine 0 anzeigt. Das liest dann der Client und Schaltet dann.
> Ich weiß leider nicht wie man diese Info mit dem Client aus der Website
> einliest.

Dein Webserver liefert eine HTML-Seite, oder? (Du betreibst ihn momentan 
mit einem Browser vom PC aus).
Das ist eine Textdatei, die dein Client auswerten müsste.
Daten zum Server bekommst du per GET- (einfache Lösung) oder POST-Befehl 
(aufwendgere Lösung).
Wenn es eine Telnet-Library oder -Funktion gibt, brauchst du dich nicht 
um das HTTP-Gerafel kümmern, sondern kannst sie wie eine serielle 
Schnittstelle verwenden.

von Peter H. (borntopizza)


Lesenswert?

Also der erste ATMEGA müsste ein Webserver sein, ich möchte den auch 
steuern können. Geht das dann dass der mit UDP eine Paket an den 2. 
schickt ? Ich finde nicht wirklich einen Sketch.. :-( Sorry ich kenn 
mich mit so kompliziertem Netzwerk Zeug nicht so gut aus

Die Website liefert der erste ATMEGA, an dem möchte ich sowohl die 
eigenen Ausgänge schalten können, als auch das Relais am Client.

Ist der GET Befehlt das mit dem Link (also 192.168.10.199/D5HIGH bzw. 
192.168.10.199/D5LOW) etc. ?


Danke und viele Grüße

Peter

von STK500-Besitzer (Gast)


Lesenswert?

Peter H. schrieb:
> Ist der GET Befehlt das mit dem Link (also 192.168.10.199/D5HIGH bzw.
> 192.168.10.199/D5LOW) etc. ?

Jepp.
in dem Github-Repository, das ich gefunden habe ("google Ethercard.h"), 
gibt es auch ein Beispiel für einen WebClient.
Das wäre doch der Ansatz für dich.

von Stefan F. (Gast)


Lesenswert?

Ich würde auch zum UDP Protokoll raten. Damit ersparst Du Dir einen 
großen Haufen Komplexität.

Bei UDP wird eine Nachricht wie eine Postkarte verschickt. Fire and 
forget. Was da drin steht, bleibt Dir überlassen. Betrachte eine UDP 
Nachricht als ein Array das du an eine Zieladresse sendest. Du brauchst 
keinen Verbindungsaufbau, kein Verbindungsende und auch der Aufwand für 
HTTP Header entfällt.

Es gibt nur drei Einschränkungen:
a) Die maximale Größe bestimmt das schwächste Glied in der Kette (1kB 
gehen praktisch immer).
b) Wenn du schnell nacheinander mehrere Nachrichten sendest, können sie 
durcheinander gewürfelt beim Empfänger ankommen. Aber nicht in lokalen 
Netzen, da ist die korrekte Reihenfolge sicher.
c) Wenn eine Nachricht aufgrund einer Übertragungsstörung nicht ankommt, 
findet keine automatische Wiederholung statt. Das passiert in lokalen 
Netzen nur äußerst selten.

Wenn du möchtest, kannst du den Empfänger natürlich so programmieren, 
dass er eine Bestätigung zurück an den Absender schickt. Und der 
Absender könnte bei ausbleibender Bestätigung eine Warnmeldung anzeigen 
oder mehrmals wiederholen.

Wenn du diesen Aufwand gar nicht brauchst, dann ist UDP auf jeden Fall 
viel einfacher, als TCP oder gar HTTP.

Es gibt bei UDP einen wesentlichen Vorteil: Die Nachrichten bleiben 
zusammenhängend. Wenn du drei mal 100 Bytes sendest, dann kommen beim 
Empfänger auch drei mal 100 Bytes an (außer bei Störungen). Bei TCP ist 
das nicht sicher. Jeder Router darf TCP Pakete sammeln und in geänderter 
Stückelung weiter reichen. Aus 3x 100 bytes könnte dein Router 1x 300 
bytes machen. Oder 1x 290 bytes und dann 1x 10 Bytes für den Rest. Ich 
habe beobachtet, dass dieser Effekt vielen Programmierern nicht bewusst 
ist. Sie fallen dann auf die Nase, wenn die Kommunikation die eigenen 4 
Wände überschreitet, zum Beispiel das Internet einbezieht.

UDP überträgt Nachrichten als Paket, aber ohne automatische Wiederholung 
bei Verlust und ohne garantierte Reihenfolge.
TCP ist mehr als Datenstrom gedacht, der aus Sicht der Endpunkte Bytes 
seriell übermittelt wie ein UART Kabel. TCP wiederholt im Fehlerfall 
automatisch.

von John Doe (Gast)


Lesenswert?

Stefanus F. schrieb:
> Es gibt bei UDP einen wesentlichen Vorteil: Die Nachrichten bleiben
> zusammenhängend. Wenn du drei mal 100 Bytes sendest, dann kommen beim
> Empfänger auch drei mal 100 Bytes an (außer bei Störungen). Bei TCP ist
> das nicht sicher.


Fragmentierung findet auf Layer 3 statt, daher können UDP-Pakete sehr 
wohl fragmentiert werden, ohne dass man etwas dagegen machen kann (Auch 
das DF-Bit muss ein Router laut Standard nicht zwingend beachten).
Bei 100 Byte-Paketen passiert das aber sicherlich nicht.

von Stefan F. (Gast)


Lesenswert?

John Doe schrieb:
> Fragmentierung findet auf Layer 3 statt, daher können UDP-Pakete sehr
> wohl fragmentiert werden, ohne dass man etwas dagegen machen kann (Auch
> das DF-Bit muss ein Router laut Standard nicht zwingend beachten).
> Bei 100 Byte-Paketen passiert das aber sicherlich nicht.

Soweit ich weiß werden UDP Pakete nur fragmentiert, wenn sie (für ein 
übertragendes Gerät) zu groß sind. 1kB geht immer am Stück durch.

von BornTOPizza (Gast)


Lesenswert?

Hmm,

das mit dem WebClient hab ich noch nicht hinbekommen.

Der will sich anscheinend nicht richtig verbinden...

[webClient]
IP:  192.168.10.71
GW:  192.168.10.1
DNS: 192.168.10.1
DNS failed
SRV: 0.0.0.0

<<< REQ
<<< REQ
1
#include <EtherCard.h>
2
3
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)
4
5
// mac address
6
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
7
// ethernet interface ip address
8
static byte myip[] = { 192,168,10,199 };
9
// gateway ip address
10
static byte gwip[] = { 192,168,10,1 };
11
12
// LED to control output
13
int ledPin10 = 7;
14
15
byte Ethernet::buffer[700];
16
17
char const page[] PROGMEM =
18
"HTTP/1.0 503 Service Unavailable\r\n"
19
"Content-Type: text/html\r\n"
20
"Retry-After: 600\r\n"
21
"\r\n"
22
"<html>"
23
"<head><title>"
24
"Service Temporarily Unavailable"
25
"</title></head>"
26
"<body>"
27
"<h3>This page is used behind the scene</h3>"
28
"<p><em>"
29
"Commands to control LED are transferred to Arduino.<br />"
30
"The syntax: http://192.168.0.XX/?LED10=OFF or ON<br />"
31
"<br />"
32
"Status:<br />"
33
"1"
34
"</em></p>"
35
"</body>"
36
"</html>"
37
;
38
39
void setup () {
40
pinMode(ledPin10, OUTPUT);
41
42
Serial.begin(9600);
43
Serial.println("Trying to get an IP...");
44
45
Serial.print("MAC: ");
46
for (byte i = 0; i < 6; ++i) {
47
Serial.print(mymac[i], HEX);
48
if (i < 5)
49
Serial.print(':');
50
}
51
Serial.println();
52
53
if (ether.begin(sizeof Ethernet::buffer, mymac, 8) == 0)
54
{
55
Serial.println( "Failed to access Ethernet controller");
56
}
57
else
58
{
59
Serial.println("Ethernet controller access: OK");
60
}
61
;
62
63
#if STATIC
64
Serial.println( "Getting static IP.");
65
if (!ether.staticSetup(myip, gwip)){
66
Serial.println( "could not get a static IP");
67
blinkLed(); // blink forever to indicate a problem
68
}
69
#else
70
71
Serial.println("Setting up DHCP");
72
if (!ether.dhcpSetup()){
73
Serial.println( "DHCP failed");
74
blinkLed(); // blink forever to indicate a problem
75
}
76
#endif
77
78
ether.printIp("My IP: ", ether.myip);
79
ether.printIp("Netmask: ", ether.netmask);
80
ether.printIp("GW IP: ", ether.gwip);
81
ether.printIp("DNS IP: ", ether.dnsip);
82
}
83
84
void loop () {
85
86
word len = ether.packetReceive();
87
word pos = ether.packetLoop(len);
88
89
// IF LED10=ON turn it ON
90
if(strstr((char *)Ethernet::buffer + pos, "GET /?LED10=ON") != 0) {
91
Serial.println("Received ON command");
92
digitalWrite(ledPin10, HIGH);
93
}
94
95
// IF LED10=OFF turn it OFF
96
if(strstr((char *)Ethernet::buffer + pos, "GET /?LED10=OFF") != 0) {
97
Serial.println("Received OFF command");
98
digitalWrite(ledPin10, LOW);
99
}
100
101
// show some data to the user
102
memcpy_P(ether.tcpOffset(), page, sizeof page);
103
ether.httpServerReply(sizeof page - 1);
104
}
105
106
void blinkLed(){
107
while (true){
108
digitalWrite(ledPin10, HIGH);
109
delay(500);
110
digitalWrite(ledPin10, LOW);
111
delay(500);
112
}
113
}

von Peter H. (borntopizza)


Lesenswert?

Bekommt der UDP "Sender" auch eine eigene IP bzw. kann man den dann auch 
als WebServer verwenden?

von Stefan F. (Gast)


Lesenswert?

Du machst hier genau den Fehler, auf den ich oben hinwies. Du gehst 
einfach davon aus, den kompletten GET Request an einem Stück (Paket) zu 
empfangen.

Ist das jetzt TCP oder UDP? Wenn TCP, wo reagierst du auf 
Verbindungsaufbau und Ende?

von Peter H. (borntopizza)


Lesenswert?

Ich weiss nicht was für ein Protokoll hier verwendet wird, hier laufen 
die Beispiel Sketches Webserver und Webclient aus der EtherCard.h 
Library.  Mikrocontroller.net wird mir ausgegeben. Nur den Inhalt meines 
Webservers mag er nicht anzeigen.

Ich kann mir auch nicht erklären woran das liegt.
Wenn ich mit dem Browser am PC auf den Webserver zugreifen also 
192.168.10.199 wird mir die Seite korrekt dargestellt. Das ganze aber 
ohne https:// bzw. http:// davor.

Sorry dass ich hierzu nicht mehr sagen kann, aber ich hab selber wenig 
bis keine ahnung :-(

Trotzdem Danke!

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Das ist offensichtlich HTTP Protokoll in der Versin 1.0. Informiere Dich 
mal wie das Protokoll funktioniert und dann benutzt du Wireshark, um die 
Kommunikation auf Netzwerk-Ebene zu untersuchen. Das Programm zeigt 
nicht nur die Kommunikation auf allen Ebenen an, sondern markiert auch 
Fehler.

von H.Joachim S. (crazyhorse)


Lesenswert?

Warum willst du es denn überhaupt via Ethernet machen? Die Vorteile 
(Geschwindigkeit, Datenmenge) brauchst du nicht.

Es gibt doch so schöne Bussysteme, die genau dafür hervorragend geeignet 
sind (incl. einfacherer Verkabelung).

Bei mir läuft CAN mit lächerlichen 10kBit (bedingt durch die 
Junkers-Therme, damit hat alles angefangen) - was soll ich sagen: völlig 
ausreichend.

von Peter H. (borntopizza)


Lesenswert?

Ja zum einen Liegen dort schon Cat Kabel, Wifi ist nicht möglich und ich 
möchte die Steuerungen über POE Speißen, das ist eigentlich auch der 
Hauptgrund für Ethernet. Zum anderen möchte ja die Heizung aus der Ferne 
steuern können. ( Das ganze dann mit einer VPN Verbindung zur Fritz Box 
)

von Karl M. (Gast)


Lesenswert?

Hallo  Peter H.,

ich möchte Dir noch einen weiteren Weg zum Smarten Haus aufzeigen,
eine Realisierung über IOBroker.
Auf, z.B. einem kleinen Raspberry Pi 3, lässt sich der IOBroker einfach 
auf dem OS Debian 9 installieren und betreiben.

Deine Aktoren und Sensoren, lassen sich dann über unterschiedliche 
Protokolle und Netze mit der Basiseinheit IOBroker verbinden.

Man kann so nicht nur eine Heizung steuern, sondern auch Licht, 
Rollladen, die Türklingel u.v.a einbinden.

Mit der Visualisierung VIS ist eine Nutzung auf unterschiedlichen 
Endgeräten möglich.

_Link_:
1) http://www.iobroker.net/
2) https://forum.iobroker.net/
3) [ioBroker] Installation & Einrichtung [Tutorial] [HD] 
https://www.youtube.com/watch?v=cThlN8In9mk

von Opensource _. (opensource)


Lesenswert?

John Doe schrieb:
> Fragmentierung findet auf Layer 3 statt,...
nur wenn ein Layer 8 an eine bedingunglose Fragmentierung glauben möchte 
und

> ...daher können UDP-Pakete sehr wohl fragmentiert werden,
> ohne dass man etwas dagegen machen kann.
John Doe kann u.U. nichts dagegen machen, aber eigene Menschen können 
Wikipedia lesen:
 [Bedingung für IP-Fragmentierung]:"*falls* die Gesamtlänge des 
Datenpakets größer als die Maximum Transmission Unit der 
Netzwerkschnittstelle ist."
und durch kontrollierte Wahl der Netzwerkschnittstellen bspw. nur 
Ethernet(1500),W-lan(2312), Power-lan(1500) und Dsl (i.a. 1500-8 
wg.PPPoE) mit MTU=1492 (um externe Fragmentierung durch bspw. NAT zu 
verhindern auch etwas niedriger) die Anzahl der Fragmentierungen auf 0 
reduzieren.

Falls dein internes Netz über ISDN/X.25 Schnittstellen realisiert ist 
(X.25 ist die Hauptursache für Fragmentierungen im Internet, ist dort 
allerdings wie Fragmentierungen selbst kaum verbreitet) dann hilft eine 
MTU=(576-Protokoll_size) Einstellung.

> (Auch das DF-Bit muss ein Router laut Standard nicht zwingend beachten).
RFC 1191:"When a router is unable to forward a datagram because it 
exceeds the MTU of the next-hop network and its Don't fragment bit is 
set, the router is required to return an ICMP Destination Unreachable 
message to the source of the datagram,..."

> Bei 100 Byte-Paketen passiert das aber sicherlich nicht.
zumindest dürfte die sichere Einstellung den schlechten Empfang von 
Wikipedia und RCF erklärten. Wenn nur so kurze Fragmente empfangen 
werden können, dass 0 zusammenhängende Informationen bei John Doe 
angekommen sind, dann findet dort wohl weiterhin die berichte 
Fragmentierung statt.

NB.: geschichtlich u.U. ganz interessant: zu einem weltweiten Einsatz 
von OSI-Netzwerkprotokollen nach ISO-OSI-Standard (Layer 1..7) wird es 
wohl allenfalls Jahrzehnte nach der Fertigstellung von Hurd kommen, 
allerdings war die Hoffnung auf OSI-Protokolle in den 1990er gerade in D 
der Grund Internet bzw. IP-Protokolle abzulehnen.
Teilweise lassen sich IP Protokolle mit den OSI-Layern veranschaulichen, 
aber teilweise sind diese nicht so 'sauber' wie ein Microkernel bzw. 7 
Layer Modell getrennt.

Eine einfach stattfindende Fragmentierung auf einem Layer oder 
IP-Protokoll wie in der Welt von sicher 100 byte Fragmentierten wäre 
weder nach IP noch einem OSI-Protokoll zulässig.

von Strubi (Gast)


Lesenswert?

Moin,


Peter H. schrieb:
>
> Ich habe den Beispiel Sketch "Web Server" aus der "Ethercard.h" Library
> ein wenig angepasst, sodass ich die LED bzw. das Relais auch schon ein
> und ausschalten kann.
>
> Nun möchte ich aber dass ein zweiter ATMEGA, der genau so mit dem
> Netzwerk verbunden ist, dem anderen ATMEGA sagt dass er jetzt das Relais
> ein bzw. ausschalten soll.
>

Ich könnte Dir dafür jetzt ne fertige Opensource-Lösung aufschwatzen, 
aber was Stefanus sagt, hat für ein einzelnes Relais im Sinne von "Keep 
it simple" die meiste Wahrheit: Denk dir ein einfaches UDP/TCP 
Paket-Protokoll aus, was einen vernünftigen "Ack, hab ich gemacht" 
zurückgibt.

Alle anderen Optionen wie Webserver, Iobroker und was auch immer aus der 
SCADA-Welt ist dafür viel zu schwergewichtig.

von John Doe (Gast)


Lesenswert?

Opensource _. schrieb:
> John Doe schrieb:
>> Fragmentierung findet auf Layer 3 statt,...
> nur wenn ein Layer 8 an eine bedingunglose Fragmentierung glauben möchte
> und
>> ...daher können UDP-Pakete sehr wohl fragmentiert werden,
>> ohne dass man etwas dagegen machen kann.
> John Doe kann u.U. nichts dagegen machen, aber eigene Menschen können
> Wikipedia lesen:


Opensource kann sicherlich nichts gegen Legasthenie oder andere Ursachen 
Deines dramatischen Leseverständnisses machen, aber andere Menschen 
haben zumindest erfolgreich die Grundschule absolviert.


>  [Bedingung für IP-Fragmentierung]:"*falls* die Gesamtlänge des
> Datenpakets größer als die Maximum Transmission Unit der
> Netzwerkschnittstelle ist."


Falsch! Nicht mal für das Wikipedia-Lesen und -Zitieren reicht es bei 
Dir. Hier das Vollständige Zitat:
"Die IP-Fragmentierung bezeichnet die Aufteilung eines IP-Datenpakets 
auf mehrere physikalische Datenblöcke, falls die Gesamtlänge des 
Datenpakets größer als die Maximum Transmission Unit der 
Netzwerkschnittstelle ist. "
Fragmentierung kann auch erfolgen, wenn die MTU der 
Netzwerkschnittstelle größer ist. Versteht aber nur jemand, der die RFCs 
lesen kann.


>> (Auch das DF-Bit muss ein Router laut Standard nicht zwingend beachten).
> RFC 1191:"When a router is unable to forward a datagram because it
> exceeds the MTU of the next-hop network and its Don't fragment bit is
> set, the router is required to return an ICMP Destination Unreachable
> message to the source of the datagram,..."


Ja, und wo widerspricht sich das? Lern bitte erstmal Lesen und die 
deutsche Sprache. Das kannst Du offensichtlich nicht. Was ich 
geschrieben hab, ist dass ein Router fragmentieren darf, auch wenn die 
MTU des nächsten Netzwerks gross genug ist.


>> Bei 100 Byte-Paketen passiert das aber sicherlich nicht.
> zumindest dürfte die sichere Einstellung den schlechten Empfang von
> Wikipedia und RCF erklärten. Wenn nur so kurze Fragmente empfangen
> werden können, dass 0 zusammenhängende Informationen bei John Doe
> angekommen sind, dann findet dort wohl weiterhin die berichte
> Fragmentierung statt.


Bei Dir sind offensichtlich schon in der Grundschulzeit nur Fragmente 
des Lernstoffs angekommen, sonst würdest Du ausreichend Lesekenntnisse 
haben.

von Marc H. (marchorby)


Lesenswert?

Hallo Peter,

sorry, aber wenn du schon Arduino benutzt, warum machst du es nicht 
gleich auf einem ESP32? Der ENC28J60 braucht sehr viel Strom. Zudem hat 
der ESP genügend Speicher für eine Website und 
UDP-Befehlsinterpretierung.

von STK500-Besitzer (Gast)


Lesenswert?

Peter H. schrieb:
> Bekommt der UDP "Sender" auch eine eigene IP bzw. kann man den dann auch
> als WebServer verwenden?

Jeder Teilnehmer im Netz braucht eine eigene IP-Adresse.
Wie sieht dein Netzwerk mit den ATmegas bis jetzt aus?
Hängt da noch ein Router dran?
Kannst du da reingucken, welche IP-Adressen vergeben sind?

Stefanus F. schrieb:
> Du machst hier genau den Fehler, auf den ich oben hinwies. Du gehst
> einfach davon aus, den kompletten GET Request an einem Stück (Paket) zu
> empfangen.

und das auf Die Frage mit der IP-Adresse. ROFL

von Stefan F. (Gast)


Lesenswert?

Marc H. schrieb:
> warum machst du es nicht gleich auf einem ESP32?

Vielleicht weil Power over WLAN noch nicht erfunden wurde.

von H.Joachim S. (crazyhorse)


Lesenswert?

Stefanus F. schrieb:
> Vielleicht weil Power over WLAN noch nicht erfunden wurde.

Du bist etwas hinterher, funktioniert prima :-)
https://www.wimo.com/power-over-wlan_d.html

von Marc H. (marchorby)


Lesenswert?

Stefanus F. schrieb:
> Marc H. schrieb:
>> warum machst du es nicht gleich auf einem ESP32?
>
> Vielleicht weil Power over WLAN noch nicht erfunden wurde.

Er kann ja das Kabel zur Stromversorgung hernehmen. Zudem kann man am 
ESP noch ein Phy anschließen

von Peter H. (borntopizza)


Lesenswert?

Also ich hab jetzt noch ein wenig weiter probiert, und bin jetzt wieder 
mal an einem punkt an dem ich nicht weiter komme :-)

Am Seriellen Monitor wird mir jetzt das ausgegeben was ich sehen will.

"<<< REQ >>>
HTTP/1.0 503 Service Unavailable
Content-Type: text/html
Retry-After: 600

<html><head><title>Sers</title></head><body>Status: 1 <br />The syntax: 
http://192.168.0.XX/?LED10=OFF...";


Jetzt weiß ich leider nicht wie ich das in einen String bekomme und dann 
die 1 bzw. 0 hinter Status als Variable "isolieren" kann. Vielleicht 
könnt ihr mir ja helfen. Ich weiß nicht welcher Befehl den Website Text 
postet.
1
// Demo using DHCP and DNS to perform a web client request.
2
// 2011-06-08 <jc@wippler.nl>
3
//
4
// License: GPLv2
5
6
#include <EtherCard.h>
7
8
// ethernet interface mac address, must be unique on the LAN
9
static byte mymac[] = { 0x78,0x69,0x69,0x2D,0x30,0x37 };
10
11
byte Ethernet::buffer[700];
12
static uint32_t timer;
13
14
const char website[] PROGMEM = "192.168.10.199";
15
16
// called when the client request is complete
17
static void my_callback (byte status, word off, word len) {
18
  Serial.println(">>>");
19
  Ethernet::buffer[off+300] = 0;
20
  Serial.print((const char*) Ethernet::buffer + off);
21
  Serial.println("...");
22
}
23
24
void setup () {
25
  Serial.begin(57600);
26
  Serial.println(F("\n[webClient]"));
27
28
  // Change 'SS' to your Slave Select pin, if you arn't using the default pin
29
  if (ether.begin(sizeof Ethernet::buffer, mymac, 8) == 0)
30
    Serial.println(F("Failed to access Ethernet controller"));
31
  if (!ether.dhcpSetup())
32
    Serial.println(F("DHCP failed"));
33
34
  ether.printIp("IP:  ", ether.myip);
35
  ether.printIp("GW:  ", ether.gwip);
36
  ether.printIp("DNS: ", ether.dnsip);
37
38
#if 1
39
40
  // if website is a string containing an IP address instead of a domain name,
41
  // then use it directly. Note: the string can not be in PROGMEM.
42
  char websiteIP[] = "http://192.168.10.199/";
43
  ether.parseIp(ether.hisip, websiteIP);
44
#else
45
  // or provide a numeric IP address instead of a string
46
  byte hisip[] = {http://192.168.10.199/};
47
  ether.copyIp(ether.hisip, hisip);
48
#endif
49
50
  ether.printIp("SRV: ", ether.hisip);
51
}
52
53
void loop () {
54
  ether.packetLoop(ether.packetReceive());
55
56
  if (millis() > timer) {
57
    timer = millis() + 5000;
58
    Serial.println();
59
    Serial.print("<<< REQ ");
60
    ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback);
61
    Serial.println();
62
    Serial.print(ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback));
63
  }
64
}

Das mit IOBroker schau ich mir aufjedenfall nochmal an ! Ich habe auch 
anfangs ein wenig an Node Red gedacht, mal sehen .

Danke und viele Grüße

Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter H. schrieb:
> ich bin gerade dabei eine Steuerung für meine Fussbodenheizung zu bauen.
Wenn ich mir diese Platine so anschaue, dann möchte ich dir damit Glück 
wünschen...   ;-)

Denn das brauchst du angesichts der Tatsache, dass da weit und breit 
kein wirksam angeschlossener Blockkondensator am µC ist. Die 
Keramikkondensatoren, die irgendwo auf der Leiterplatte sitzen und 
kreuz&quer verbunden sind, helfen dem µC da nicht.

Auch das Layout um den Oszillator hat nichts mit dem Vorschlag aus dem 
Datenblatt zu tun.

Auf diese Art kann man kuriose und schwer zu findende Fehler zu Gesicht 
bekommen.

: Bearbeitet durch Moderator
von Peter H. (borntopizza)


Lesenswert?

Die Platine ist jetzt wirklich nichts besonderes, aber an ihr liegts 
definitv nicht. Sieht man denn die Kondensatoren oben links nicht ? :D

von Opensource _. (opensource)


Lesenswert?

John Doe schrieb:
> Opensource _. schrieb:
>> John Doe schrieb:
>>> Fragmentierung findet auf Layer 3 statt,...
>> nur wenn ein Layer 8 an eine bedingunglose Fragmentierung glauben möchte
>> und
>>> ...daher können UDP-Pakete sehr wohl fragmentiert werden,
>>> ohne dass man etwas dagegen machen kann.
>> John Doe kann u.U. nichts dagegen machen, aber eigene Menschen können
>> Wikipedia lesen:
>
>
> Opensource kann sicherlich nichts gegen Legasthenie oder andere Ursachen ...
wenn John Doe 0 Worte aus einem kopierten Text nennen kann (100% 
Legasthenie), dann bleibt "Opensourse" sicherlich das Einzige was in das 
sichere 100 byte passt.

> Falsch! Nicht mal für das Wikipedia-Lesen und -Zitieren reicht es bei
> Dir. Hier das Vollständige Zitat:
> "[Die IP-Fragmentierung BEZEICHNET die Aufteilung eines IP-Datenpakets
> auf mehrere physikalische Datenblöcke], falls die Gesamtlänge des
> Datenpakets größer als die Maximum Transmission Unit der
> Netzwerkschnittstelle ist. "
wenn John Doe eigenständig lesen könnte und den 'vollständigen' Halbsatz 
inkl. des Wortes "beZEICHNET" verstehen könnte, dann könnte John Doe 
verstehen, dass der bezeichnungs Habsatz für die vollstndige sachliche 
Beschreinug 0 Inhalt hat.

Wenn Joh Doe 0 Worte aus dem mühsam kopierten 'vollständigen' Zitat 
nennen kann und automatisch
> Fragmentierung kann auch erfolgen, wenn die MTU der
> Netzwerkschnittstelle größer ist.
unter der Kopie ausgibt, dann bleibt Jphn Does Layer 8-3 sicher in der 
Fragmentierung.

> Was ich geschrieben hab, ist dass ein Router fragmentieren
> darf, auch wenn die MTU des nächsten Netzwerks gross genug ist.
wenn du lediglich von "opensource" berichten kannst, dann ist das Wort 
"required" (dt.: erforderlich) aus RFC 1911 sicherlich etwas zu 
anspruchsvoll für 100 byte.

> Ja, und wo widerspricht sich das?
- "das" aus 100 byte Fragmention: "das DF-Bit muss ein Router laut 
Standard nicht zwingend beachten"
- "das" aus RFC:"the router is required to return an ICMP Destination 
Unreachable message
wenn du keine englischen Worte lesen kannst und du hilflos nach "das" 
als Ersatz fragen musst, dann benötigst du sicherlich Hilfe um dein 
erstes Wort aus Texten nennen zu können.

Falls du einmal schreiben kannst was du nicht verstanden hast, dann 
benötigst du evtl. zukünftig keine so starke Fragmentierung.

Hilfegesuche wie:
> Lern bitte erstmal Lesen und die deutsche Sprache.
wenn John Doe 0 englische Worte aus einer RFC in seiner Reaktion 
nennen kann, dann helfen auch solche Bittgesuche nichts.

John Dope versteht sicherlich nicht, dass er Worte aus einer RFC 
selber nennen müsste und sein Hilfegesuch ein Fremder möge für John 
lesen ihn in dauerhafte Abhängigkeit bringt.

> Bei Dir sind offen sichtlich schon in der Grundschulzeit nur Fragmente
> des Lernstoffs angekommen, sonst würdest Du ausreichend Lesekenntnisse
> haben.
sicherlich sind solche visuellen Erlebnisse, wenn exakt 0 Worte aus 
kopierten Text beantwortet werden konnten, in sicheren 100 byte 
Fragmenten empfangen worden.

Wenn du zukünftig einmal ohne Hilfe von "opensource" auf einen Text 
antworten möchtest, dann müsstest du schon lesen lernen und einzelne 
Wörter aus einem Text nennen nennen können. Solange du nur 
"Opensource" aus der Überschrift schreiben kannst bleibt dir natürlich 
eine eigene Antwort verwehrt.

In deinem Netz dürfte eine einfach stattfindende Fragmentierung auf 
Layer 3 (OSI) als Alternative zu IP-Protokollen sicherlich die beste 
Lösung sein.

Fall John Doe einmal das erste Wort aus Wikipedia oder anderen 
opensource Texten im Zusammenhang in seiner Reaktion verwenden kann dann 
musst er nicht "opensource" um Hilfe bemühen und schafft zukünftig 
vielleicht sogar sein Netz mit x.25 (MTU ca.500 byte) zu betreiben

von Stefan F. (Gast)


Lesenswert?

Nicht schon wieder!
Das ist doch der Schwurbel-Kasper, den man nur unter Drogeneinfluss 
verstehen kann.

Kannst du auch mal etwas interessantes (eventuell gar fachliches) von 
Dir geben, als immer nur andere niedermachen? Oder ist das schon zu viel 
verlangt.

von Opensource _. (opensource)


Lesenswert?

Stefanus F. schrieb:
> Nicht schon wieder!
> Das ist doch der Schwurbel-Kasper, den man nur unter Drogeneinfluss
> verstehen kann.
deine spezielle Erfahrung du könntest den Schwurbel-Kasper nur unter 
Drogeneinfluss verstehen, während du nüchtern so unter Einfluss stehst, 
dass du kein Wort aus fremden Texten beantworten kannst, sind 
sicherlich eine sehr fachliche Ausgabe.

Wenn maximal Schwurbler 0 Worte aus der Umwelt nennen können dann ergeht 
es denen wie den Schwurblern aus dem Internet die bereits eine 
Bohrmaschine(!) erlebt haben die "furchtbar klappert und wackelt" 
(einfach so im Internet zu finden) und sich nur an den Ort des Kaufes 
erinnern konnten, aber nicht das der Ort bereits beim vormaligen Kauf 
kein Probiermarkt war.


> Kannst du auch mal etwas interessantes (eventuell gar fachliches) von
> Dir geben,
sobald du die Möglichkeit hast in ganzen Sätzen eine konkrete Frage zu 
stellen oder eine *konkrete Aussage bspw. WAS (Text) dich so aufgeregt 
hat, kannst du auch fachliches lesen.

> als immer nur andere niedermachen?
wenn du Zugang zu realen Sätzen bekommen solltest, dann könntest du 
nachlesen, dass der Beitrag einfach den FAKE der irgendwie 
stattfindenen Fragmentierung beantwortet hat.


Wenn du nur schwurbeln kannst und keinen originalen Text ohne Hilfe 
beantworten kannst, dann bleiben deine Horrorgeschichtchen einfach 
unreparierbar.
Vielleicht ist eine bei dir stattfindene Fragmentierung auch die Ursache 
0 Worte fachlich nennen zu  können.

Kannst du eine fachliche Aussage wann eine Fragmentierung im realen 
Router stattfindet bzw. stattfinden würde/sollte nennen ?

von Stefan F. (Gast)


Lesenswert?

Du hast vergessen, zu erwähnen, dass auch zu dumm zum korrekten zitieren 
bin.

von Opensource _. (opensource)


Lesenswert?

Stefanus F. schrieb:
> Du hast vergessen, zu erwähnen, dass auch zu dumm zum korrekten zitieren
> bin.
Nein. Wenn du den fachliche Hintergrund, dass zum zitieren mehr als ein 
(1) Wort aus dem zu zitierenden Text benötigt wird, verstehst, könntest 
du das auch verstehen.


Wenn der Zwang zum schwurbeln ohne eine konkrete Aussage so groß ist, 
dass du immer  weiter schwurbeln musst, dann ist die Frage:
"Kannst du eine fachliche Aussage wann eine Fragmentierung im realen
Router stattfindet bzw. stattfinden würde/sollte nennen ?"
sicherlich etwas zu fremdfachlich.

von Stefan F. (Gast)


Lesenswert?

Wenn wir damit KI Systeme trainieren, brabbeln sie nur noch dummes Zeug 
wie Babies.

von Opensource _. (opensource)


Lesenswert?

Stefanus F. schrieb:
> Wenn wir [die Schwurbler die 0 externe Worte nennen
> können und von uns berichten müssen] damit [mit dem was wir
> produzieren] KI Systeme trainieren, brabbeln sie nur noch dummes Zeug wie 
Babies.
wenn die KI auch so derartig unter Produktionszwang gesetzt wird, dass 
sie immer aus sich herausgeben muss, dann endet so eine KI sicherlich 
wie die Schwurbler die nicht anhalten können weil sie kein Wort 
verstehen können.

Wenn die Stefanus Gemeinschaft eine Frage:
"Kannst du eine fachliche Aussage wann eine Fragmentierung im realen
Router stattfindet bzw. stattfinden würde/sollte nennen ?"
beantworten könnte, dann müsste die keine "Babies" für ihre fachliche 
Ausgabe verwenden, sondern könnte einen von ihnen selbst antworten 
lassen.

von Taiwanese (Gast)


Lesenswert?

Die Wahl der Hardware betrachte ich als schlecht.
Das tut man sich doch nicht ( mehr) an.

Schon gesagt, ich wiederhole aber:

ESP32, MQTT und das Ekosystem ist überragend.

Das Kabel kannst Du zur Versorgung nehemen und gleichzeitig auch für die 
Datenübertragung RS 4xx.

Der Wlan nutzen, out of The Box.
MicroPython, Arduino, espeasy......

Tu Dir den Gefallen!

von Mitlesa (Gast)


Lesenswert?

Lothar M. schrieb:
> Denn das brauchst du angesichts der Tatsache, dass da weit und breit
> kein wirksam angeschlossener Blockkondensator am µC ist. Die
> Keramikkondensatoren, die irgendwo auf der Leiterplatte sitzen und
> kreuz&quer verbunden sind, helfen dem µC da nicht.

Lautstarke Zustimmung von mir.

Und es wundert mich doch sehr dass niemand schon früher das
Hardware-Thema angesprochen hat.

Peter H. schrieb:
> Sieht man denn die Kondensatoren oben links nicht ?

Wenn man die Kondensatoren einfach nur auf die Platine klebt dann
sieht man sie auch. Dann haben sie den gleichen Effekt.

Peter H. schrieb:
> ... aber an ihr liegts definitv nicht.

Erinnert mich an den Satz den Windows-Programmierer manchmal
von sich geben wenn sie sich zur Fehlerfreiheit/Problemen ihrer
Programmschöpfung äussern: "Works on my machine".

Peter H. schrieb:
> ... aber an ihr liegts definitv nicht.

Da ist aber garantiert was im Argen, der (vermutete) Spanungsregler
hat auch nur zufällig einen Kondensator in seiner Nähe platziert,
zwei (richtig dimensionierte) braucht es dort auf jeden Fall.

Die Platine funktioniert nur zufällig (vielleicht) aber nicht
weil für alle Fälle vorgesorgt wurde.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ich frag mich grade eher wie man es schafft sone Riesenplatine zu 
entwerfen und dabei die Bauteildichte gegen Null gehen zu lassen.
Zudem besteht die Platine gefühlt zur Hälfte aus Drahtbrücken.
Also da hätt man auch gleich auf Lochraster fädeln können!
Dann ist da nichtmal enn Verpoishcerer Standard ISP drauf, sondern sowas 
eigenes als 1x Reihe.

Sowas geht auch in 1 lagig:
https://www.ulrichradig.de/home/index.php/dmx/alias-2

Muss ja kein Artnet rauf, sondern dein Code.

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

Und der Strombedarf des ENC....
Wenn man da ein paar 24/7 laufen lässt, kommt da am Jahresande einiges 
an Minusgeld raus.

von Stefan F. (Gast)


Lesenswert?

Wenn der TO unbedingt die Kombination AVR+Ethernet-Controller will, 
würde ich zu einem CrumbX1-Net Modul 
(https://www.chip45.com/download/CrumbX1-NET_V1.2_infosheet.pdf) raten. 
Dazu passend bietet der Hersteller ein POE Add-On Board an. Das Ganze 
hat dann ungefähr das Format einer Streichholzschachtel und funktioniert 
garantiert zuverlässig.

Die aktuelle beispiel-Firmware dazu kommt "zufällig" von mir: 
http://stefanfrings.de/net_io/index.html

Und ganz "zufällig" empfängt sie Kommandos zum Schalten der I/O Pins via 
TCP Socket und HTTP, ganz so wie der TO es haben möchte. Ich bin sicher, 
dass er meinen Code in Windeseile an seine Bedürfnisse anpassen kann, 
falls er nicht schon (wie ich vermute) genau zum Anwendungsfall passt.

Die Stromaufnahme ist in Bereitschaft 70mA und bei aktiver Übertragung 
120mA, also ähnlich dem ESP8266.

von Mitlesa (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Und der Strombedarf des ENC....

... hat auch was mit dem Layout zu tun. Da bekommt der ENC
seine Masse und Versorgung über möglicherweise sehr ver-
schlungene Masse- und Vcc-Pfade. Wer schon mal was von
Verkopplungen über Masseströme erlebt hat wird ein Lied
davon singen können. Aber ...

Peter H. schrieb:
> an ihr liegts definitv nicht.

von Marokscha (Gast)


Lesenswert?

Peter H. schrieb:
> Also ich hab jetzt noch ein wenig weiter probiert, und bin jetzt wieder
> mal an einem punkt an dem ich nicht weiter komme :-)

Das war zu erwarten...

von Torsten (Gast)


Lesenswert?

Habe zu einem ähnlichen Thema in den letzten Tagen ein paar Tests 
gemacht. Und zwar ging es bei mir darum, in der Hauptverteilung im 
Keller mittels einem Nano v3 (Atmega 328P) zwei Lampen zu schalten, die 
an der Außenfassade angebracht sind (kein Bewegungsmelder, ist mehr eine 
optische Sache). Da es dort kein WLAN gibt, habe ich (direkt in Fernost) 
ein Ethernet-Shield bestellt, welches einen W5500 besitzt (Wiznet). Da 
gibt es unterschiedliche Shields, ich rede von so nem ganz kleinen Teil, 
das man zB bei Ebay kriegt und lediglich zehn Pins hat und keine Taster. 
Was ich so im Netz gefunden habe, ist ein W5500 vom Strombedarf 
effizienter als ein W5100. Vom Strombedarf sieht das so aus (jeweils 
inkl. Arduino gemessen an 5V und mit einem einfachen Multimeter):

Nano v3 (alleine): 14,5 mA
Nano v3 + W5500 (@100 MBps): 128 mA
Nano v3 + W5500 (@10 MBps): 84 mA
Nano v3 + W5500 (Power down): 47 mA

Info: Um die Geschwindigkeit anzupassen bzw. den PowerDown zu erzwingen, 
muss man die Ethernet2-Lib etwas modifizieren und das Phy-Register 
passend parametrieren. Habe mir dazu eine kleine Methode implementiert, 
so dass ich das aus dem Sketch raus machen kann.

Im Vergleich dazu einen ESP-01: Den habe ich mit ca. 70 mA bei 3.3V 
gemessen, ein ESP-12E auf einem NodeMCU-Entwicklerboard war bis auf 2-3 
mA ungefähr gleich. Also muss man sich schon überlegen, ob man sich den 
Stress mit Ethernet wirklich antun will, so ein ESP-01 ist ziemlich 
kompakt und braucht unterm Strich halt auch weniger Strom. Ok, hat aber 
auch nur zwei GPIOs. Datenaustausch habe ich, wie es hier auch schon 
erwähnt wurde, mit MQTT gemacht. Kann ich nur empfehlen, da kann man 
sich den ganzen Overhead mit Webserver sparen.

Energieeffizienz:
Meine ursprüngliche Idee war, dass ich den Arduino schlafen lasse und 
per Wake-on-Lan aufwecke, dabei war mir allerdings vorher nicht klar, 
dass der wesentlich größere Verbrauch vom Ethernet-Shield ausgeht. Mein 
aktueller Plan ist jetzt, dass ich per MQTT fetche und dann das 
Ethernet-Shield schlafen lege. Nach ein paar Minuten wecke ich es wieder 
auf und dann wird erneut gefetcht und wieder geschlafen. Parallel 
definiere ich noch einen Schalter in openHAB, der sowas wie 
"Eth-Standby" heißt. Den Zustand dieses Schalters lese ich ebenfalls per 
MQTT aus oder steuere darüber, ob das Eth-Shield schlafen gelegt wird. 
So könnte ich also, wenn ich wollte, das Eth-Shield auch wach halten.
Da ich die zu schaltende Lampe aber eigentlich nicht in "Echtzeit" 
schalten können muss, passt das im Prinzip auch schon ohne diesen 
Schalter. Ob das im Alltag so funktioniert, muss ich dann noch testen. 
Ist bislang nur eine Idee.

von svensson (Gast)


Lesenswert?

Mal ein anderer Gedankenansatz:

> Kat. 5 Kabel liegen dort. Zwei ATmegas koppeln.

Warum mißbrauchst Du die Kabel nicht einfach? 2-4 Adern für die 
Stromversorgung (evtl einfach einen PoE-Injector verwenden) und die 
restlichen 4 Adern zur direkten Koppelung der beiden ATmegas. Schon 
entfällt das ganze Geraffel mit dem Webclient.

Wir machen das sehr oft. Bei uns laufen z.B. analoge/digitale Sensoren, 
analoge Telefone oder Steuerungssignale über TwistedPair (Cat. 5/6/7), 
weil die Infrastruktur heute nahezu in jedem Raum vorhanden ist. Zudem 
ist das TP-Kabel heute oftmals billiger als traditionelles 
Fernmeldekabel.

von svensson (Gast)


Lesenswert?

Ach so, ich vergaß: Wenn man so etwas macht, dann ist es extrem wichtig, 
die Ports an den Patchfelder ordentlich zu beschriften!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.