Laurent Ellerbach

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

  • Laurent Ellerbach

    Un concours de blog sympa autour des TechDays

    • 0 Comments

    A noter pour les TechDays, THE événement technique de l'année 2007, un concours super sympa pour les blogueurs. C'est simple, c'est facile, il suffit d'ajouter le tag suivant dans son post :

    <a href="http://technorati.com/tag/techdays2007" rel="tag" class="techtag">techdays2007</a>

    Toutes les explications, les nombreux lots à gagner, plus d'infos sur le blog officiel des TechDays (celui-là est hors concours :-)). Et il y a même une vidéo explicative pour ceux qui ne savent pas lire :-p


  • Laurent Ellerbach

    Le blog des TechDays est ouvert !

    • 0 Comments

    Pour être au courant des dernières infos sur les TechDays, visitez le blog TechDays.

    Pour mémoire, les Microsoft TechDays auront lieu du lundi 5 au mercredi 7 février au Palais des Congrès de Paris. Vous aurez l'occasion, lors de la première édition de cet événement exceptionnel, de faire le point sur tous les produits, technologies et solutions Microsoft.
    Ce sont plus de 220 sessions, des labs, des workshop (ce sont des ateliers qui permettent de manipuler les produits assistés par un animateur et des personnes pour aider en cas de question, bref, une formation :-))

    Inscrivez-vous vite sur http://www.microsoft.com/france/mstechdays/


  • Laurent Ellerbach

    Microsoft TechDays : c'est parti - 5, 6 et 7 février - 220 sessions pour les développeurs et les IT Pro !

    • 0 Comments

    Microsoft TechDays 

    Les Microsoft TechDays auront lieu du lundi 5 au mercredi 7 février au Palais des Congrès de Paris. Vous aurez l'occasion, lors de la première édition de cet événement exceptionnel, de faire le point sur tous les produits, technologies et solutions Microsoft.
    Nous vous proposons d'assister gratuitement à :

    • Plus de 200 sessions
    • Des rencontres avec des partenaires experts sur un véritable village de plus de 50 exposants
    • Des rencontres avec des communautés spécialisées
    • Des ateliers techniques
    • Des hands on lab...

    Pour ceux qui connaissaient les DevDays, cette nouvelle conférence remplace les DevDays. En mieux ? Clairement, ce sont les DevDays puissance 10 !! Rien que ça :-)

    Inscritpions sur : http://www.microsoft.com/france/mstechdays/

    Il y a 15 parcours, 3 focus pour trouver au mieux les sessions adaptée à chacun. Au programme, des sessions sur Visual Basic, l'accès aux données, de l'Architecture, de la sécurité, du management, de l'innovation, des technos du futur, du Web 2.0, bref de tout !

    Inscrivez-vous sans tarder. En plus c'est gratuit !

  • Laurent Ellerbach

    Imagine Cup 2007, c'est parti !!!

    • 0 Comments

    Vous êtes étudiant ?

    Le concours Imagine Cup est pour vous ! Il permet de montrer vos talents sur votre technologie préférée (Développement, web, interface, embarqué, système et réseaux,…) : Il y a un total de 170 000$ de prix à gagner !

    Depuis le lancement de ce concours international il y a quatre ans, les français ont rapporté 7 médailles et l'équivalent de 55 000 $ !

     

    Relevez le défi dans la catégorie Développement web

    En utilisant ASP.NET, créez un site sur le thème « Imaginez un monde dans lequel la technologie permette d’améliorer l’éducation » et partez peut-être en Corée pour la finale !

    Pour participer, rien de plus simple, il vous suffit de vous inscrire et déposer votre dossier de création de site avant le 28 février 2007 !

    15.000$ à gagner.

    En savoir plus et s’inscrire.

     

    Relevez le défi dans la catégorie Conception Logicielle

    Imaginez une solution applicative basée sur le framework .NET 2.0, répondant à la problématique « Imaginez un monde dans lequel la technologie permette d’améliorer l’éducation ».

    Pour participer, rien de plus simple, il vous suffit de vous inscrire et envoyer quelques pages décrivant votre projet avant le 31 janvier 2007.

    50.000$ à gagner!

    En savoir plus et s’inscrire.

     

    Relevez le défi dans la catégorie Système et Réseaux  

    Répondez à un QCM en ligne qui testera votre maîtrise de l’environnement Windows. Vous pourrez rejouer plusieurs fois. Les 500 meilleurs seront qualifiés pour la suite ! Pour participer, inscrivez-vous dès maintenant : 15.000$ à gagner et des voyages en Corée.

    En savoir plus et s’inscrire.

     

    Relevez le défi dans la catégorie Interface Design

    Créez une application (web ou PC) avec une interface vraiment originale et ergonomique sur le thème « Imaginez un monde dans lequel la technologie permette d’améliorer l’éducation ». Vous êtes plutôt développeur mais le dessin n’est pas votre truc ? Vous êtes designer mais ne savez pas codeur? Microsoft vous propose de vous faire rencontrer pour travailler ensemble, avec un coach, dans son prestigieux centre de technologie à Paris. Et déposez un document de quelques pages décrivant votre projet avant le 15 février 2007.

    15.000$ à gagner et des voyages en Corée !

    En savoir plus et s’inscrire.

     

    Relevez le défi dans la catégorie Project Hoshimi

    Programmez la stratégie d’une petite équipe de nanorobots virtuels. Ils ont pour mission de sauver l’être humain de maladies en se battant dans le corps humain ! Un superbe environnement 3D vous permet de le résultat de votre stratégie. Vous ne connaissez rien à la programmation ? Un module pas à pas vous permet de créer votre équipe sans rien coder ! 15.000$ à gagner et des voyages en Corée.

    En savoir plus et vous inscrire

     

    Relevez le défi dans la catégorie Embarqué

    Créez votre application embarquée sur le thème « Imaginez un monde dans lequel la technologie permette d’améliorer l’éducation » : les 200 meilleurs dossiers déposés (avant le 15 février 2007)  recevront une carte mère en cadeau. Pour les finalistes, 15.000$ à gagner !

    En savoir plus et vous inscrire

  • Laurent Ellerbach

    Nouveau site Office Online : la France fait la sieste :-)

    • 1 Comments

    Allez voir les nouveaux sites Office Online. Ils sont tout beau tout neuf :

    http://office.microsoft.com/en-us/default.aspx (Etats Unis )
    http://office.microsoft.com/de-de/default.aspx (Allemagne)
    http://office.microsoft.com/fr-fr/default.aspx (France)
    Le seul truc, c'est que sur celui de la France, il y a une fille qui dort sur son prtable. Effet 35h ?

  • Laurent Ellerbach

    Steve Balmer à Polytechnique Paris

    • 1 Comments

    A l'occasion de sa dernière visite en France, mercredi dernier Steve Blamer a donné une conférence à Polytechnique. Ce n'est pas un scoop si vous suivez le blog de Benjamin :-). Benjamin y a publié quelques extraits vidéos.

    Vous pouvez dès à présent retrouver l'intégralité de la conférence avec toutes les questions posées par les Polytechniciens en uniforme et toutes les réponses apportées par Steve.

    Le trascript complet arrive bientôt.

  • Laurent Ellerbach

    AmiAmiAMiami ou gagnez nouvel an pour 20 amis à Miami

    • 0 Comments

    Tout est dans le titre ou presque :-)

    Ami d'ami à Miami

    amiamiamiamiwww.amiamiami.fr permettant de gagner son nouvel an à Miami avec 20 de ses amis Messenger ! (nous prenons en charge les 21 billets d’avion + l’hébergement en hôtel Méridien 4 étoiles !!)

     

    Pour jouez amiamiamiami c’est simple : il faut juste avoir 20 amis Messenger dans la liste d’Amis de son Space J

    Comment ajouter des amis dans son Space ? Simplissime : Regardez donc cette vidéo dans laquelle Max ajoute tous ses amis.

    Je me demandais pourquoi depuis quelques jours j'avais une tonne d'ami qui m'invitaient ! Avec un peu de chance, je vais aller passer le nouvel an à Miami.

    Pensez amiamiamiami :-)

  • Laurent Ellerbach

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

    • 0 Comments

    Me voici déjà au dixième post de ma série. J'ai déjà décrypté le protocole de communication de mon onduleur. J'ai implémenté toutes les fonctions nécessaires à une gestion de cet onduleur avec des propriétés qui permettent de lire les données de courant, tension, etc. J'y ai ajouté des événements qui se déclenchent en cas de panne électrique, de batterie faible, etc. Me voilà donc avec une classe complète prête à être utiliser.

    Comme mon code est destiné à fonctionner notamment sur un serveur, il est obligatoire que ma classe soit gérée dans une application de type service Windows. Un service fonctionne quoi qu'il arrive, quelque soit l'utilisateur connecté ou non. Il lui est possible d'interagir avec le bureau Windows dans certains cas quand un utilisateur est connecté.

    Un service fonctionne sous un compte utilisateur. Cela lui donne donc les droits liés à cet utilisateur. Il existe un utilisateur un peu particulier qui est le compte System. En général, souvent pour se simplifier la vie, la plupart des services fonctionnent avec ce compte.

    Côté démarrage, il est possible d'opter pour 3 solutions :

    • Arrêté (bon, ça ne sert pas à grand-chose sauf quand le service est piloté par une autre application, ce qui peut être parfois le cas).
    • Manuel : le service ne démarre que si l'utilisateur le souhaite ou si un service nécessitant ce service démarre (cas d'une dépendance)
    • Automatique : le service se lance automatiquement avec Windows

    Voilà pour les généralités. Maintenant, écrire un service en .NET nécessite d'écrire le service en tant que tel mais aussi une classe spécifique qui va permettre d'installer le service. J'y reviendrais plus loin. Comme je l'ai indiqué dans mon premier post, j'ai décidé d'utiliser les versions Express de Visual Studio, gratuite pour tout le monde, pour faire mon développement et notamment VB Express. Les versions Express permettent de faire du développement .NET et sont déjà très complètes. Elles ont des limitations notamment dans les templates qui permettent de faciliter le développement. Les autres limitations sont liées au débugage. Dans le cas de mon service, écrire un service en VB Express m'a demandé beaucoup de temps. Certainement la partie la plus longue. Le débugage m'a été impossible. J'ai fait le test a posteriori avec une version Visual Studio Pro et si je l'avais développer avec cette version, cela m'aurais fait gagner beaucoup de temps.

    Je vais quand même expliquer comment créer un service avec les versions Express.

    Il faut, comme je l'ai indiqué, créer une classe d'installation du service. Cette classe doit s'appeler ProjectInstaller et doit hériter de System.Configuration.Install.Installer

    Voici le code nécessaire à l'installation d'un service :

    <RunInstaller(True)> Public Class ProjectInstaller

    Inherits System.Configuration.Install.Installer

    Public Sub New()

    MyBase.New()

    Dim myServiceProcessInstaller As System.ServiceProcess.ServiceProcessInstaller

    Dim ServiceOnduleurInstaller As System.ServiceProcess.ServiceInstaller

    myServiceProcessInstaller = New System.ServiceProcess.ServiceProcessInstaller

    ServiceOnduleurInstaller = New System.ServiceProcess.ServiceInstaller

    'ServiceProcessInstaller

    myServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem

    myServiceProcessInstaller.Password = Nothing

    myServiceProcessInstaller.Username = Nothing

    'ServiceOnduleurInstaller

    ServiceOnduleurInstaller.DisplayName = "Service Onduleur"

    ServiceOnduleurInstaller.ServiceName = "Service Onduleur"

    ServiceOnduleurInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic

    'ProjectInstaller

    Installers.AddRange(New System.Configuration.Install.Installer() { myServiceProcessInstaller, ServiceOnduleurInstaller})

    End Sub

    End Class

    Comme expliqué dans les généralités des services, il est nécessaire de déterminer sous quel compte et quel va être le type de démarrage du service. C'est là aussi que le nom du service est écrit en dur. C'est le nom qui apparaît dans la console d'administration des services.

    Pour revenir sur le cas du compte System, ce compte est comme toutes les autres, il possède un login et un mot de passe. Cependant, dans le cas de l'initialisation du compte pour une utilisation avec le compte System, il faut spécifier ServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem et ne pas oublier les deux lignes ServiceProcessInstaller.Password = Nothing et ServiceProcessInstaller.Username = Nothing. Si une de ces variables est modifiée, il y a des chances que le lancement du service ne fonctionne pas car les informations de compte stockées pourraient être étonnées.

    Une fois la classe ProjectInstaller d'écrite, il reste le service en tant que tel à écrire. Voici une classe de base qui associée à la classe précédente fonctionne.

    Public Class ServiceOnduleur

    Inherits System.ServiceProcess.ServiceBase

    Public Sub New()

    MyBase.New()

    Me.ServiceName = "Service Onduleur"

    End Sub

    ' C'est par ici que le service sera initialisé

    <MTAThread()> Shared Sub Main()

    Dim ServicesToRun() As System.ServiceProcess.ServiceBase

    ' Démarrage du service dans le process

    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceOnduleur}

    System.ServiceProcess.ServiceBase.Run(ServicesToRun)

    End Sub

    Protected Overrides Sub OnStart(ByVal args() As String)

    ' Initialisation du service pour le démarrage

    End Sub

    Protected Overrides Sub OnStop()

    ' Code qui arrête le service

    End Sub

    End Class

    La classe service doit être publique et héritée de la classe System.ServiceProcess.ServiceBase. Elle doit avoir un point d'entrée (ici Shared Main) qui initialise le service. L'initialisation se fait en créant une nouvelle classe ServiceBase et en le démarrant. Il est possible de démarrer plusieurs services dans le même process. Pour cela, il suffit de faire comme suit :

    ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}

    Le minimum pour une classe de type service est d'implémenter une méthode OnStart et une autre OnStop. Comme leurs noms l'indiquent, dans le OnStart, il faut initialiser le service pour qu'il démarre et dans le OnStop ce qu'il faut pour qu'il s'arrête.

    Avec cette classe service, la gestion de l'onduleur, l'envoie d'email, j'ai maintenant tout ce qu'il faut pour écrire un service complet qui me permette de gérer mes onduleurs. Stay tune, il y aura peut-être une suite :-)

  • Laurent Ellerbach

    10 bonnes raisons de mettre un flux RSS sur son blog

    • 0 Comments

    Je relaie un super post de Christophe Lauer sur les 10 bonnes raisons de mettre un flux RSS sur son blog !

  • Laurent Ellerbach

    Je joue aux Lego NXT Mindstorms : la preuve en vidéo !!!

    • 0 Comments

    Benjamin Gauthey a capturé un moment où je joue aux Lego NXT Mindstorms. La preuve en image :

    Vidéo Lego NXT Mindstorms

    C'est un superbe jouet, idéal pour apprendre à programmer en s'amusant. Il possède entre autre une interface Bluetooth et Lego publie toutes les spécifications nécessaires pour s'y interfacer. Ca laisse la porte ouverte à un pilotage à distance via Bluetooth en .NET et compact framework .NET. Stay tune :-)

  • Laurent Ellerbach

    Prochain Forum Architecte SOA le 19 octobre : la vidéo de teasing !

    • 0 Comments

    Le prochain forum architecte sur SOA autour du thème "De la production à la consommation de services Infrastructure SOA dans des scénarios Web, SaaS et BPM" (rien que ça :-)). Cette journée permettra de faire un point sur les enjeux d'implémentation d'une architecture SOA selon les perspectives actuelles (Web et BPM) et à venir (Software As A Service). L'introduction sera présentée David Chappell, directeur de Chappel & Associates. Je suis fan de David qqui arrive à vulgariser les problématiques d'architectures. Pas facile.

    Cliquez ici pour vous inscrire et découvrir le programme.

    Enfin, je ne saurais résister à vous présenter la vidéo de teasing réalisée par Marine Tranquard avec Stève Sfartz et Jean-Christophe Cimetière comme acteurs. J'adore !

    Vidéo !

  • 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

    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

    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

  • 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

    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

    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

    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

    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

    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

    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 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

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

    • 0 Comments

    Me voici donc maintenant avec 3 chaînes de texte à analyser et dont il faut que je ressorte plusieurs informations. Les chaînes sont bien délimitées. Le protocole complet est expliqué dans le sixième post.

    Voici les 3 principales chaînes :

    • #BELKIN Master 1.00
    • (238.0 237.0 236.0 024 50.0 13.9 32.0 00001000
    • #230.0 2.2 12.00 50.0

    En temps normal, je rechercherais les espaces, j’extrairai les valeurs entre les espaces et les convertirais. Vu que les chaînes semblent avoir tout le temps la même taille, même pas la peine de regarder les espaces, un extrait de type mid( "#230.0 2.2 12.00 50.0",1,5) pour le 230.0 suffirait amplement. Chaque partie peut être extraite ainsi. Une simple vérification de longueur de chaîne suffira. Histoire de compliquer un peu la chose et surtout dans la philosophie de me remettre au code et d’apprendre de nouvelles choses, je me suis dit que je regarderais bien les expressions régulières. Et là, le bonheur. Je connaissais un peu la théorie mais pas du tout la pratique. Et je me suis bien amusé :-).

    Comme toujours, j’ai commencé par rechercher de l’info sur le sujet. D’abord la doc officielle sur le sujet (bof), puis des exemples sur MSDN (mieux) et dans les communautés (mieux). Je suis tombé sur pas mal d’applications qui permettaient de valider et tester ces expressions régulières et même de générer le code associé. Bien pratique pour se mettre en jambe.

    J’ai donc suivi quelques tutoriaux, fait quelques exemples et je me suis lancé pour mes propres chaînes. Je suis parti du principe, pour toutes les chaînes, que la taille des chaînes ne varierai pas et qu’elles étaient toujours formées de la même façon. Que si cela n’était pas respecté, il y avait erreur. Que pour la chaîne contenant du texte, il n’y avait que 2 mots renvoyés. Voici donc un peu de code (toujours pour faire plaisir à Benjamin) pour illustrer cela :

    Public Function DecryptTest(ByVal StrCrypter As String, ByVal IntTypeCrypter As OnduleurCommande) As Boolean

    Select Case IntTypeCrypter

    Case OnduleurCommande.Identite

    ' on décrypte le I : #BELKIN Master 1.00

    Dim re As New Regex("\b[A-Za-z].*?\b|\b\d\.\d\d\b")

    Dim mc As MatchCollection

    mc = re.Matches(StrCrypter)

    If mc.Count = 3 Then

    myModele = mc.Item(0).Value

    mySousModele = mc.Item(1).Value

    myModeleVersion = mc.Item(2).Value

    Else

    Return False

    End If

     

    Case OnduleurCommande.AlimentationBatterie

    ' on décrypte le F : #230.0 2.2 12.00 50.0

    Dim re As New Regex("\b\d\d\d\.\d\b|\b\d\.\d\b|\b\d\d\.\d\d\b|\b\d\d\.\d")

    Dim mc As MatchCollection

    mc = re.Matches(StrCrypter)

    If mc.Count = 4 Then

    myTensionSortieBatterie = Val(mc.Item(0).Value)

    myAmperageBatterie = Val(mc.Item(1).Value)

    myTensionBatterie = Val(mc.Item(2).Value)

    myFrequenceSortieBatterie = Val(mc.Item(3).Value)

    Else

    Return False

    End If

     

    Case OnduleurCommande.AlimentationSecteur

    ' on décrypte le Q1 : (238.0 237.0 236.0 024 50.0 13.9 32.0 00001000

    Dim re As New Regex("\b\d\d\d\.\d\b|\b\d\d\d\b|\b\d\d\.\d\b|\b\d\d\d\d\d\d\d\d")

    Dim mc As MatchCollection

    mc = re.Matches(StrCrypter)

    If mc.Count = 8 Then

    myTensionAlim = Val(mc.Item(0).Value)

    myTensionSortiePrimaire = Val(mc.Item(1).Value)

    myTensionSortieSecondaire = Val(mc.Item(2).Value)

    myPourcentageChargeOnduleur = Val(mc.Item(3).Value)

    myFrequence = Val(mc.Item(4).Value)

    myPourcentageChargeBatterie = (Val(mc.Item(5).Value) / 14.0 * 100.0)

    myTemperature = Val(mc.Item(6).Value)

    ' on s’occupera plus tard de la chaîne de 8 caractères

    Else

    Return False

    End If

    Case Else

    Return False

    End Select

     

    Return True

    End Function

    Pour lire le code, tous les myQuelqueChose sont des variables privées qui contiennent toutes les propriétés de l’onduleur. Le type dépend de la variable à stocker. La fonction Val a l’avantage d’être surchargée et de renvoyer des types standards.

    Analysons l’extraction des informations de la chaîne Q1. Création d’une expression régulière :

    Dim re As New Regex("\b\d\d\d\.\d\b|\b\d\d\d\b|\b\d\d\.\d\b|\b\d\d\d\d\d\d\d\d")

    Création d’une collection d’informations (type String) renvoyées par le passage à l’expression régulière :

    Dim mc As MatchCollection

    Passage de l’expression régulière sur la chaîne de caractère StrCrypter qui contient (238.0 237.0 236.0 024 50.0 13.9 32.0 00001000 :

    mc = re.Matches(StrCrypter)

    S’il y a eu 8 morceaux trouvés alors c’est OK et on décrypte la chaîne :

    If mc.Count = 8 Then

    Comment fonctionne l’expression régulière ? Avant de répondre, je précise que je ne suis pas devenu un expert en quelques jours donc, il y a peut-être mieux que ce que j’ai fait, plus simple ou plus compliqué. Mais en tout cas, cela fonctionne très bien :

    • \b\d\d\d\.\d\b :
      • \d signifie valeur numérique, c’est la même chose que lorsqu’on écrit [0-9], je ne me prive donc pas d’utiliser le raccourci :-)
      • \. Désigne le point en tant que tel. Si . est utilisé seul, il désigne n’importe quel caractère.
      • \b indique qu’il faut qu’il y ait un espace ou une ponctuation avant le caractère
      • Cette expression me permet d’extraire les 3 premières chaînes de type 238.0
    • |\b\d\d\d\b :
      • | signifie ou logique. Ce qui suit sera donc extrait en plus de ce qui précède
      • 3 \d indique 3 chiffres associé au \b du début, il permet d’extraire le 024
    • |\b\d\d\.\d\b :
      • Rien de nouveau dans cette expression, même logique que la première. Elle permet d’extraire les 50.0, 13.9 et 32.0
    • |\b\d\d\d\d\d\d\d\d :
      • Tout simple, récupère les 8 derniers chiffres

    La collection dans les recherches est toujours remplie dans l’ordre où les éléments ont été trouvés. Il ne me reste donc plus qu’après à remplir mes variables privées avec les informations trouvées, dans l’ordre où elles apparaissent.

    Côté du texte, j’ai un peu rusé et utilisé une combine. L’expression \b[A-Za-z].*?\b me permet d’extraire une chaîne de texte située entre 2 espaces ou ponctuation quelque soit la longueur de la chaîne. Tout réside dans le qualificateur paresseux *? qui permet de renvoyer aussi peu de répétition que possible. Associé au \b qui le suit et au . qui le précède, il renvoie donc ce qui se trouve avant les ponctuations. Et permet de découper les mots. Je sens que je vais le garder dans mes favoris :-)

    J’aurais également pu valider que la chaîne comprenait bien BELKIN, Master et 1.00 en utilisant l’expression régulière BELKIN|Master|1\.00 qui doit me renvoyer 3 chaînes. J’ai préféré l’autre solution car elle me paraissait un peu plus souple. Et surtout parce que j’étais tout fier d’avoir trouvé une expression sympa pour séparer les mots ! Cela rend mon code un peu plus générique et permettra une utilisation avec un autre type d’onduleur utilisant le même protocole.

    Me voilà donc maintenant bien avancé avec mon protocole presque complet, le code qui permet de le décrypter, mon code d’envoi de mail. Il me reste donc à coder un peu d’intelligence pour permettre la remontée d’alerte, l’utilisation en tant que service Windows (hors de question de devoir être logué pour que ce programme fonctionne) et coder la communication avec l’onduleur. Bref, stay tune, la suite dans les prochains posts.

  • Laurent Ellerbach

    Développer ses propres jeux pour XBOX 360 : c’est possible !

    • 0 Comments

    Et oui, plus besoin d’être une société pignon sur rue dans le développement de jeu pour développer ses propres jeux pour XBOX 360. C’est possible grâce à XNA Game Studio Express. Plus d’infos sur : http://www.microsoft.com/presspass/press/2006/aug06/08-13XNAGameStudioPR.mspx

    Une news officielle attendue depuis longtemps dans la communauté des développeurs.

  • Laurent Ellerbach

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

    • 6 Comments

    Voici la suite des aventures de l’analyse du protocole de communication expliqué dans la quatrième partie. J’ai donc essayé à partir des commandes envoyées à l’onduleur de compléter ce que j’ai trouvé en écoutant la conversation entre l’application livrée avec l’onduleur et l’onduleur. J’ai donc utilisé l’application développée précédemment pour envoyer les commandes. Je notais le résultat de chaque commande. Ensuite, j’ai essayé à partir de l’application livrée avec et des informations renvoyées de déchiffrer les résultats. Avoir une application existante aide grandement, cela facilite la comparaison des résultats. Sinon, il faut essayer de deviner par tâtonnement. Moins drôle. Il me reste quelques zones d’incertitude cependant que je vais devoir approfondir. Pour les commandes que je n’avais pas (exemple S), j’ai tout simplement envoyé chaque lettre de l’alphabet et j’ai attendu le retour. La plupart du temps, c’est un écho, assez classique dans les protocoles. Quand rien ne revenait, j’analysais l’onduleur lui-même. Parfois rien ne se passait du tout (exemple envoi de la commande Q). Cela impliquait qu’il pouvait manquer une lettre/chiffre derrière ou que le mode était déjà enclenché (exemple commande C quand on est déjà en courant continue).

    Commande I

    Renvoie l’identifiant de l’onduleur : #BELKIN Master 1.00

    1 caractère # qui identifie le début de la chaîne

    16 caractères qui contiennent la marque de l’onduleur, ici BELKIN

    11 caractères qui contiennent le modèle de l’onduleur, ici Master

    11 caractères qui contiennent la version du firmware ici 1.00

    Commande S

    Arrête l’onduleur. Attention, si l’onduleur est alimenté en courant il se remet en marche automatiquement. Commande à utiliser donc de préférence lors d’une coupure de courant si besoin.

    Commande T

    Passe l’onduleur en mode batterie test pendant 10s.

    Commande C

    Repasse l’onduleur en mode alimentation par secteur. Utile lorsqu’on force l’onduleur à se mettre en mode batterie avec la commande TL ou T. Pas de différence visible avec la commande CT.

    Commande TL

    Passe l’onduleur en mode batterie.

    Commande CT

    Repasse l’onduleur en mode alimentation par secteur. Voir commande C.

    Commande Q1

    Renvoie un statut des tensions, fréquences, températures et charges : (238.0 237.0 236.0 024 50.0 13.9 32.0 00001000

    238.0 = Voltage d’alimentation = 238.0 V

    237.0 = Voltage tension de sortie primaire ( ?) = 237.0 V

    236.0 = Voltage tension de sortie secondaire ( ?) = 236.0 V

    024 = charge de l’onduleur en %

    50.0 = fréquence en Hertz

    13.9 = Charge de la batterie (?), reste à déterminer l’échelle, a priori 14.

    32.0 = température en °C

    00001000 = statut. 1 bit par info. Pas encore déterminé l’utilité de tous les bits. Tests à effectuer

    Commande F

    Renvoie un statut de la batterie : #230.0 2.2 12.00 50.0

    230.0 = Voltage de la sortie batterie

    2.2 = courant en ampère

    12.00 = tension de la batterie

    50.0 = Fréquence de sortie

    Je suis content de ce premier jet de résultat qu’il me reste à approfondir avec quelques tests complémentaires. Cela vade toute façon me permettre d’avancer rapidement dans l’écriture d’une classe de gestion de l’onduleur. A suivre au prochain post !

Page 5 of 6 (138 items) «23456