Firmata - ArduinoCommander Unterstützung

Begonnen von CaptBlaubaer, 20 November 2013, 04:50:32

Vorheriges Thema - Nächstes Thema

CaptBlaubaer

#15
Also bei meinem System funktionieren Deine Anforderungen:

1. Verbindung wird um 16 aufgebaut, 16 ist die erste Zahl im Telnet Fenster.
Um 20 kappe ich die Leitung und beende Telnet. 
Um 40 wir die Leitung wieder eingesteckt. und anschliessend wieder eine Telnetverbindung aufgebaut. Die erste Zahl im Telnet ist 46.
Um 43 wechselt der Socket Status von Established auf Listening. Deshalb gibt's auch keine Probleme mit der erneuten Verbindung.

Genau kann ich es noch nicht sagen aber manchmal dauert es bis 30s bis der Socket Status auf listening wechselt. Erst dann kann natürlich wieder erfolgreich verbunden werden. Dieser Timeout hat allerdings nichts mit der Anzahl der Socket zu tun sonder wid IMHO vom TCP Stack bestimmt.

Trying to get an IP address using DHCP
My IP address: 192.168.178.35

Socket#0:0x0 68 D:255.255.255.255(67)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)

0

Socket#0:0x14 23 D:255.255.255.255(67)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
1

.
.
.

Socket#0:0x14 23 D:255.255.255.255(67)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
15

Socket#0:0x14 23 D:255.255.255.255(67)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
ÿûÿû ÿûÿû'ÿýÿûÿýÿþÿþ ÿþÿþ'ÿüÿû$ÿþ$16

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
17

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
18

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
19

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
20

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
21

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
22

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
23

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
24

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
25

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
26

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
27

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
28

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
29

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
30

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
31

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
32

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
33

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
34

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
35

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
36

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
37

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
38

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
39

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
40

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
41

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
42

Socket#0:0x17 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
43

Socket#0:0x14 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
44

Socket#0:0x14 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
45

Socket#0:0x14 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
46

Socket#0:0x14 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
47

Socket#0:0x14 23 D:192.168.178.24(49797)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
ÿûÿû ÿûÿû'ÿýÿûÿýÿþÿþ ÿþÿþ'ÿüÿû$ÿþ$48

Socket#0:0x17 23 D:192.168.178.24(49814)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
49

Socket#0:0x17 23 D:192.168.178.24(49814)
Socket#1:0x0 0 D:0.0.0.0(0)
Socket#2:0x0 0 D:0.0.0.0(0)
Socket#3:0x0 0 D:0.0.0.0(0)
50
.
.
.


Verwirrend finde ich dass MAX_SOCK_NUM sowohl in w5100 und Ethernet definiert wird.

Meine Änderungen haben sich allerdings nur auf Ethernet.* bezogen.
Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

ntruchsess

#16
Zitat von: CaptBlaubaer am 23 November 2013, 21:52:38
Genau kann ich es noch nicht sagen aber manchmal dauert es bis 30s bis der Socket Status auf listening wechselt.
Das ist eine Eigenschaft von TCP. Sei froh, dass der Timeout auf dem Arduino so kurz ist. Je nach Betriebssystem(seinstellungen im Kernel) kann das auch deutlich länger dauern. Wenn man gerade nichts zu übertragen hat, dann erfolgt übrigens gar kein Timeout.
Zitat von: CaptBlaubaer am 23 November 2013, 21:52:38
Meine Änderungen haben sich allerdings nur auf Ethernet.* bezogen.
Wenn Deine Lösung Änderungen an der Ethernet-library erforderlich macht, dann solltest Du dafür sorgen, dass das auch an der richtigen Stelle gehört wird. Also mach dir Gedanken, was in der Ethernet-library fehlt (z.B. ein überschriebener '='-operator am Client-objekt, oder die Möglichkeit die remote-IP-addresse und Port abzufragen, oder eben geziehlt eine neue Verbindung anzunehmen...), und steuer das dort ein - dann haben alle was davon.
Am besten aber vorher auf der Developers-list abstimmen...

- Norbert
while (!asleep()) {sheep++};

CaptBlaubaer

Hi Norbert,

ich vermute, dass bei mir die Verwirrung daher kommt, dass Arduino nicht auf dem Socket Modell sondern auf dem eigenen Client-Server Modell aufsetzt. Dabei geht die Kontrolle über die Sockets verloren weil der Server mit jedem accept() sofort einen neuen Socket belegt.
Leider bin ich kein Programmierer sondern nur Kopierer, deshalb überschreitet die Programmierung einer neuen Socket Library meine Fähigkeiten aber vielen Dank für Deine Rückmeldungen.

Best regards und viele Gruesse,
CaptBlaubaer (CBR)
_________________________________
FHEM 5.5 Raspberry Pi (B), IOMEGA iConnect, Firmata Arduinos USB/LAN, Gembird USB/LAN, ToDo: FHEM auf FritzBox 7390, 7270

ntruchsess

#18
hab grade mal den == operator am EthernetClient überschrieben, ist aber mangels Hardware leider noch ungetestet. Wobei das mit dem W5100 irgendwie doof ist - wenn man mitkriegen möchte, dass ein Socket zwischenzeitlich neu verbunden hat, dann reicht es nicht den index des Sockets zu vergleichen, weil der ja nur auf das entsprechende Register im W5100 verweist und das kann zwischendurch ja eine neue Verbindung enthalten.

- Norbert
while (!asleep()) {sheep++};

ntruchsess

So, der ==-operator am EthernetClient funktioniert, methoden für remoteIP und remotePort habe ich gleich noch mit aufgenommen. Einen Pull-request gegen das Arduino-Repository auf Github habe ich erstellt. Jetzt mal abwarten, wie das bei den Arduino-Core-developern ankommt.

Mit dem ==-operator ist es leicht einen EthernetServer-basierten Stream zu schreiben, der automatisch bei jedem neuen Verbindungsversuch die neue Verbindung übernimmt und die alte(n) schließt. Muss nur (noch) in den Standard aufgenommen werden ;-)

- Norbert

while (!asleep()) {sheep++};

ntruchsess

so, es geht weiter, mein == -operator am EthernetClient hat es grade in den Arduino-master-branch geschafft:
https://github.com/arduino/Arduino/commit/ffb8a557e6743b982dd54f1243ed8fe050c9d717

:-)

while (!asleep()) {sheep++};