2016-11-05 8 views
0

Ich habe eine NodeMCU 0.9 Board mit ESP8266E-Chip. Ich kann eine LED ein- und ausschalten mit einem einfachen Code unten. Dieser Code wurde mit Arduino IDE geschrieben.Verbinden NodeMCU Server mit C#

  #include <ESP8266WiFi.h> 

      const char* ssid = "iPhone"; 
      const char* password = "1234567890ABCD"; 

      int ledPin = D0; // GPIO16 
      WiFiServer server(80); 

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

       pinMode(ledPin, OUTPUT); 
       digitalWrite(ledPin, LOW); 

       // Connect to 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"); 

       // Start the server 
       server.begin(); 
       Serial.println("Server started"); 

       // Print the IP address 
       Serial.print("Use this URL to connect: "); 
       Serial.print("http://"); 
       Serial.print(WiFi.localIP()); 
       Serial.println("/"); 

      } 

      void loop() { 
       // Check if a client has connected 
       WiFiClient client = server.available(); 
       if (!client) { 
       return; 
       } 

       // Wait until the client sends some data 
       Serial.println("new client"); 
       while(!client.available()){ 
       delay(1); 
       } 

       // Read the first line of the request 
       //String request = client.readStringUntil('\r'); 
       String request = client.readString(); 
       Serial.println(request); 
       client.flush(); 

       // Match the request 

       int value = LOW; 
       if (request.indexOf("/LED=ON") != -1) { 
       digitalWrite(ledPin, LOW); 
       value = LOW; 
       } 
       if (request.indexOf("/LED=OFF") != -1) { 
       digitalWrite(ledPin, HIGH); 
       value = HIGH; 
       } 

      // Set ledPin according to the request 
      //digitalWrite(ledPin, value); 

       // Return the response 
       client.println("HTTP/1.1 200 OK"); 
       client.println("Content-Type: text/html"); 
       client.println(""); // do not forget this one 
       client.println("<!DOCTYPE HTML>"); 
       client.println("<html>"); 

       client.print("Led pin is now: "); 

       if(value == LOW) { 
       client.print("On"); 
       } else { 
       client.print("Off"); 
       } 
       client.println("<br><br>"); 
       client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>"); 
       client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />"); 
       client.println("</html>"); 

       delay(1); 
       Serial.println("Client disonnected"); 
       Serial.println(""); 

      } 

Dann kann ich auf die NodeMCU mit meinem Web-Browser und Ein- und Ausschalten der LED.NodeMCU verbinden auch an den Browser LED-Statusdaten senden. Aber ich möchte das mit C# Formular-Anwendung tun. Ich habe mit diesem Code versucht. In Visual Studio 2013 ist kein Kompilierungsfehler aufgetreten. Es kann jedoch keine Verbindung zum NodeMCU-Server hergestellt werden.

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    using System.Net.Sockets; 
    using System.Net; 


    namespace WindowsFormsApplication1 
    { 
     public partial class Form1 : Form 
     { 

      static TcpClient tcpClient = new TcpClient(); 
      public static readonly byte[] ip = new byte[] { 172, 20, 10, 2 }; 

      static IPAddress ipAddress = new IPAddress(ip); 
      IPEndPoint hostEndPoint = new IPEndPoint(ipAddress, 80); 
      static Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      ASCIIEncoding asen = new ASCIIEncoding(); 


      public Form1() 
      { 

       InitializeComponent(); 

      } 


      private void button2_Click(object sender, EventArgs e) 
      { 
       soc.Connect(ipAddress, 80); 
       NetworkStream stm = new NetworkStream(soc); 
       tcpClient.Connect(ipAddress, 80); 
       stm = tcpClient.GetStream(); 
       byte[] ba = asen.GetBytes("/LED=ON/r"); 
       stm.Write(ba,0,ba.Length); 
      } 

      private void button3_Click(object sender, EventArgs e) 
      { 
       soc.Connect(ipAddress, 80); 
       NetworkStream stm = new NetworkStream(soc); 
       tcpClient.Connect(ipAddress, 80); 
       stm = tcpClient.GetStream(); 
       byte[] ba = asen.GetBytes("/LED=OFF/r"); 
       stm.Write(ba, 0, ba.Length); 
      } 
     } 
    } 

Hilf mir, einen Code in C# zu implementieren.

+0

Was ist das Ergebnis ? Wird eine Ausnahme ausgelöst? Können Sie die Ausnahmebedingungsnachricht posten? – Peter

+0

@Peter Visual Studio gab keine Ausnahme. – user119o

Antwort

0

Obwohl Sie HTTP-Anforderungen mit Low Level-APIs machen können, Ihre viel besser die HttpClient Klasse mit: https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx

Hier ist ein einfaches Beispiel für Ihre button2 Ereignishandler:

private async void button2_Click(object sender, EventArgs e) 
{ 
    using (var client = new HttpClient()) 
    { 
     HttpResponseMessage request = await client.GetAsync("http://172.16.20.10/LED=on"); 
    } 
} 
+0

Der erste Fehler ist, dass Sie HTTP-Header fehlen, möglicherweise gibt es auch andere Probleme. – Peter

+0

Danke..ich werde es versuchen ... Aber was ist das Problem meines C# -Codes? – user119o