Pierre's Embedded and Mobile Blog

Soulevons le capot des systèmes embarqués et mobiles

March, 2009

Posts
  • Pierre's Embedded and Mobile Blog

    Wake on Lan depuis votre téléphone

    • 8 Comments

    Soyez green, faites des économies d’énergie! Quoi, vous avez un serveur à la maison? assassin! Il ne sert pas forcément toute la journée en continu!

    Oui, mais le problème c’est qu’on a pas forcément idée de quand on pourrait en avoir besoin… il faudrait pouvoir l’allumer et l’éteindre à distance juste quand on en a besoin. La fonction Wake-On-Lan de la majorité des cartes mères récentes (traduisez, ATX, ca fait quand même un bail) est là pour ça: elle permet en envoyant un “magic packet” sur le port ethernet de réveiller la machine: c’est comme appuyer sur le bouton “ON” à distance.

    Ce qu’on va faire en quelques lignes, c’est écrire un petit programme qui nous permet de réveiller le PC ou son serveur à distance avec son téléphone mobile.

    Le “magic packet” est composé de 6 fois 0xFF suivi de 16 fois l’adresse MAC de la machine à réveiller: facile à générer!

    Byte[] OutputBuffer = new Byte[102];
    
    /* The first 6 bytes */
    for (int i = 0; i < 6; i++)
        OutputBuffer[i] = 0xFF;
    
    /* Then we parse the mac address, and put it into an intermediate buffer */
    String StrippedMacAddress = Regex.Replace(tbMac.Text, "[^a-f0-9]", "");
    
    if (StrippedMacAddress.Length != 12)
    {
        MessageBox.Show("Please enter the mac address formatted as xx:xx:xx:xx:xx:xx");
        return;
    }
    
    Byte[] MacAddressBuffer = new Byte[6];
    for (int i = 0; i < 6; i++)
    {
        String s = StrippedMacAddress.Substring(i * 2, 2);
        MacAddressBuffer[i] = Byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    }
    
    /* Then we copy this Mac address 16 times */
    for (int i = 6; i <= 96; i+=6)
        MacAddressBuffer.CopyTo(OutputBuffer, i);

    Plusieurs choses à souligner dans ce petit bout de code:

    • D’abord l’utilisation de l’expression régulière permet de ne pas avoir à s’occuper de savoir comment l’utilisateur formatte son adresse mac (avec des :, ou des – ou des .). Ensuite on teste le nombre de caractères, c’est basique, et pas forcément élégant mais bon ca évite que l’utilisateur ne rentre n’importe quoi. Certes certain format “corrects” ne passeraient pas le test, mais on veut aussi garder le code simple :)
    • Pour la copie x16 de l’adresse MAC, il vaut mieux la convertir en tableau de byte avant… Dans le code dont je me suis inspiré, celui qui avait écrit le code refaisait un parsing de la chaine de caractère à chaque itération! Sur ce genre de petits bouts de code, le gain en optimisation n’est pas forcément critique, mais ca ne doit pas empêcher de faire les choses intelligement, car sur un téléphone mobile, il y a d’autres applications qui tournent en même temps! :)
    • Pour l’incrément de boucle, il peut paraitre étrange, à la base j’avais écrit ça:
    for (int i = 1; i <= 16; i++)
        MacAddressBuffer.CopyTo(OutputBuffer, i*6);

    L’incrément est plus classique (i++) mais du coup on fait une multiplication à chaque fois. j’ai les multiplications en horreur (ça coute cher dans un micro embarqué) donc je préfère les éviter en utilisant i+=6. c’est surement du snobisme, mais bon… en attendant je gagne un tout petit peu de batterie :)

    Bref, il reste à envoyer ce “magic packet”, et c’est l’affaire de quelques lignes:

    /* We're finally ready to send the packet, so let's do it! */
    try
    {
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(tbIpAddress.Text), int.Parse(tbPort.Text));
        UdpClient myUdpClient = new UdpClient();
        myUdpClient.Send(OutputBuffer, OutputBuffer.Length, remoteEndPoint);
        myUdpClient.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Problem sending the WOL Datagram:\r\n" + ex.Message, "Datagram not sent", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
    }

     

    Je n’inclue pas le code du formulaire, archi-simple, qui contient 3 text box et deux soft keys (à préférer aux boutons, non disponible dans le SDK standard pour les terminaux sans touchscreen!): un pour quitter, un pour lancer envoyer le magic packet: Vous aurez compris que tbMac est la TextBox pour l’adresse MAC, tbIpAddress pour l’adresse IP, et tbPort le numéro de port.

    Quoi, un numéro de port???

    Ben oui, parce que le serveur il est derrière une box, et donc il faut paramétrer la box pour laisser passer le magic packet par un certain port: choisissez celui qui vous plait! en fait la machine à réveiller n’en a rien à faire, du port sur lequel elle reçoit le magic packet: c’est juste histoire de passer le firewall!

    Merci Blaise pour l’idée, le bout de code de référence (même si c’était du VB!)!

     

  • Pierre's Embedded and Mobile Blog

    Les webcasts des TechDays 2009 sont en ligne!

    • 3 Comments

    Les sessions des TechDays étaient enregistrées, elles on été éditées et mises en ligne! vous pouvez accéder aux sessions du parcours mobilité et embarqué à partir de ce lien.

    Chaque session d’une heure est divisée en 3 webcasts de 20 minutes, que vous pouvez regarder en streaming, ou télécharger; vous avez également accès aux slides présentées dans la session et parfois aux codes sources, donc ne vous privez pas d’aller retrouver le contenu qui vous a plu, ou celui que vous avez raté :)

    N’oubliez pas non plus de noter ces webcasts, et à les partager avec vos amis! je vous donne rendez-vous aux prochains évènements!

  • Pierre's Embedded and Mobile Blog

    Des stages, du boulot, de l’aide pour monter sa boite…

    • 2 Comments

    Vous cherchez un stage? un poste? vous montez votre boite? envoyez moi votre CV, ou parlez moi de votre projet! Peu conventionnel s’il en est, ce post est un appel car à la fois en temps de crise, et aussi au temps ou les bourgeons fleurissent et les étudiants sortent d’école, tout ne va pas toujours mal… Notamment le marché de l’embedded, qui explose :) c’est Ze place to be en ce moment!

    • Etudiants: vous cherchez un stage, j’ai des partenaires et des clients qui prennent régulièrement des stagiaires :)
    • Développeurs: vous voulez bouger, faites moi part de vos envie, il y a peut-être quelque chose qui vous correspond pas si loin!
    • Freelance, et porteurs de projets: Racontez-moi votre idée, et regardez si BizSpark ne peut pas vous intéresser: si c’est le cas, faites moi signe!
    • Entreprises: vous cherchez un stagiaire/un développeur ? j’ai peut-être un contact!

    Disclaimer: je ne suis pas une agence de recrutement, je ne m’engage sur aucun résultat, j’ai juste envie de mettre en relation les gens, si l’occasion se présente. y’a pas écrit ANPE!

  • Pierre's Embedded and Mobile Blog

    Annonces! MSDN Embedded, & Windows Embedded Server

    • 1 Comments

    Durant l’ESC West, le groupe Windows Embedded annonce 2 nouveautés qui viennent renforcer la vision “Software+Services” dans l’embarqué:

    MSDN Embedded, est un nouvel abonnement MSDN dédié au développeurs embarqués, qui donne accès à tous les outils de développement Embedded, ainsi qu’a un mécanisme de mise à jour spécifique, réservé aux abonnés, qui passe par l’intermédiaire d’un client spécial: le Windows Embedded Developer Update. Ce mécanisme permettra de recevoir en direct les updates des outils, des OS, mais aussi éventuellement des drivers et des BSP. Un gros plus pour simplifier l’utilisation de nos outils.

    Windows Embedded Server, c’est tout simplement l’intégration de Windows Server dans la gamme Embedded, donc avec la possibilité “d’enfouir” dans des équipements spécifiques les fonctionnalités de nos OS serveurs. Techniquement, rien de particulier cependant.

    Plus d’infos sur ces annonces ici et ici.

  • Pierre's Embedded and Mobile Blog

    Annonces! Windows Mobile 6.5 au CTIA: On pourra publier gratuitement les mises à jour de son appli!

    • 0 Comments

    le CTIA démarre, et Windows Mobile arrive avec son lot d’annonces… que vous pouvez retrouver un peu partout sur le net, mais une sur laquelle j’avais envie d’insister, c’est le changement sur les conditions de mises à jour des applications sur Windows Marketplace for Mobile:

    • 99 euros par an pour 5 applis, puis 99 euros de plus par application supplémentaire
    • 70% des gains pour le développeur
    • Gratuité des mises à jours de son application sur le marketplace :) comme quoi quand la communauté s’exprime, Microsoft écoute.
    • Pour les utilisateurs: vous aurez 24h pour changer d’avis si l’application ne vous plait pas!!! (énorme!)

    On a aussi dit que nous avions travaillé avec des stylistes/designers de renom pour des zoulies interfaces, et de nombreux grands partenaires vont annoncer leur support de Marketplace: Facebook, Netflix, Gameloft, Namco, Pandora, Slingmedia, MySpace, etc etc

    Bref, on essaye de faire les choses bien. on espère que ca vous plait ;)

  • Pierre's Embedded and Mobile Blog

    Prise en main des AlphaMobileControls

    • 0 Comments

    Les AlphaMobileControls, c’est un projet CodePlex qui a un certain âge mais qui a le mérite d’amener la gestion de la transparence dans le Compact Framework, ce qui peut être sympa pour avoir de plus jolies interfaces.

    Le fait est que si ces contrôles sont bien faits, il y a quelques trucs non documentés, et ce post est destiné à vous faire partager ceux que j’ai pu trouver: c’est pas bien long, mais il m’a fallut un peu de temps pour comprendre :)

    Disclaimer: ce post enfonce peut-être des portes ouvertes pour les experts du GDI, mais je n’en suis pas un!

    Les AlphaMobileControls regroupent plusieurs types de contrôles:

    • AlphaMobileImage
    • AlphaMobileImageButton
    • AlphaMobileLabel
    • AlphaMobileForm

    Je ne me suis intéressé qu’aux deux premiers, et au dernier, celui ci étant nécessaire au bon fonctionnement de l’application.

    AlphaImageButton

    Au départ, je voulais juste des boutons qui gèrent la transparence, et avec des coins ronds. La première chose à savoir est qu’on ne peut pas intégrer un bouton tout seul. Pour que le bouton marche bien il faut également transformer son formulaire de base en AlphaMobileForm.

    Ensuite, l’apparence du bouton est géré avec des images: personnellement j’utilise des PNG (pour le support de la transparence justement). On peut définir 3 différents états pour le bouton: Normal, Active (quand on clique dessus) et Disabled (désactivé). Pour chacun de ces états, on peut définir une image différente. En revanche il faut faire attention à la façon dont on inclus les ressources: il ne faut pas oublier, après les avoir ajoutées les images dans les ressources du projet, de choisir dans les propriétés de chacune de ces ressources “Embedded Ressource” dans le champ “Build Action”. Si à l’exécution vous tombez sur une exception pour une référence null dans la méthode CreateFromStream de la class AlphaImage, c’est que vous avez oublié cette étape!

    J’imagine qu’il existe le même genre de caveats pour l’AlphaMobileLabel

    AlphaImage

    L’AlphaImage ne dérive pas d’une PictureBox. Ni même d’une Image ou d’un Bitmap. Elle possède sa propre méthode Draw, et une chose à savoir, c’est qu’il n’est pas possible de récupérer les évènements, comme Click, sur ce contrôle. Si vous voulez une image qui réagit quand on clique dessus, prenez l’AlphaImageButton!

    Vous voilà un peu mieux armé que moi il y a quelques heures, alors à vos Visual Studio!

Page 1 of 1 (6 items)