Envio de tweets con Netduino 3


En 2011, el autor misenhower  publicó   una biblioteca de cliente de la API OAuth de Twitter para Micro net llamado MicroTweet que  permitía enviar tweets  usando una placa Netduino Plus y Netduino 2 Plus.Han pasado ya  más 5  años  y desde luego el API v1.0 de  Twitter  ha quedada  obsoleta 8   (y desactivada)  a partir de que  Twitter comenzara a aplicar el uso de conexiones de SSL a extremos de acceso al API , lo cual significa que la biblioteca original de MicroTweet no ha sido funcional durante mucho tiempo..

Después de la aparición de Netduino 3  , que ha  incorporado entre  su  muchas nuevas características soporte SSL, el autor  ha visto  interesante revisar esta biblioteca  actualizandola con nuevos requerimientos de API de Twitter. El resultado es MicroTweet 2, cuyo código  ya está disponible  en GitHub ,  y también como un paquete binario de NuGet.

MicroTweet 2 es pues una reescritura completa de la biblioteca original contando  con varias características nuevas útiles para proyectos NETMF . Como requisitos  necesita  NETMF v4.3 , así como una placa  que soporte SSL.

Algunas de las características diferenciadoras  respecto  a la versión anterior son las siguientes

  • Se usa  la clase HttpWebRequest estándar (de System.Http) en lugar de un cliente HTTP a la medida. Esto es en parte debido al nuevo requisito de HTTPS, y en parte porque las más modernas placas  NETMF tiene mucho más espacio de programa que la versión de Netduino Plus .El original Netduino Plus tenía solamente 64 KB de espacio de código disponibles. Ensamblar  System.Http habría exigido más de la mitad de ese espacio, dejando muy poco espacio para el código de usuario. Netduino 3 Wi-Fi cuenta con más de 1.400 KB de espacio de código así como tras  modernas placasNETMF que tienen al menos 384 KB, por lo que ahora es mucho menos preocupante de lo que solía ser.
  • La original biblioteca de MicroTweet podría realmente hacer una cosa: publicar tweets. El autor siempre tenía la intención de añadir más características, pero la memoria limitada de la original Netduino Plus a analizar las respuestas de la API de Twitter lo convertian en una tarea relativamente difícil.El 3 de Netduino tiene significativamente más memoria RAM, por lo que ahora es mucho más fácil de procesar las respuestas recibidas desde Twitter.
  • Todas las respuestas de la API de Twitter se serializan como JSON, así que para 2 de MicroTweet el autor construyó un parser JSON. La aplicación es bastante simple: se toma una matriz de caracteres y va a través de él, analizandocarácter por carácter. Existen otros analizadores JSON para NETMF pero el autor quería construir uno propio para permitir una mayor flexibilidad al añadir cuenta y optimización de rendimiento. En la construcción de esta biblioteca encontró que el Netduino 3 , por decirlo suavemente, no es excesivamente rápido en el análisis de las respuestas JSON(toma alrededor de 4 segundos para analizar una respuesta de 20KB, lo cual es mucho pues  además hay que sumar el tiempo que tarda en recibir la respuesta en primer lugar, que se suma al menos unos segundos más para el tiempo total de procesamiento).
  • La versión anterior de MicroTweet utiliza la bibliotecaMicroLinq .Para MicroTweet 2 se  ha quitado esta dependencia y añadido un método de tipo de inserción sencilla para controlar esta necesidad. Haciendo MicroTweet enteramente autónomo debe ayudar a hacer un poco más fácil mantener actualizado el proyecto.

 

Esta biblioteca como vamos ver puede ser utilizada para registrar y recuperar tweets directamente desde un dispositivo NETMF través de la API de Twitter.

 

 

Para empezar  primero deberá  hacer referencia a la biblioteca de MicroTweet, bien Agregando  el proyecto deMicroTweet a la solución de VS o simplemente instalando la biblioteca a través de NuGet.

Para instalarlo desde NuGet, ejecute el siguiente comando en la consola del administrador de paquetes:

Install-Package MicroTweet

Pueden encontrar instrucciones para usar NuGet y la consola del administrador de paquetes   aqui.
Una vez haga referencia a  MicroTweet assembly  en su aplicación, agregue una  Directiva para el espacio de nombres MicroTweet  en la parte superior del archivo de programa (por ejemplo, Program.cs):
 using MicroTweet;

También, si utiliza DHCP, puede que desee esperar a que una dirección IP para ser adquirida antes de realizar cualquier operación de red, aunque  también puede hacer esto marcando el valor de   IPAddress.GetDefaultLocalAddress()  en el comienzo de su   programa, por ejemplo usando el siguiente código

while (IPAddress.GetDefaultLocalAddress() == IPAddress.Any) 

    Thread.Sleep(50);

 

Ajuste de la hora actual

Es importante destacar  que  las solicitudes de la API de Twitter deben tener un válido timestamp (actual), por  lo que el autor ha incluido  para nuestra comodidad  una clase  SNTP    dentro de la biblioteca MicroTweet para recuperar el tiempo actual de un servidor NTP.

Puede actualizar la hora actual en su placa  puede usar  el código siguiente:

Microsoft.SPOT.Hardware.Utility.SetLocalTime(Sntp.GetCurrentUtcTime());

Inicializando  TwitterClient

Para usar la API de Twitter desde la aplicación usted debe primero registrarlo con Twitter para obtener un conjunto de claves API. Para ello tendrá que ir a la página de gestor de aplicaciones de Twitter para crear una nueva aplicación y obtener las claves necesarias. Usted recibirá dos juegos de llaves: una para la aplicación que creó y otra para su cuenta de usuario acceder a la API a través de la aplicación. Éstas  claves se conocen como las credenciales de la aplicación y las credenciales de usuario.

Puede inicializar una nueva instancia de TwitterClient con un código similar al siguiente:

// Set up application and user credentials
var appCredentials = new OAuthApplicationCredentials()
{
    ConsumerKey = "YOUR_CONSUMER_KEY_HERE",
    ConsumerSecret = "YOUR_CONSUMER_SECRET_HERE",
};
var userCredentials = new OAuthUserCredentials()
{
    AccessToken = "YOUR_ACCESS_TOKEN",
    AccessTokenSecret = "YOUR_ACCESS_TOKEN_SECRET",
};

// Create new Twitter client with these credentials
var twitter = new TwitterClient(appCredentials, userCredentials);

 Enviando  un tweet
Enviando un Tweet uso el método SendTweet para enviar un tweet:

try
{
    var tweet = twitter.SendTweet("Trying out MicroTweet!");
}
catch (Exception e)
{
    // Couldn't send the tweet, the exception may have more information
}

 

Si se recibe un error de API de Twitter, se producirá un TwitterException con más detalles.La propiedad de mensaje de la excepción contiene el mensaje de error real proveniente de Twitter.

 

Recuperar su línea de tiempo inicio

Utilice el método GetHomeTimeline para recuperar los más recientes tweets y retweets, escritos por personas que siguen:

 

try
{
    var tweets = twitter.GetHomeTimeline();
    foreach (Tweet tweet in tweets)
        Debug.Print("Tweet from @" + tweet.User.ScreenName + ": \"" + tweet.Text + "\"");
}
catch (Exception e)
{
    // Couldn't retrieve the timeline, the exception may have more information
}

GetHomeTimeline acepta dos argumentos, sinceID y maxID, para especificar la gama de tweets para recuperar.

Puede utilizar argumentos con nombre para especificar estos valores.

Por ejemplo: var tweets = twitter. GetHomeTimeline(maxID: 603281686600683520);
Recuperar la línea de tiempo de un usuario específico

Utilice el método GetUserTimeline para ver los tweets y retweets publicadas por un usuario específico:

try
{
    var tweets = twitter.GetUserTimeline("twitter");
    foreach (Tweet tweet in tweets)
        Debug.Print("Tweet from @" + tweet.User.ScreenName + ": \"" + tweet.Text + "\"");
}
catch (Exception e)
{
    // Couldn't retrieve the timeline, the exception may have more information
}

De un forma parecida a GetHomeTimeline, puede especificar la gama de tweets para recuperar con sinceID y maxID: var tweets = twitter. GetUserTimeline («twitter», sinceID: 600728701584576512);

Otras clases de TwitterClient

Hay  en esta biblioteca   algunos otros métodos muy útiles:

GetCurrentUser puede utilizarse para verificar las credenciales proporcionadas (claves de API). Si las credenciales son válidas, se devolverá un objeto de usuario con los detalles para el usuario de autenticación.
GetUser recupera la información del usuario con el nombre de usuario especificado o el ID.

Proyecto de muestra

MicroTweet 2 incluye un proyecto de muestra simple que envía un tweet y recupera los últimos tweets de personas que siguen.No hay ninguna funcionalidad de hardware específico en el proyecto de ejemplo incluido, funciona igualmente bien en cualquier junta (o incluso el emulador NETMF).

El autor pensó que sería divertido hacer un proyecto de muestra basado en hardware simple, así que aquí está el reloj de seguidores de Twitter:

Este proyecto recupera  datos de usuario y muestra su actual cuenta de seguidor en un display de 7 segmentos. Usted podría también, por supuesto, configurar para recuperar el recuento de seguidores de cualquier usuario en Twitter. Aquí está el código para este proyecto.

 

 

 

Fuente aqui

Envio de correo SMTP desde Netduino


Todos sabemos, que Micro Framework no puede tener todas las características de .NET Framework completo. Una cosa que  faltaba es SmtpClient clase que permita el envío de mensajes de correo electrónico utilizandoSimple Mail Transfer Protocol (SMTP). Si nos fijamos en la especificación SMTP encontrará protocolo comuinication muy fácil – es sólo comandos de texto. Comando no, la respuesta Atrás – eso es todo.

Asi  es de fácil puede ser el envío de e-mails de .NET Micro Framework pero  no lamntablemente esta clase no esta disponible para , Net Micro Framework 

 utilizando (SmtpClient smtp = new SmtpClient ("smtp.hostname.net", 25))
 {
     // Enviar mensaje
     smtp.Send ("[email protected]",
               "[email protected]",
               "Buenas noticias",
               "¿Cómo te Foo?");
 }

Esto le  trajo  la idea a Pavel Bánský  de escribir  su propia implementación de la clase SmtpClient para .NET Micro Framework   que ademas  ha decididoser lo más compatible posible con la versión de «escritorio» de System.Net.Mail.SmtpClient clase.

1920px-par_avion_air_mail
«Par avion air mail» by Kristoferb at English Wikipedia. Licensed under CC BY-SA 3.0 via Commons.

 

 

 

Bansky.SPOT.Mail biblioteca de clases

Enviar sencilla correo electrónico mediante SMTP es muy fácil; PERO. Hoy en día la mayor parte del servidor SMTP requiere autenticación. Esto significa, que SmtpClient sin autenticación sería un poco inútil.

En el caso de usar el servidor de correo de terra

SMTP: smtp.terra.com

Puerto 587 o 465 (SSL)

Pero  atención   , no podra usar SSL, por  lo que no olvide  apuntar el puerto 587

Y aquí comienza la diversión. Autenticación SMTP necesita Base64 nombre de usuario y la contraseña codificada. Damned, Base64 no es compatible con Micro Framework. Por lo tanto, la primera tarea es obtener Base64 clase de codificación / decodificación. Una vez que usted pueda codificar datos en Base64, puede codificar los datos de los archivos adjuntos de correo electrónico también. Vamos a implementar System.Net.Mail.Attachment clase. Más funcionalidad necesita el manejo de excepciones más compleja. Ok, agreguela clase  System.Net.Mail.SmtpException .

Después de unos días te despiertas y ves, que ha terminado con la biblioteca de clases completa para el correo electrónico. Eso es cómo se  creo biblioteca de clases Bansky.SPOT.Mail 

Base 64, Autenticación y error en Micro Framework

Cuando el servidor SMTP requiere autenticación, el cliente de sesión de inicio con el comando EHLO domain.com.Servidor responde con métodos compatibles de autenticación. Simplemente dicho, los métodos de las credenciales de codificación. La mayoría de los servidores SMTP soporta método SENCILLOS o entrada o ambos; si no, SmtpClientva a terminar con una excepción. Hay otros métodos de autenticación como CRAM-MD5 y CRAM-SHA1.

Información de autenticación para el método SENCILLOS es esta cadena «usernamepassword» codificado en Base64. El problema es que Micro Framework versión 2.5 (y menos) interpreta «» como un fin de la cadena. Esto significa que la cadena de autenticación SENCILLOS se interpreta como una cadena vacía. Caracteres  después de  «» se ignoran pero esto se puede. En primer lugar debe conviertir  en  serie de «contraseña de usuario» en la matriz de bytes y luego reemplazar los espacios adecuados con el byte 0x00. Tal matriz de bytes es la entrada para el método Base64.Encode ().

Es importante decir que el núcleo de la clase Base 64 se basa en Base64Encoder clase de Timm Martin  y se  he añadido los métodos para dividir los datos codificados en líneas de 76 bytes como es requerido por MIME especificación.

Siguiente código muestra cómo configurar las credenciales de autenticación a clase SmtpClient. Método de autenticación será elegido automáticamente en función de las capacidades del servidor.

 utilizando (SmtpClient smtp = new SmtpClient ("smtp.hostname.net", 25))
 {
     // Crear un mensaje
     MailMessage mensaje = new MailMessage ("[email protected]",
                                           "[email protected]",
                                           "Buenas noticias",
                                           "¿Cómo te Foo?");

     // Authenicate al servidor
     smtp.Authenticate = true;
     smtp.Username = "UserLogin";
     smtp.Password = "userpassword";

     // Enviar mensaje
     smtp.Send (mensaje);
 }

Archivos adjuntos de correo electrónico

Además de los mensajes HTML con formato, la implementación MailMessage soporta archivos adjuntos. Archivo adjunto de e-mail puede ser cualquier dato binario, que se procesan utilizando la codificación Base64 y agregados en mensaje MIME multiparte. Ejemplo de mensaje con archivo adjunto está por debajo.

ADVERTENCIA: codificación de datos binarios en base64 en .NET Micro Framework puede ser extremadamente tiempo y consumo de recursos. Esto significa, que el mayor de los datos es, más tiempo se necesita para procesarla; y si se dice  «más tiempo», es porque  es  realmente mucho tiempo. Por lo tanto, tener cuidado y no se sorprenda.

 MailMessage mensaje = new MailMessage ();
 // Establecer el nombre del remitente y dirección
 message.From = new MailAddress ("[email protected]", "Foo Bar");

 // Destinatarios Set
 message.To.Add (nueva MailAddress ("[email protected]", "John Doe"));
 message.Cc.Add (nueva MailAddress ("[email protected]"));

 message.Subject = "Hola Mundo";
 message.Body = "de ahora en adelante usted puede enviar mensajes de correo electrónico desde <b> .NET Micro Framework </ b>.";
 // Cuerpo Formato como HTML
 message.IsBodyHtml = true;

 // Crear nuevo adjunto y definir su nombre
 Accesorio = nuevo Adjunto ("Snwoflake.gif");        
 attachment.ContentType = "image / gif";
 attachment.TransferEncoding = TransferEncoding.Base64;
 // Contenidos adjuntos
 attachment.Content = Base64.Encode (Resources.GetBytes (
                                     Resources.BinaryResources.Snowflake_gif),
                                     true);

 // Añadir adjunto al mensaje
 message.Attachments.Add (archivo adjunto);

 // Crear instancia SMTP nueva
 SmtpClient smtp = new SmtpClient ("smtp.contoso.com", 25);
 probar
 {
     // Authenicate al servidor
     smtp.Authenticate = true;
     smtp.Username = "UserLogin";
     smtp.Password = "userpassword";

     // Enviar mensaje
     smtp.Send (mensaje);
 }
 capturas (SmtpException e)
 {
     // El manejo de excepciones aquí
     Debug.Print (e.Message);
     Debug.Print ("Código de error:" + e.ErrorCode.ToString ());
 }
 finalmente
 {
     smtp.Dispose ();
 }

Cabeceras adicionales

Cada mensaje de correo contiene cabecera, que especifica la información como la fecha en que se creó el mensaje, el nombre del remitente, etc. Si usted quiere poner información adicional en la cabecera se puede utilizar la propiedadencabezados. Consulte el siguiente ejemplo.

 MailMessage mensaje = new MailMessage ("[email protected]",
                                       "[email protected]",
                                       "Buenas noticias",
                                       "¿Cómo te Foo?");

 message.Headers = "X-Priority: 1 
  ";
 message.Headers + = "X-Microsoft Mail-Prioridad: Alta 
  ";
 message.Headers + = "X-Mailer: Micro Framework mail del remitente 
  ";

Manejo de excepciones

Además excepciones estándar como ArgumentNullException y ArgumentOutOfRangeException, también haySmtpException lanzada por Enviar método de SmtpClient. SmtpException en marco completo contiene propiedadStatusCode, que describe el estado en que se produjo la excepción. Desde mi Enviar método no es tan rico, he reemplazado StatusCode con ErrorCode, que describe la razón de la excepción. La enumeración SmtpErrorCodecontiene valores como BarResponse, AuthFailed, connectionFailed y así sucesivamente.

Demostración y Descarga

Biblioteca completa con las fuentes, documentación y aplicación de la muestra están disponibles para su descarga.Biblioteca fue probado en emulador y Maestro GHI Embedded módulo. Todo el código    el autor  ha  movido el   software al repositorio GitHub.

 

 

 

Fuente