Primeros Pasos con Netduino como webserber


 

En estas lineas vamos a mostrar cómo crear un pequeños servidor web, que ejecutaremos en nuestro Netduino (+). El servidor web debe responder ante cada petición HTTP con un «Hola Mundo».

 

Empezamos creando un nuevo proyecto de tipo Netduino Plus en nuestro Visual Studio–> Botón derecho sobre el proyecto y elige «Añadir nuevo elemento». –>Añade una nueva clase llamada WebServer.cs.
Aquí presentamos una versión muy simple de nuestro servidor web  que se mantiene a la escucha, atendiendo las peticiones, y respondiendo «Hola Mundo» mientras hace parpadear el led de nuestro Netduino Plus.
public class WebServer : IDisposable
{
   private Socket socket = null;
   private OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
   public WebServer()
  {
       //Inicializamos el socket
       socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       //Conectamos el socket
       socket.Bind(new IPEndPoint(IPAddress.Any, 80));
      //Iniciamos la escucha
      socket.Listen(10);
      ListenForRequest();
 }
 public void ListenForRequest()
{
  while (true)
  {
     using (Socket clientSocket = socket.Accept())
     {
       //Aceptamos el cliente
       IPEndPoint clientIP = clientSocket.RemoteEndPoint as IPEndPoint;
       EndPoint clientEndPoint = clientSocket.RemoteEndPoint;
       int bytesReceived = clientSocket.Available;
       if (bytesReceived > 0)
      {
           //Obtenemos la petición
           byte[] buffer = new byte[bytesReceived];
           int byteCount = clientSocket.Receive(buffer, bytesReceived, SocketFlags.None);
           string request = new string(Encoding.UTF8.GetChars(buffer));
           Debug.Print(request);
         //Componemos la respuesta (Nota 1)
           string response = «Hola Mundo»;
           string header = «HTTP/1.0 200 OK\r\nContent-Type: text; charset=utf-8\r\nContent-Length: » + response.Length.ToString() + «\r\nConnection: close\r\n\r\n»;
           clientSocket.Send(Encoding.UTF8.GetBytes(header), header.Length, SocketFlags.None);
           clientSocket.Send(Encoding.UTF8.GetBytes(response), response.Length, SocketFlags.None);
           //Parpadeo del led
           led.Write(true);
           Thread.Sleep(150);
           led.Write(false);
      }
    }
  }
}
#region IDisposable Members
~WebServer()
{
      Dispose();
}
public void Dispose()
{
     if (socket != null)
        socket.Close();
}
#endregion
}
El siguiente paso es añadir el siguiente código para iniciar el servidor web.
public static void Main()
{
    Microsoft.SPOT.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0].EnableDhcp();
    WebServer webServer = new WebServer();
    webServer.ListenForRequest();
}
En el siguiente paso, tenemos que desplegar el código en nuestro Netduino haciendo click en las propiedades del proyecto.
Una vez cambiadas las propiedades del proyecto, seleccionamos la pestaña «.Net Micro Framework» y cambiamos las siguientes propiedades:
Transport: USB
Device: NetduinoPlus_NetduinoPlus
Ahora solo nos queda pulsar F5 para pasar nuestro código a Netduino ,esperar unos inst asegurando que  nuestro Netduino-plus esta conectado a internet   realizamos la siguiente petición mediante nuestro navegador.
http://192.168.1.2/ ( o la ip que le haya asignado nuestro router a nuestro netduino)

 

 

Acceso a twitter con netduino


 

Pasos a aseguir

Las librerias de Microtweet de Codeplex, aquí

Crear una nueva cuenta de twitter.

Regístrese nueva aplicación según las instrucciones. Agregar 4 claves para el código.

Se usara un ssnsor de 1 hilo S1820 (de la parte posterior de Java material Tini en 2000/01. Obsoleta DS1820, pero funciona bien)1

Tambien  se usa un pulsador para realizar elenvio de tweets

Cargue este codigo en su netduino , asegurese que este est coenctado a Internet y  Pulse el botón: esto , leera la temperatura,y  enviara tweets.

 

A continuación el codigo para nuestro Netduino:

using System;
002 using System.Net;
003 using System.Net.Sockets;
004 using System.Threading;
005 using Microsoft.SPOT;
006 using Microsoft.SPOT.Hardware;
007 using SecretLabs.NETMF.Hardware;
008 using SecretLabs.NETMF.Hardware.NetduinoPlus;
009 using Komodex.NETMF.MicroTweet;
010 using Microsoft.SPOT.Net.NetworkInformation;
011 using CW.NETMF.Hardware;
012
013 namespace TweetButtonTest
014 {
015     public class Program
016     {
017         private const string consumerKey = "KeyGoesHere";
018         private const string consumerSecret = "ItsASecret";
019         private const string userToken = "InsertCoin";
020         private const string userSecret = "Shh...DontTellAnyone";
021
022         private const string ntpServer = "time-a.nist.gov";
023
024         private OutputPort led = null;
025         private TwitterClient twitterClient = null;
026         private OneWire oneWire;
027
028         public static void Main()
029         {
030             new Program().Run();
031         }
032
033         public void Run()
034         {
035
036             NTP.UpdateTimeFromNTPServer(ntpServer);
037
038             twitterClient = new TwitterClient(consumerKey, consumerSecret, userToken, userSecret);
039
040             oneWire = new OneWire(Pins.GPIO_PIN_D1);
041             led = new OutputPort(Pins.GPIO_PIN_D13, false);
042
043             Button button = new Button(Pins.GPIO_PIN_D0);
044             button.Released += new NoParamEventHandler(button_Released);
045
046             Thread.Sleep(Timeout.Infinite);
047         }
048
049         void button_Released()
050         {
051             try
052             {
053                 float temperature = GetTemperature();
054                 string msg = "Today I'm tweeting the temperature from an DS1820. It's "+temperature+"C #netdunio";
055                 Debug.Print(msg);
056
057                 bool tweetSent =  twitterClient.SendTweet(msg);
058                 if (tweetSent)
059                 {
060                     FlashLed(1);
061                 }
062                 else
063                 {
064                     FlashLed(2);
065                 }
066             }
067             catch
068             {
069                 FlashLed(3);
070             }
071         }
072
073         private void FlashLed(int flashCount)
074         {
075             while (flashCount-- > 0)
076             {
077                 led.Write(true);
078                 Thread.Sleep(250);
079                 led.Write(false);
080                 Thread.Sleep(250);
081             }
082         }
083
084         private float GetTemperature()
085         {
086             oneWire.Reset();
087             oneWire.WriteByte(OneWire.SkipRom); //All devices
088             oneWire.WriteByte(DS1820.ConvertT); //Do convert
089             Thread.Sleep(750);  //Wait for conversion
090
091             oneWire.Reset();
092             oneWire.WriteByte(OneWire.SkipRom); //All devices
093             oneWire.WriteByte(DS1820.ReadScratchpad); //Read data
094
095             //Read the first two bytes - tempLow and tempHigh
096             byte tempLow = oneWire.ReadByte();
097             byte tempHigh = oneWire.ReadByte();
098             return DS1820.GetTemperature(tempLow, tempHigh);
099
100         }
101     }
102 }