Laurent Ellerbach

Internet of Things, IoT, Arduino, Netduino, Galileo, Spark.IO, NETMF, .NET Microframework and other embedded gadgets :-)

September, 2006

  • Laurent Ellerbach

    J’ai hacké mon onduleur ou le reverse engineering de protocoles de communication (part 8)

    • 4 Comments

    J’ai donc continuer de développer ma solution de gestion d’onduleur. J’ai profité de mon retour à la maison pour continuer les tests physiques sur mes onduleurs. Oui, j’ai bien dit mes onduleurs. En fait, j’en possède 3 du même modèle. Ce qui a aussi motivé l’écriture de ce service de gestion…

    La suite des tests m’a permis de compléter le protocole de communication et de déterminer à quoi servent la plupart des bits :

    00001000 = statut. 1 bit par info.

    b0b1b2b3b4b5b6b7

    • b0 = passe à 1 lorsqu’une panne de courant arrive, lorsque l’alimentation est coupée
    • b1 = passe à 1 lorsque la batterie est faible
    • b2 = ??? pas encore déterminé. Impossible en utilisation normale de le faire passer à 1. Il reste à 0.
    • b3 = ??? Idem
    • b4 = est à 1 en fonctionnement normal. Il indique que les sorties sont alimentées
    • b5= passe à 1 quand on est en mode test. Le mode test est déclenché par l’envoie de la commande T
    • b6 = ??? pas non plus réussit à déterminer à quoi ce bit sert
    • b7 = passe à 1 quand l’alimentation est sur batterie

    Cela m’a également permis d’étalonner les niveau de la batterie. Le niveau haut varie de 14 à 10,7. L’échelle de consommation est quasi linéaire.

    Côté code, j’ai décidé d’implémenter des événements. Ainsi, lorsqu’un de ces bits change, j’envoie l’événement correspondant. Cela permet de gérer avec de la souplesse ce qui peut arriver. Il faut d’abord dans le code déclarer les événements :

    'se déclenche lorsque le secteur est coupé, en général va avec l'événement FonctionnementBatterie

    Public Event ArretAlimSecteur()

    'se déclenche lorsque le secteur est remis (et qu'il était coupé)

    Public Event RetourAlimSecteur()

    'lorsque l'onduleur fonctionne sur batterie

    Public Event FonctionnementBatterie()

    'ou lorsqu'il fonctionne de nouveau normalement

    Public Event ArretFonctionnementBatterie()

    'Lorsque la batterie est faible

    Public Event BatterieFaible()

    'lorsque l'onduleur est arrêté

    Public Event OnduleurArrete()

    Puis, pour chaque bit, on vérifie si un changement d’état s’est passé. Ca donne cela :

    'position 0 = panne secteur

    Dim BoolTemp As Boolean

    ' récupère la valeur (0 ou 1) du bit 0 de la chaîne de 8 bits

    BoolTemp = Val(mc.Item(7).Value.Substring(0, 1))

    If BoolTemp <> myOnduleurPanneSecteur Then

    If BoolTemp Then

    RaiseEvent ArretAlimSecteur()

    Else

    RaiseEvent RetourAlimSecteur()

    End If

    myOnduleurPanneSecteur = BoolTemp

    End If

    Le principe est simple, il faut récupérer la valeur dans une variable temporaire. Puis on compare à la valeur actuelle. Si la valeur est la même, alors pas de changement d’état et on ne fait rien. Si les valeurs sont différentes, alors on regarde la valeur de la variable.

    Dans le cas où le bit est à 1, alors cela signifie que le courant a été coupé. On envoie donc l’événement ArretAlimSecteur. Dans le cas où il passe à 0, on peut signifier que le courant est revenu en envoyant l’événement RetourAlimSecteur. Le mot magic RaiseEvent permet d’envoyer l’événement.

    Ne pas oublier à la fin d’attribuer la nouvelle valeur à la variable privée stockant cette information.

    Côté du code qui intercepte les événements, ce n’est pas plus compliqué. Il faut déclarer une variable avec le mot clé WithEvents.

    Public WithEvents myOnduleur As New Onduleur

    On se retrouve ensuite avec une fonction de ce type qui permet d’intercepter l’événement et de le traiter :

    Private Sub myOnduleur_ArretAlimSecteur() Handles myOnduleur.ArretAlimSecteur

    'Faire quelque chose ici :-)

     

    End Sub

     

    S’il y a des paramètres à passer, cela se passe de la même façon. Il suffit de les décrire dans la définition puis de les envoyer ans le RaiseEvent et de les récupérer comme avec n’importe quel événement dans la fonction Handles.

    L’utilisation des événements est donc très simple. Un vrai bonheur.

    Avec cela, j’ai fini d’écrire ma classe de gestion de l’onduleur. Elle permet de se connecter à l’onduleur, de récupérer les informations, en cas de panne de courant ou autre, d’envoyer l’événement correspondant.

    Je récupère les données de façon régulière à l’aide d’un timer. Le fonctionnement d’un timer au prochain post…

     

  • Laurent Ellerbach

    IDEES ou comment aider les start-up

    • 2 Comments

    Microsoft France a lancé un programme de soutient aux start-up l'année dernière. Ce programme se nomme IDEES et parrainait l'année dernière 25 start-up. Ce nombre va doubler cette année pour atteindre 50. La liste des start-up et les détails de l'aide apporté sont disponibles sur le site.

    La campagne actuelle est d'ailleurs très sympa :

    On imagine une nouvelle entreprise, de nouveaux potentiels

    L'aide à l'innovation ne s'arrête pas là puisque début 2005, Microsoft a ouvert, dans ses locaux parisiens du VIIème arrondissement, un centre technologique de pointe (le MTC – Microsoft Technology Center) permettant de travailler main dans la main avec partenaires et grands clients, ainsi qu'avec des éditeurs de logiciels indépendants. Ces derniers peuvent y tester leurs applications dans différents environnements matériels et logiciels, accéder aux ressources techniques de Microsoft et bénéficier d'une aide à l'architecture afin d'accélérer leurs développements logiciels. Pour tout contact avec le MTC : mtcparis@microsoft.com

    Toujours dans le but de contribuer à l'économie local et à l'innovation en France, cette année vient d'être inauguré un laboratoire de recherche commun entre Microsoft et l'INRIA. Plus d'infos sur cette page.

  • Laurent Ellerbach

    Nabaztag : le lapin qui vous veut du bien

    • 1 Comments

    La Nabaztag, c'est le lapin nouvelle génération : pas la peine de le nourir, pas la peine de changer la litière et en plus il n'est pas commestible. Mais alors que fait-il ? Et bien il écoute, parle et obéi aux ordres qu'on peut lui donner.

    Pour le découvrir la vidéo sur : http://www.on10.net/Blogs/bgauth/les-lapins-nabaztag/

  • Laurent Ellerbach

    Comment installer Visual Studio Express sur Vista RC1

    • 1 Comments

    Hier, j'ai fait le grand saut sur la toute dernière build 552 (la RC1 officielle de Vista). Il m'a fallu 2h30 pour sauvegarder les données et seulement une trentaine de minutes pour installer Vista… J'y ai ajouté Office 12 Beta technical refresh en français. Viens maintenant l'installation de Visual Basic Express (version gratuite, comme les autres de la gamme Visual Studio Express).

    J'ai suivi les recommandations d'être un simple utilisateur sur ma machine (seulement membre du groupe user). Ca a parfaitement été pour installer Office 12 (moyennant élévation de privilège sur demande automatique de Vista). Ca a également été pour quelques autres applications.

    Par contre, avec Visual Studio Express, ça ne fonctionne pas. Ca a l'air dû à un problème avec le BITS (le background internet transfer service) qui gère les téléchargements en tâche de fond. Du coup, aucun produit de la gamme Express ne s'installe. Une erreur au chargement des produits on line est renvoyée.

    Le contournement consiste donc à s'ajouter au groupe des administrateurs locaux (administrators en anglais ou administreurs en français), de se déloguer et de se reloguer (attention, pour que l'ajout au groupe prenne pleinement effet, il faut se déloguer et se reloguer).

    Ensuite, l'installation se passe sans histoire. Le produit fonctionne parfaitement bien. Il est ensuite possible de se retirer du groupe des administrateurs et le produit continue de parfaitement fonctionner. Attention, suivant le code que vous écrivez, les demandes d'élévation de privilèges vont être nombreuses. En même temps, c'est très bien pour apprendre à écrire du code qui nécessite un minimum de permission.

  • Laurent Ellerbach

    J’ai hacké mon onduleur ou le reverse engineering de protocoles de communication (part 9)

    • 1 Comments

    Comme indiqué dans mon précédent post, je vais expliquer le fonctionnement d'un timer. Très utilise lorsqu'on souhaite faire une action spécifique à intervalle régulier. Je vais également en profiter pour montrer comment créer une propriété en lecture et écriture. En plus, je vais expliquer comment lever des exceptions dans son propre code.

    Une bonne partie de tout cela se trouve condensé dans la fonction d'ouverture de l'onduleur. Voici donc le code avec les déclarations de variables et constantes nécessaires à la compréhension.

     

    Const ERREUR_IDENTITE = "Impossible d'obtenir l'identité de l'onduleur"

    Const ERREUR_ALIM_BATTERIE = "Impossible d'obtenir les informations de batterie"

    Const ERREUR_ALIM_SECTEUR = "Impossible d'obtenir les informations de secteur"

    Const PERIOD_APPEL = 3000 '2 secondes = 2000 milisecondes

    Private myPeriodeAppel As Integer = PERIOD_APPEL

    Private myPort As SerialPort

    Private myPortSerie As String = "" 'stocke le nom du port

    Private myTimer As Timer

     

    Public Function Ouvrir(ByVal StrPort As String) As Boolean

    Try

    'ouvre le port série avec le bonnes infos

    myPortSerie = StrPort

    myPort = New SerialPort(StrPort, 2400, Ports.Parity.None, 8, Ports.StopBits.One)

    'le caractère de fin de ligne est chr(13), c'est à dire Entrée

    myPort.NewLine = Chr(13)

    'délais d'attente de 2 secondes

    myPort.ReadTimeout = 2000

    myPort.Open()

    myPort.DtrEnable = True

    'vérifie que l'on a bien un onduleur et rempli les bonnes fonctions

    If Not (EnvoiCommande(OnduleurCommande.Identite)) Then

    Throw New System.Exception(ERREUR_IDENTITE)

    End If

    If Not (EnvoiCommande(OnduleurCommande.Batterie)) Then

    Throw New System.Exception(ERREUR_ALIM_BATTERIE)

    End If

    If Not (EnvoiCommande(OnduleurCommande.Tension)) Then

    Throw New System.Exception(ERREUR_ALIM_SECTEUR)

    End If

    'toutes les propriétés ont été remplies

    'intialise le timer, récupère les infos toutes les 5 secondes

    myTimer = New Timer(AddressOf VerifierStatut)

    myTimer.Change(0, myPeriodeAppel)

    Return True

    Catch ex As Exception

    'si ça ne s'ouvre pas, répercute l'exception

    Throw ex

    Return False

    End Try

    End Function

    La fonction Ouvrir prend un paramètre qui doit contenir une chaîne de type COM1, COM2 ou autre permettant d'ouvrir le port série. Le tout se trouve dans un try – catch qui va permet de récupérer les exceptions qui peuvent être levées. En cas de problème, sur le port série, il est important de ne pas laisser planter l'application et de le remonter à l'appelant.

    Sur le même principe, lorsque le port série est ouvert, la fonction EnvoiCommande(OnduleurCommande.Identite) renvoie True si les informations de type modèle, sous modèle, version sont récupérés. Si ce n'est pas le cas, elle renvoie False. Du coup, si un onduleur n'est pas présent, les informations ne seront pas récupérées et False sera renvoyé. Dans ce cas, nous sommes devant un problème et on lève une exception. Cela se fait simplement à l'aide le la ligne Throw New System.Exception("ce que l'on veut envoyer"). Simple et efficace.

    Quand au timer, simple également. Il suffit de déclarer une variable de type Timer, ici myTimer. Ensuite, il faut créer une fonction de callback (rappel). Elle permettra au lors du déclanchement du timer de venir se brancher et d'exécuter le code de la fonction. La fonction de call back s'appelle VerifierStatut. Sa définiton est ci-dessous. L'initialisation se fait donc en indiquant myTimer = New Timer(AdressOf VerifierStatut). AdressOf renvoie un pointeur de la fonction de callback. Il ne reste plus qu'à initialiser le timer : myTimer.Change(0, myPeriodeAppel). 0 indique qu'il doit se déclencher maintenant. Le myPeriodeAppel indique l'intervalle en milli secondes d'appel de la fonction de callback.

    Private Sub VerifierStatut(ByVal stateInfo As Object)

    'pas de vérification particulière. En cas de problème, les exceptions sont trappées dans la fonction EnvoiCommande

    EnvoiCommande(OnduleurCommande.Tension)

    End Sub

    Dans mon cas, par défaut, lors de l'ouverture de l'onduleur, l'appel se fait toutes les 3000 milli secondes soit toutes les 3 secondes. J'ai implémenté en plus dans ma gestion d'onduleur une propriété qui permet de modifier cette valeur. Je ne sais pas encore par avance tous les combiens de temps, il est nécessaire de l'appeler. Donc, je me garde la possibilité de modifier cette valeur. Cependant, pour des questions de performances, je ne souhaite pas que l'appel soit fait à moins d'une seconde. J'exprime donc ma propriété en secondes et choisi des byte.

    L'implémentation de la propriété donne cela :

    Public Property PeriodeAppel() As Byte

    Get

    Return (myPeriodeAppel / 1000)

    End Get

    Set(ByVal value As Byte)

    If value > 0 Then

    myPeriodeAppel = value * 1000

    myTimer.Change(0, myPeriodeAppel)

    End If

    End Set

    End Property

    La lecture (Get) est simple, je renvoie la période d'appel divisée par 1000 car en interne ma variable est en milli secondes.

    Pour l'écriture (Set), je vérifie que la valeur est bien supérieur à 0 (donc au moins égale à 1). Je la multiplie par 1000, et je change la période d'appel de mon timer.

    Avec VB.NET, il est donc très facile de lever des exceptions, facile également d'implémenter et gérer un timer, de mettre en place des propriétés, en lecture et en écriture. Avec un comportement particulier qui modifie l'application dans la partie lecture ou écriture.

    Le prochain post sera certainement consacré à la mise en place d'un service Windows. Seule chose qu'il me reste à faire par rapport à mon ambition d'origine ! So stay tune…

  • Laurent Ellerbach

    Un peu d'humour en cette pério de rentrée des classes...

    • 0 Comments

    C'est à peu près ce que mon fils m'a dit quand il est rentré de son premier jour de classe...

     

    Rough First Day
  • Laurent Ellerbach

    frimr du Web 2.0…

    • 0 Comments

    Dans le monde du Web, il y a ceux qui sont « in » (Web 2.0) et ceux qui sont « out » (Web 1.0) et ceux qui n'existent pas (pas Web ou encore au minitel, il paraît qu'il y en aurait encore quelques uns). Pour découvrir le monde du Web 2.0, sérieux et respectable, il ne faut en aucun manquer le site FRIMR. THE site sur lequel aller si vous avec un « gros moi » (bref si vous êtes « in ») : http://www.frimr.com/

  • Laurent Ellerbach

    J'ai reparamétré tout mon réseau...

    • 0 Comments

    Bon, je sais, ça va juste faire rire mais je suis fier de moi :-D J'ai reparamétré tout mon réseau ce soir à la maison. Tout est parti de mon passage à Vista RC1 hier. Et oui, en arrivant chez moi, il m'a fallu me reconnecter à mon réseau Wireless. Et c'est là que j'ai commencé à pâlir… J'ai 2 bornes, l'une est une vieille Compaq qui se manage avec un soft à condition de connaître son adresse IP et l'autre, c'est une borne MN-500 de Microsoft. Je l'ai passé en mode bridge le jour où j'ai installé ma neuf box (je sui passé récemment chez Neuf en dégroupage total).

    Seul problème, c'est que depuis, impossible de me connecter dessus… Et oui, en suivant la notice, elle devient non manageable (au préalable, il était possible de se connecter à une page Web pour l'administrer). C'est le seul endroit où ma clé Wep était stockée en clair… Pas de bol… Bref, il me fallait trouver une solution pour au moins me connecter en Wireless chez moi avec mon nouveau Vista. Du coup, j'ai essayé d'installer les outils de management de la borne, sans succès (on ne sait jamais si le soft avait été super bien fait, il aurait au moins trouvé la borne à travers les adresses MAC). Mais rien. Bref, il m'a fallut la reseté hard (j'ai cherché un bon moment) et finalement, j'ai réussit à m'y connecté. Cette fois, je n'ai pas fait la manip de la doc, juste une manip un peu plus simple, je lui ai donné une IP fixe dans le range des IP qui vont bien hors du scope DHCP. J'ai reparamétré le Wireless, remis une nouvelle clé WEP. Du coup, j'ai retrouvé et installé les outils de management de mon autre borne pour lui donner la nouvelle clé. Mais là pas glop non plus, pas de moyen simple de trouver son IP. En effet, la partie réseau de la neuf box est pour être polie très mal fichue et ne permet même pas d'avoir la liste des machines auxquelles elle a distribué des IP. Pire, elle distribue même des adresses IP identiques à plusieurs machines… Je me suis donc motivé, j'ai pris le taureau par les cornes et j'ai décidé d'ajouter un rôle à mon fabuleux serveur Windows 2003 Server. J'ai donc ajouté le rôle DHCP. J'ai tout paramétré bien comme il faut, créé les étendues qui vont bien, ajouter l'adresse de la neuf box comme routeur, ajouter les adresses DNS de la neuf box mais aussi les vraies qui sont distribues à la neuf box, quitte à faire autant être plus performant et éviter un routage. La neuf box est tellement pourrie (aï, j'ai été un peu moins poli) qu'il n'est même pas possible d'arrêter le DHCP proprement. Bref, un peu de bidouille et elle ne semble pas distribué d'adresse (au pire, j'ai poubélisé une plage d'une adresse).

    Hop, un reboot de la borne Compaq et elle récupère une IP bien propre. Le soft de management là-dessus, le mot de passe d'accès (ouf, je m'en souvenais) et j'ai donné la nouvelle clé (je me suis souvenu de l'astuce du 0xclé-en-hexa pour remettre la clé correctement). Je me suis reconnecté aux bornes avec mon PC sous Vista et j'ai testé indépendamment les deux bornes wireless pour vérifier que tout soit OK. J'ai donc repassé la clé sur le PC de la cuisine (connecté exclusivement en wireless) et le Windows Média Center de la salle (je ne m'en sers pas en wireless mais j'ai paramétré quand même).

    Bref, maintenant, tout marche, mes machines récupèrent bien une IP qui n'est pas déjà distribuée sur le réseau, je peux avoir accès à la liste et au nom des machines et je peux administrer mes 2 bornes. Cool !

    Total 2 heures pour réussir à remettre tout cela dans le droit chemin :-)

  • Laurent Ellerbach

    Nabaztag - Barney : le match des titans !!!

    • 0 Comments

    Je postais hier une vidéo réalisée par Benjamin Gauthey sur le lapin Nabaztag. Et bien, mainteneant, c'est au tour d'une vidéo où l'on retrouve Barney et le lapin. Un véritable feu d'artifice de parole et de lumière à ne pas rater :

     


    Barney - Nabaztag
    Vidéo envoyée par dubrow

  • Laurent Ellerbach

    Frimr : lancement officiel !

    • 0 Comments

    Ca y est, ils étaient à Lille hier pour leur grand show.

    Le site Frimr est maintenant live (bon OK, ça reste de la beta de chez beta mais c'est cool quand même).

    Mon score :

    laurent

    Pour être in du 2.0, faut être Frimr. Alors va chercher bonheur et frime sur Frimr.

     

  • Laurent Ellerbach

    Faire sa promo dans le Web 2.0

    • 0 Comments

    Faire sa promo dans le monde du Web 2.0, c'est s'assurer que tout le monde peut en un clic s'abonner à un flux RSS. Et des plates-formes pour suivre des flux, il y en a une tonne.

    Rien que pour les plus populaires, ça donne ça :

    Add Feed to Live.com

    Subscribe in NewsGator Online

    Subscribe in Rojo

    Add Laurent Ellerbach - Microsoft France to Newsburst from CNET News.com

    Add to Google

    Add to My AOL

    Subscribe in FeedLounge

    Add to netvibes

    Subscribe in Bloglines

    Add to The Free Dictionary

    Add to Bitty Browser

    Add to Plusmo

    Subscribe in NewsAlloy

    Add Laurent Ellerbach - Microsoft France to ODEO

    Subscribe in podnova

    Add to Pageflakes

Page 1 of 1 (11 items)