Laden...

simples TCP Paket an Mikrocontroller senden funktioniert mit dem einen Code, mit dem anderen nicht

Erstellt von mipa_acc vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.412 Views
M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 7 Jahren
simples TCP Paket an Mikrocontroller senden funktioniert mit dem einen Code, mit dem anderen nicht

Hallo liebe Community,

ich stehe gerade etwas auf dem Schlauch. Ich habe einen Mikrocontroller (ESP 8266) und will an diesem mittels eines TCP Pakets einen Ausgang schalten. Dies funktioniert mit einem kleinen Tool sehr gut (siehe Anhang):
Wenn ich den ASCII Code 2x4x0 sende, wird ein Ausgang geschaltet - erfolgreich.

Selbiges will ich mit diesem Code, welcher auf dem selben PC ausgeführt wird (wegen Firewall, AV, etc.) erreichen:


private void Connect_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // Resolves a host name to an IPHostEntry instance                            
                IPHostEntry ipHost = Dns.GetHostByName("192.168.148.189");

                // Gets first IP address associated with a localhost 
                IPAddress ipAddr = ipHost.AddressList[0];
        
                // Creates a network endpoint                  
                IPEndPoint ipEndPoint = new System.Net.IPEndPoint(ipHost.AddressList[0], 9274);
                
                // Create one Socket object to setup Tcp connection 
                senderSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                senderSock.NoDelay = false;  

                // Establishes a connection to a remote host 
                senderSock.Connect(ipEndPoint);
                tbStatus.Text = "Socket connected to " + senderSock.RemoteEndPoint.ToString();

                Connect_Button.IsEnabled = false;
                Send_Button.IsEnabled = true;
            }
            catch (Exception exc) { MessageBox.Show(exc.ToString()); }

        }

        private void Send_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // Sending message 
                string theMessageToSend = tbMsg.Text;
                //theMessageToSend = 2x4x0
                byte[] msg = Encoding.ASCII.GetBytes(theMessageToSend);

                // Sends data to a connected Socket. 
                int bytesSend = senderSock.Send(msg);

                ReceiveDataFromServer();

                Send_Button.IsEnabled = false;
                Disconnect_Button.IsEnabled = true;
            }
            catch (Exception exc) { MessageBox.Show(exc.ToString()); }
        }

IP Adresse sowie Port passt. Verbinden kann ich mich auch. Nur wenn ich die Nachricht sende, passiert nichts.

Da wir uns hier in Schicht 4 bewegen schließe ich irgendwelche "Sicherheitsfunktionen", welche in .Net standardmäßig aktiv sind (wie z.B. "HttpWebRequestElement.UseUnsafeHeaderParsing" bei HTTP Requests, Schicht 7) aus. Ich komme nur leider nicht drauf, was in meinem Beispiel anders ist, als in dem kleinen Tool. Wohlgemerkt geht es mir hier erstmal um das reine senden, wenn das läuft, dann kümmere ich mich um das Empfangen der Antwort (wie es ja auch mein kleines Tools macht).

Habr ihr einen Tipp für mich?

Viele Grüße
mipa_acc

185 Beiträge seit 2005
vor 7 Jahren

wird bei dem Tool eventuell noch ein CR/LF mitgesendet?

16.806 Beiträge seit 2008
vor 7 Jahren

Was sagt Dein Debugger denn aus?
Werte werden an den entsprechenden Stellen wie erwartet ermittelt?

    // Resolves a host name to an IPHostEntry instance                            
                IPHostEntry ipHost = Dns.GetHostByName("192.168.148.189");

🤔
Host By Name und ne IP übergeben?
Glück an der Stelle, dass dahinter IPAdress.TryParse ausgeführt wird 😉

Laut Dokumentation aber soll man die Methode eh nicht mehr verwenden. Ist als obsolete markiert.
Das nur nebenbei.

W
872 Beiträge seit 2005
vor 7 Jahren

Fehlt ein Flush?
Ansonsten würde ich mir das mit WireShark anschauen.

M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 7 Jahren

Hallo,

erstmal vielen Dank für eure Antworten!

Wenn ich Debugge, dann stehen alle Werte passend da. Mein senderSock-Objekt (also ein Objekt vom Typ Socket) hat keine Flush-Methode.

Ich muss dazu sagen, dass ich .Net Entwickler bin und mit Miktocontroller (leider) sehr wenig am Hut habe. Deshalb verstehe ich das mit dem CR/LF leider nicht. Googeln erhab Carriage Return, also ein /n am Ende des Strings (wie in C) - oder? Das habe ich auch bereits getestet, hatte aber keine Auswirkungen.
Mit Wireshark habe ich noch nicht gearbeitet, muss ich heute Abend mal testen. Ich hoffe, ich schaffe es, die Filter passend anzupassen.

Sonst noch irgendwelche Ideen?

Vielen Dank!

16.806 Beiträge seit 2008
vor 7 Jahren

carriage return ist nicht /n sondern \r.
\n steht für line feed
/n gibt es gar nicht. Sollte man auch als .NET Entwickler wissen 😃

Zudem hat man als .NET Entwickler durchaus auch mal was mit Sockets zutun; zudem gibt es da genug Lektüre, wie man mit Sockets arbeitet, korrekt die Zeichen setzt und entsprechend flusht.
Google-Suche nach c# socket flush 😃

M
mipa_acc Themenstarter:in
318 Beiträge seit 2006
vor 7 Jahren

Vielen Dank Abt, wenn ich hinter meinen String ein \r schreibe, dann läuft die Sache!

Danke 😃