IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Logiciel pour simuler un serveur


Sujet :

Arduino

  1. #1
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut Logiciel pour simuler un serveur
    Bonjour,

    Toujours pour mon projet domotique, je suis en train de mettre au point :
    - des Arduino associés à des Shields Ethernet configurés en client web
    - un Arduino associés à un Shields Ethernet configurés en serveur web

    Ca va être fastidieux, pour le développement, de mettre à jour à chaque fois successivement l'Arduino serveur et l'Arduino client...

    Le plus simple dans ce cas de figure c'est que je mette au point mes clients Arduino avec un serveur "virtuel" qui tourne sur mon ordinateur.
    Après, j'aurais juste à "porter" le code de mon serveur virtuel sur l'Arduino serveur.

    Il y a des logiciels qui existent :
    - Wamp64
    - EASYPHP
    - UWAMP
    - Caddy
    - ...

    Problème :
    - ces logiciels sont des grosses usines à gaz
    - et surtout ils risquent de ne pas être adaptés.

    Il me faut un petit logiciel de rien du tout pour simuler ce que va faire mon Arduino serveur web (répondre à une requette HTTP)
    C'est clair que l'Arduino serveur ne tournera pas en PHP7 avec un SGBD MySQL
    De plus, mon Arduino va faire des choses possiblement inhabituelles pour un "vrai" serveur web, comme en envoyer une page web complètement différente en fonction de la requête reçue.
    En effet :
    - pour soulager mes Arduino clients, je vais leur envoyer une page web très minimale.
    - en revanche, si c'est un navigateur web de PC ou de Smartphone qui interroge mon Arduino serveur, il recevra une vraie page web avec un formulaire permettant de piloter le système de façon ergonomique.

    En fait, il faudrait que je puisse faire moi-même ce fameux logiciel qui simule un serveur web avec Visual Basic .NET ou C# (je me débrouille bien avec ces langages, ayant développé quelques applications avec)

    Par contre là je ne sait pas trop comment faire... la difficulté étant que je ne peux pas monopoliser un PC comme serveur...
    ...et surtout il faut vraiment que j'arrive à émuler un serveur sur mon réseau local depuis mon PC, ce serveur "virtuel" devant être accessible depuis les autres appareils connectés à mon réseau local et ça je ne sais même pas si c'est faisable.

    Il faut peut être que je pose ma question sur le forum VB.NET / C# ?
    Ou sur le forum dédié aux serveurs ?

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    Citation Envoyé par electroremy Voir le message
    Bonjour,

    Toujours pour mon projet domotique, je suis en train de mettre au point :
    - des Arduino associés à des Shields Ethernet configurés en client web
    - un Arduino associés à un Shields Ethernet configurés en serveur web

    ...

    Par contre là je ne sait pas trop comment faire... la difficulté étant que je ne peux pas monopoliser un PC comme serveur...
    Beaucoup trop de choses, trop compliqué pour un Arduino!
    J'aimerais proposer un ESP32 qui supporte le multi-tâche comme un Web serveur en parallèle!?!

    Un Raspberry Pi (RPi) comme serveur sans clavier ni écran ... c'est ce que je ferais et conseillerais!
    Cela coûte moins qu'un Arduino avec un shield Ethernet.
    Du point de vue capacité, langages, solutions ... on est sur une autre planète!

    Cela rejoint l'autre message: https://www.developpez.net/forums/d2...erroge-client/

    C'est très facile de développer un serveur Web sur un RPi et d'y ajouter des applications clients pour dialoguer avec des Arduino.
    J'y ai vu un buzzer! Je le mettrais sur le RPi.

    Cordialement

  3. #3
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Bonjour,

    Je connais le Raspberry PI (j'en ai un avec un HifiBerryHat sous RuneAudio) et si j'ai choisi Arduino c'est pour plusieurs raisons :
    - consommation électrique moindre
    - alimentation possible via une entrée 7V à 12V (les Raspberry PI réclament chacun un bloc secteur USB de bonne qualité avec un câblage court)
    - vitesse de boot rapide (notamment si on supprime le bootloader, ce que je ferais une fois la version finale mise au point)
    - extinction possible sans devoir faire d'arrêt propre (un Raspberry PI sous Linux doit être éteint proprement)
    - résistance aux virus informatiques

    Un Arduino reste un système à base de microcontrôleur donc "proche de l'électronique"
    Un Raspberry PI reste un ordinateur, avec les avantages mais aussi les inconvénients qui vont avec...

    Le Shield Internet gère la couche TCP/IP et a une mémoire tampon : l'Arduino n'est pas obligé de tout traiter immédiatement

    Pour piloter des relais aucun problème, je ne suis pas à la demi seconde près.

    S'agissant des capteurs, je n'envisage que des capteurs de température et d'autres capteurs "environnementaux", donc pas d’acquisition rapide.

    Après c'est vrai que l'Arduino UNO date un peu... il y a de sacrées cartes maintenant.
    Cependant, j'arrive sur un Arduino UNO à gérer l'écran TFT, la dalle tactile, le shield Ethernet en mode serveur en exploitant que les 2/3 de la ROM et 1/5 de la RAM.
    Au pire j'utilise partout des Arduino MEGA et là j'ai de la marge niveau ROM et RAM
    Je n'aime pas surdimensionner les choses...
    De même, je souhaite rester "en filaire" donc en Ethernet... si je prend une autre carte il me la faut sans Wifi et avec Ethernet, ou bien la possibilité de brancher le Shield Ethernet dessus.

    J'aimerais aussi une carte qui soit très rependue pour pouvoir la remplacer sans difficulté en cas de panne. L'Arduino UNO officiel est un best seller pas de soucis à ce niveau là.
    Une super carte qui sera introuvable dans deux ou trois ans (ou avec un brochage ou une taille différente) cela m'ennuie :
    - je devrais refaire un programme
    - surtout je risque de devoir refaire aussi le boitier voire le câblage "auxiliaire"

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  4. #4
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Bonjour,

    bonne nouvelle j'ai trouvé comment simuler un serveur web sur mon ordinateur - un tout petit programme en VB.NET suffit !

    Voici le code :

    Form1.vb :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    Imports System.IO
    Imports System.Net
    Imports System.Text
    Imports System.Threading
    Public Class Form1
        Private t As New Thread(AddressOf IncomingMessage)
        Dim prefixes(0), Port, UserIP, UserIPPort As String
        Private Function ReplaceChr(ByVal Value As String) As String
            ReplaceChr = Replace(Value, Chr(39), "")
            Return ReplaceChr
        End Function
        Private Sub Frm30_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Try
                t.Suspend()
            Catch ex As Exception
            End Try
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Control.CheckForIllegalCrossThreadCalls = False
     
            '**********************************************************************************************************************
            '* Démo ici : https://www.youtube.com/watch?v=wyDe-rDJess                                                             *
            '* Il faut saisir l'adresse http://192.168.xxx.xxx:1212/topup/ pour faire une requête au serveur                       *
            '* Il faut saisir l'adresse http://192.168.xxx.xxx pour faire une requête au serveur avec prefixes(0) = "http://*:80/" *
            '**********************************************************************************************************************
            'prefixes(0) = "http://*:1212/topup/"
            prefixes(0) = "http://*:80/"
     
            With t
                If (.ThreadState And ThreadState.Unstarted) <> 0 Then
                    ' The thread has never been started. Start it.
                    .IsBackground = True
                    .Start()
                Else
                    ' The thread is paused. Resume it.
                    .Resume()
                End If
            End With
        End Sub
        Sub ShowMsgIn(ByVal Text As String)
            TxtMsgIn.Text = TxtMsgIn.Text.Insert(0, Text)
        End Sub
        Sub ShowMsgOut(ByVal Text As String)
            TxtMsgOut.Text = TxtMsgOut.Text.Insert(0, Text)
        End Sub
        Private Sub IncomingMessage()
    Bgn:
            If Not HttpListener.IsSupported Then
                MsgBox("Windows XP SP2, Server 2003, or higher is required to use the HttpListener class.")
                Exit Sub
            End If
     
            ' URI prefixes are required,
            If prefixes(0) Is Nothing OrElse prefixes(0).Length = 0 Then
                Throw New ArgumentException("prefixes")
            End If
     
            ' Create a listener and add the prefixes.
            Dim listener As HttpListener = New HttpListener()
            For Each s As String In prefixes
                listener.Prefixes.Add(s)
            Next
     
            Try
                ' Start the listener to begin listening for requests.
                listener.Start()
     
                ' Set the number of requests this application will handle.
                Dim numRequestsToBeHandled As Integer = 10
     
                For i As Integer = 0 To numRequestsToBeHandled
                    Dim response As HttpListenerResponse = Nothing
                    Try
                        ' Note: GetContext blocks while waiting for a request.
                        Dim context As HttpListenerContext = listener.GetContext()
     
                        'Gets user client ip
                        UserIPPort = context.Request.RemoteEndPoint.ToString
                        UserIP = Strings.Left(UserIPPort, UserIPPort.IndexOf(":"))
     
                        'Get request
                        Dim sr As StreamReader = New StreamReader(context.Request.InputStream)
                        Dim URLRequestClient As String = sr.ReadToEnd()
     
                        If URLRequestClient = Nothing Then
                            'buat trx http get
                            URLRequestClient = context.Request.Url.OriginalString
                        End If
     
                        ShowMsgIn("[Msg In]" & vbCrLf & "Date" & Chr(9) & " : " & Now & vbCrLf _
                                & "Expediteur" & Chr(9) & " : " & UserIPPort & vbCrLf _
                                & "Message" & Chr(9) & " : " & URLRequestClient & vbCrLf & vbCrLf)
     
                        ' Create the response.
                        response = context.Response
     
                        Dim MsgIn As String = URLRequestClient
                        'If MsgIn.Length > 1000 Then
                        '    MsgIn = Strings.Left(MsgIn, 1000)
                        'End If
     
                        Dim ResponRS As String
     
                        'MsgIn = MsgIn.Remove(0, MsgIn.IndexOf("=")).Replace("=", "").Replace("&tujuan", ".")
     
                        '************************************************************************************************************
                        '* Taper la réponse (la page web) ici                                                                       *
                        '************************************************************************************************************
                        ResponRS = "Votre message : " & MsgIn & " recu et traite le " & " " & Now & ""
     
     
    SendRespon:
                        Try
                            Dim buffer() As Byte = System.Text.Encoding.UTF8.GetBytes(ResponRS)
                            response.ContentLength64 = buffer.Length
                            Dim output As System.IO.Stream = response.OutputStream
                            output.Write(buffer, 0, buffer.Length)
     
                            ShowMsgOut("[Msg Out]" & vbCrLf & "Date" & Chr(9) & " : " & Now & vbCrLf _
                                        & "Cible" & Chr(9) & " : " & UserIP & vbCrLf _
                                        & "Message" & Chr(9) & " : " & ResponRS & vbCrLf & vbCrLf)
                        Catch ex As Exception
                        End Try
                    Catch ex As HttpListenerException
                        MsgBox(ex.Message)
                    Finally
                        If response IsNot Nothing Then
                            response.Close()
                        End If
                    End Try
                Next
            Catch ex As HttpListenerException
                MsgBox(ex.Message)
            Finally
                ' Stop listening for requests.
                listener.Close()
            End Try
            GoTo Bgn
        End Sub
        Private Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click
            If TxtURL.Text = Nothing Then
                MsgBox("L'URL doit être renseignée")
                TxtURL.Focus()
                Return
            End If
     
            BtnSend.Enabled = False
            Application.DoEvents()
     
            Dim URL As String
            Dim rdmidtrx As New Random
     
            If RBHTTPStandar.Checked Then
     
                URL = TxtURL.Text & TxtMsgSend.Text
     
                Dim request As WebRequest = WebRequest.Create(URL)
                request.Credentials = CredentialCache.DefaultCredentials
                request.Timeout = 10000
     
                Dim ResponseText As String
                Try
                    Dim response As WebResponse = request.GetResponse()
                    Dim dataStream As Stream = response.GetResponseStream()
                    Dim reader As New StreamReader(dataStream)
                    ResponseText = reader.ReadToEnd()
     
                    reader.Close()
                    response.Close()
                Catch ex As Exception
                    MsgBox("Erreur standard HTTP : " & ex.Message)
                End Try
                ShowMsgOut("[Msg Out]" & vbCrLf & "Date" & Chr(9) & " : " & Now & vbCrLf _
                            & "Cible" & Chr(9) & " : " & TxtURL.Text & vbCrLf _
                            & "Message" & Chr(9) & " : " & TxtMsgSend.Text & vbCrLf & vbCrLf)
            ElseIf RBXML.Checked Then
                Dim statusCode As HttpStatusCode
                Dim request As WebRequest = WebRequest.Create(TxtURL.Text) 'IRS : "http://192.168.1.81:8080/webtopup/api/h2h"
                request.Method = "POST"
     
                Dim postData As String = TxtMsgSend.Text
     
                Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
                request.ContentType = "application/xml"
                'request.ContentType = "application/x-www-form-urlencoded"
                request.ContentLength = byteArray.Length
                request.Timeout = 10000
     
                Try
                    Dim dataStream As Stream = request.GetRequestStream()
                    dataStream.Write(byteArray, 0, byteArray.Length)
                    dataStream.Close()
     
                    Dim response As WebResponse = request.GetResponse()
     
                    Dim httpResponse As HttpWebResponse = CType(response, HttpWebResponse)
                    statusCode = httpResponse.StatusCode
     
                    dataStream = response.GetResponseStream()
     
                    Dim reader As New StreamReader(dataStream)
                    Dim responseFromServer As String = reader.ReadToEnd()
     
                    reader.Close()
                    dataStream.Close()
                    response.Close()
     
                    ShowMsgOut("[Msg Out]" & vbCrLf & "Date" & Chr(9) & " : " & Now & vbCrLf _
                                & "Cible" & Chr(9) & " : " & TxtURL.Text & vbCrLf _
                                & "Message" & Chr(9) & " : " & TxtMsgSend.Text & vbCrLf & vbCrLf)
                Catch ex As Exception
                    MsgBox("Error XML : " & ex.Message)
                    GoTo Out
                End Try
            End If
    Out:
            BtnSend.Enabled = True
        End Sub
        Private Sub BtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClose.Click
            Close()
        End Sub
    End Class
    Form1.Designer.vb
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class Form1
        Inherits System.Windows.Forms.Form
     
        'Form overrides dispose to clean up the component list.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
     
        'Required by the Windows Form Designer
        Private components As System.ComponentModel.IContainer
     
        'NOTE: The following procedure is required by the Windows Form Designer
        'It can be modified using the Windows Form Designer.  
        'Do not modify it using the code editor.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
            Me.TxtMsgIn = New System.Windows.Forms.TextBox()
            Me.Label2 = New System.Windows.Forms.Label()
            Me.TxtMsgOut = New System.Windows.Forms.TextBox()
            Me.Label4 = New System.Windows.Forms.Label()
            Me.RBXML = New System.Windows.Forms.RadioButton()
            Me.RBHTTPStandar = New System.Windows.Forms.RadioButton()
            Me.Label3 = New System.Windows.Forms.Label()
            Me.TxtURL = New System.Windows.Forms.TextBox()
            Me.Label1 = New System.Windows.Forms.Label()
            Me.Label5 = New System.Windows.Forms.Label()
            Me.TxtMsgSend = New System.Windows.Forms.TextBox()
            Me.BtnSend = New System.Windows.Forms.Button()
            Me.BtnClose = New System.Windows.Forms.Button()
            CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
            Me.SplitContainer1.Panel1.SuspendLayout()
            Me.SplitContainer1.Panel2.SuspendLayout()
            Me.SplitContainer1.SuspendLayout()
            Me.SuspendLayout()
            '
            'SplitContainer1
            '
            Me.SplitContainer1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.SplitContainer1.Location = New System.Drawing.Point(12, 12)
            Me.SplitContainer1.Name = "SplitContainer1"
            '
            'SplitContainer1.Panel1
            '
            Me.SplitContainer1.Panel1.Controls.Add(Me.TxtMsgIn)
            Me.SplitContainer1.Panel1.Controls.Add(Me.Label2)
            '
            'SplitContainer1.Panel2
            '
            Me.SplitContainer1.Panel2.Controls.Add(Me.TxtMsgOut)
            Me.SplitContainer1.Panel2.Controls.Add(Me.Label4)
            Me.SplitContainer1.Size = New System.Drawing.Size(662, 281)
            Me.SplitContainer1.SplitterDistance = 328
            Me.SplitContainer1.TabIndex = 14
            '
            'TxtMsgIn
            '
            Me.TxtMsgIn.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.TxtMsgIn.Location = New System.Drawing.Point(2, 22)
            Me.TxtMsgIn.Multiline = True
            Me.TxtMsgIn.Name = "TxtMsgIn"
            Me.TxtMsgIn.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
            Me.TxtMsgIn.Size = New System.Drawing.Size(324, 256)
            Me.TxtMsgIn.TabIndex = 13
            '
            'Label2
            '
            Me.Label2.AutoSize = True
            Me.Label2.Location = New System.Drawing.Point(3, 6)
            Me.Label2.Name = "Label2"
            Me.Label2.Size = New System.Drawing.Size(66, 13)
            Me.Label2.TabIndex = 6
            Me.Label2.Text = "Message In:"
            '
            'TxtMsgOut
            '
            Me.TxtMsgOut.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.TxtMsgOut.Location = New System.Drawing.Point(4, 22)
            Me.TxtMsgOut.Multiline = True
            Me.TxtMsgOut.Name = "TxtMsgOut"
            Me.TxtMsgOut.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
            Me.TxtMsgOut.Size = New System.Drawing.Size(322, 256)
            Me.TxtMsgOut.TabIndex = 14
            '
            'Label4
            '
            Me.Label4.AutoSize = True
            Me.Label4.Location = New System.Drawing.Point(3, 6)
            Me.Label4.Name = "Label4"
            Me.Label4.Size = New System.Drawing.Size(74, 13)
            Me.Label4.TabIndex = 13
            Me.Label4.Text = "Message Out:"
            '
            'RBXML
            '
            Me.RBXML.AutoSize = True
            Me.RBXML.Location = New System.Drawing.Point(170, 299)
            Me.RBXML.Name = "RBXML"
            Me.RBXML.Size = New System.Drawing.Size(44, 17)
            Me.RBXML.TabIndex = 17
            Me.RBXML.Text = "XML"
            Me.RBXML.UseVisualStyleBackColor = True
            '
            'RBHTTPStandar
            '
            Me.RBHTTPStandar.AutoSize = True
            Me.RBHTTPStandar.Checked = True
            Me.RBHTTPStandar.Location = New System.Drawing.Point(70, 299)
            Me.RBHTTPStandar.Name = "RBHTTPStandar"
            Me.RBHTTPStandar.Size = New System.Drawing.Size(97, 17)
            Me.RBHTTPStandar.TabIndex = 16
            Me.RBHTTPStandar.TabStop = True
            Me.RBHTTPStandar.Text = "HTTP Standard"
            Me.RBHTTPStandar.UseVisualStyleBackColor = True
            '
            'Label3
            '
            Me.Label3.AutoSize = True
            Me.Label3.Location = New System.Drawing.Point(15, 301)
            Me.Label3.Name = "Label3"
            Me.Label3.Size = New System.Drawing.Size(50, 13)
            Me.Label3.TabIndex = 15
            Me.Label3.Text = "Method :"
            '
            'TxtURL
            '
            Me.TxtURL.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.TxtURL.Location = New System.Drawing.Point(77, 322)
            Me.TxtURL.Name = "TxtURL"
            Me.TxtURL.Size = New System.Drawing.Size(597, 21)
            Me.TxtURL.TabIndex = 19
            '
            'Label1
            '
            Me.Label1.AutoSize = True
            Me.Label1.Location = New System.Drawing.Point(15, 325)
            Me.Label1.Name = "Label1"
            Me.Label1.Size = New System.Drawing.Size(33, 13)
            Me.Label1.TabIndex = 18
            Me.Label1.Text = "URL :"
            '
            'Label5
            '
            Me.Label5.AutoSize = True
            Me.Label5.Location = New System.Drawing.Point(15, 352)
            Me.Label5.Name = "Label5"
            Me.Label5.Size = New System.Drawing.Size(56, 13)
            Me.Label5.TabIndex = 20
            Me.Label5.Text = "Message :"
            '
            'TxtMsgSend
            '
            Me.TxtMsgSend.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
            Me.TxtMsgSend.Location = New System.Drawing.Point(77, 349)
            Me.TxtMsgSend.Multiline = True
            Me.TxtMsgSend.Name = "TxtMsgSend"
            Me.TxtMsgSend.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
            Me.TxtMsgSend.Size = New System.Drawing.Size(597, 103)
            Me.TxtMsgSend.TabIndex = 21
            '
            'BtnSend
            '
            Me.BtnSend.Anchor = System.Windows.Forms.AnchorStyles.Bottom
            Me.BtnSend.Location = New System.Drawing.Point(265, 459)
            Me.BtnSend.Name = "BtnSend"
            Me.BtnSend.Size = New System.Drawing.Size(75, 23)
            Me.BtnSend.TabIndex = 22
            Me.BtnSend.Text = "Send"
            Me.BtnSend.UseVisualStyleBackColor = True
            '
            'BtnClose
            '
            Me.BtnClose.Anchor = System.Windows.Forms.AnchorStyles.Bottom
            Me.BtnClose.Location = New System.Drawing.Point(346, 459)
            Me.BtnClose.Name = "BtnClose"
            Me.BtnClose.Size = New System.Drawing.Size(75, 23)
            Me.BtnClose.TabIndex = 23
            Me.BtnClose.Text = "Close"
            Me.BtnClose.UseVisualStyleBackColor = True
            '
            'Form1
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(686, 490)
            Me.Controls.Add(Me.BtnClose)
            Me.Controls.Add(Me.BtnSend)
            Me.Controls.Add(Me.TxtMsgSend)
            Me.Controls.Add(Me.Label5)
            Me.Controls.Add(Me.TxtURL)
            Me.Controls.Add(Me.Label1)
            Me.Controls.Add(Me.RBXML)
            Me.Controls.Add(Me.RBHTTPStandar)
            Me.Controls.Add(Me.Label3)
            Me.Controls.Add(Me.SplitContainer1)
            Me.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
            Me.Name = "Form1"
            Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
            Me.Text = "HTTP Server"
            Me.SplitContainer1.Panel1.ResumeLayout(False)
            Me.SplitContainer1.Panel1.PerformLayout()
            Me.SplitContainer1.Panel2.ResumeLayout(False)
            Me.SplitContainer1.Panel2.PerformLayout()
            CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).EndInit()
            Me.SplitContainer1.ResumeLayout(False)
            Me.ResumeLayout(False)
            Me.PerformLayout()
     
        End Sub
        Friend WithEvents SplitContainer1 As System.Windows.Forms.SplitContainer
        Friend WithEvents Label2 As System.Windows.Forms.Label
        Friend WithEvents Label4 As System.Windows.Forms.Label
        Friend WithEvents TxtMsgIn As System.Windows.Forms.TextBox
        Friend WithEvents TxtMsgOut As System.Windows.Forms.TextBox
        Friend WithEvents RBXML As System.Windows.Forms.RadioButton
        Friend WithEvents RBHTTPStandar As System.Windows.Forms.RadioButton
        Friend WithEvents Label3 As System.Windows.Forms.Label
        Friend WithEvents TxtURL As System.Windows.Forms.TextBox
        Friend WithEvents Label1 As System.Windows.Forms.Label
        Friend WithEvents Label5 As System.Windows.Forms.Label
        Friend WithEvents TxtMsgSend As System.Windows.Forms.TextBox
        Friend WithEvents BtnSend As System.Windows.Forms.Button
        Friend WithEvents BtnClose As System.Windows.Forms.Button
     
    End Class

    Avec ce petit programme de rien du tout, votre PC devient un serveur web.
    Tapez l'adresse IP de votre PC depuis un appareil branché sur votre réseau local et hop !
    Le programme en VB.NET reçoit les requêtes et génère la réponse.

    De quoi tester simplement des appareils "client HTTP" sur votre réseau local.

    Ce qui est génial c'est que ce programme qui transforme votre PC en server web ne bloque pas le PC, qui continue à aller sur Internet et à utiliser votre réseau local en même temps et normalement !

    On peut même interroger le serveur ainsi créé sur le PC... depuis le même PC (un serveur et un client peuvent avoir la même adresse IP, puisqu'ils utilisent deux ports différents)

    Ca ouvre encore d'autres possibilités intéressantes...

    Ca me rappelle quand j'étais gosse et que j'avais essayé de m'appeler moi-même au téléphone... ça sonne occupé ce qui est logique mais décevant j'aurais préféré que ça aboutisse à un larsen ou une reverb'

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 604
    Points : 56 720
    Points
    56 720
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Citation Envoyé par electroremy Voir le message
    Le plus simple dans ce cas de figure c'est que je mette au point mes clients Arduino avec un serveur "virtuel" qui tourne sur mon ordinateur.
    Après, j'aurais juste à "porter" le code de mon serveur virtuel sur l'Arduino serveur.
    Et comment vas-tu "porter" le code VB.Net sur l'Arduino ?

  6. #6
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Et comment vas-tu "porter" le code VB.Net sur l'Arduino ?
    En faisant la même chose avec le C++ Arduino, tout simplement...

    Très concrètement : je vais commencer par développer le code de mes Arduino Client HTTP, et en même temps je développe le code Visual Basic du serveur HTTP

    Une fois que tout fonctionne comme je le souhaite, il me reste à programmer l'Arduino Serveur HTTP pour qu'il fasse la même chose que mon code Visual Basic.

    Ce n'est pas très compliqué : mon code Visual Basic va juste analyser la requête (chaîne de caractère) et en fonction de celle-ci construire une réponse (une autre chaîne de caractère)
    L'Arduino Serveur fera pareil, avec un code C++ Arduino.
    L'Arduino Serveur fera aussi d'autres choses comme piloter des relais ou lire des capteurs.

    Dans mon code Visual Basic les relais seront remplacés par un affichage à l'écran, par exemple des cases à cocher. Les capteurs, ce sera des zones de texte ou des données générées aléatoirement.

    Il n'y a rien de compliqué la dedans...

    Le passage par Visual Basic c'est juste pour moi un confort qui m'évite développer en même temps et de mettre à jour l'un après l'autre successivement l'Arduino Client et l'Arduino Serveur.

    Cela a un intérêt car je suis très à l'aise en Visual Basic, et d'autre part cette façon de procéder est plus pratique.

    L'autre gros avantage de ma démarche c'est le débogage beaucoup plus facile du code sous Visual Basic.

    Car les Arduinos c'est quand même très emmerdant à mettre au point...
    Quand un programme Arduino ne fonctionne pas comme prévu, et qu'on ne comprend pas pourquoi, il faut prévoir un affichage ou bien utiliser le moniteur série, ce qui n'est pas toujours facile car :
    - les broches TX/RX sont déjà prises pour autre chose
    - l'affichage n'est pas bien grand et il est déjà utilisé par le programme à déboguer
    - la capacité mémoire de l'Arduino est réduite et je risque de ne pas avoir assez de mémoire pour ajouter les fonctions de débogage
    - les fonctions de débogage modifient le comportement du programme (notamment les timings, sans parler des collisions avec des ressources matérielles rares et partagées) et on arrive à devoir déboguer les fonctions de débogage et là on s'en sort pas

    De plus, sur Arduino, quand quelque chose ne marche pas :
    - ça peut être un bug dans le programme
    - ça peut être un problème matériel (faux contact, parasite, ...)
    - et parfois les deux en même temps

    Alors mettre au point en même temps l'Arduino Client et l'Arduino Serveur, c'est le cauchemar assuré, car lorsque ça ne fonctionne pas il faudra d'abord trouver lequel des deux est fautif... sachant qu'il y a la possibilité que les deux soient fautifs et en pratique il faudra travailler avec deux ordinateurs qui gèrent chacun le débogage d'un Arduino.
    Pour résumer c'est la meilleure façon de ne pas y arriver, ou d'en baver un max.

    Bref, je sais que vous n'avez pas l'air convaincus, mais le serveur émulé en Visual Basic va vraiment me simplifier les choses.
    Je vais pouvoir d'abord mettre tranquillement au point l'Arduino Client, et ensuite l'Arduino Serveur.
    Diviser pour régner, c'est bien connu.

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Pas convaincu en effet...

    il vous faudra récrire votre programme Visual Basic en C++ et comme il y aura des bugs (c’est pas le même langage) et tout ce que vous dites sur le debug va vous gêner de toutes façons, non ?

    Pourquoi ne pas mettre AsyncWebServer sur les Arduinos ? Ça gère pour vous toutes la partie web, extrait les paramètres des requêtes etc...

    PS:
    il faudra travailler avec deux ordinateurs qui gèrent chacun le débogage d'un Arduino.
    Rien ne vous empêche de prendre un programme terminal série et d’ouvrir deux fenêtres, une pour chaque arduino et son port série. (Certains lancent même deux fois l’IDE mais je trouve que c’est un risque pour le fichier de prefs partagées).

  8. #8
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par Jay M Voir le message
    il vous faudra récrire votre programme Visual Basic en C++ et comme il y aura des bugs (c’est pas le même langage) et tout ce que vous dites sur le debug va vous gêner de toutes façons, non ?
    D'abord, il est évident que je ne vais pas utiliser des fonctions spécifiques au VB.NET qui n'existent pas en C++
    Sinon, en effet, je vais avoir beaucoup de mal à transposer le programme
    Par exemple, je vais gérer les chaines de caractères en VB.NET comme on le fait sur Arduino avec des tableaux de longueur fixe.

    Oui il faudra déboguer le serveur, mais l'avantage de mon approche est que je n'aurais pas à déboguer en même temps l'Arduino Client et l'Arduino Serveur.

    Citation Envoyé par Jay M Voir le message
    Pourquoi ne pas mettre AsyncWebServer sur les Arduinos ? Ça gère pour vous toutes la partie web, extrait les paramètres des requêtes etc...
    Je note ça dans un coin... Je n'ai pas encore tranché entre :
    - Serveur Web + Client Web classique
    - WebSocket
    - AsyncWebServer

    Citation Envoyé par Jay M Voir le message
    PS:Rien ne vous empêche de prendre un programme terminal série et d’ouvrir deux fenêtres, une pour chaque arduino et son port série. (Certains lancent même deux fois l’IDE mais je trouve que c’est un risque pour le fichier de prefs partagées).
    J'ai deux problèmes avec le terminal série :
    - le code pour le gérer prend de la place et je risque d'être limité en ROM et en RAM
    - les broches TX et RS sont utilisées pour autre chose sur mes Arduinos
    Je vais devoir développer le client Arduino sans utiliser le terminal série

    VB.NET me permet d'avoir sur mon PC un ou plusieurs client web, et aussi un serveur web, dont je peux gérer le comportement comme je le souhaite, et accéder à l'ensemble des paramètres.
    En particulier, VB.NET me permet de simuler un client web ou un serveur web qui ne fonctionne pas bien :
    - envoi de données incomplètes
    - envoi de données incorrectes
    - envoi de trop de données
    - grosse lenteur
    cela me permet de voir si mes Arduinos ne plantent pas : détection d'erreur et/ou timeout qui permet à l'Arduino de ne pas tenir compte de ces données et de recommencer

    Bref cela va m'aider pour le développement de mes Arduinos.

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK - si vous voulez sentez plus à l'aise comme cela faut pas hésiter. Au moins vous maitrisez bien votre environnement ce qui est important pour le développement.

    Je suppose que vous ne pouvez pas faire autrement que d'utiliser Rx et Tx? C'est généralement pas conseillé car ça rend plus difficile le chargement du code, faut débrancher ce qui est connecté dessus pour éviter tout risque.

    Vous partiriez sur ESP32 ? (il y a quand même bcp de mémoire donc généralement on a la place pour les commandes de debug sans souci)

  10. #10
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par Jay M Voir le message
    OK - si vous voulez sentez plus à l'aise comme cela faut pas hésiter. Au moins vous maitrisez bien votre environnement ce qui est important pour le développement.
    Tout à fait, ma solution n'est pas universelle, elle est adapté à ce que je sais faire et à ce que j'ai besoin de faire.

    Citation Envoyé par Jay M Voir le message
    Je suppose que vous ne pouvez pas faire autrement que d'utiliser Rx et Tx? C'est généralement pas conseillé car ça rend plus difficile le chargement du code, faut débrancher ce qui est connecté dessus pour éviter tout risque.
    C'est une très bonne remarque... je n'ai rencontré aucun soucis
    J'utilise ces broches uniquement comme sorties pour piloter une partie de l'écran.
    Comme après le téléversement du programme l'Arduino fait un reset, et que l'écran à une broche reset câblée sur l'Arduino et gérée par la bibliothèque, le cafouillage éventuellement généré est annulé.
    D'ailleurs je crois que ce sont es broches SPI qui sont utilisées pour le téléversement aussi non ?

    C'est une chose à laquelle il faut porter attention : avec ces cartes les broches d'entrées/sorties ne sont pas en pratique toutes vraiment disponibles...

    Citation Envoyé par Jay M Voir le message
    Vous partiriez sur ESP32 ? (il y a quand même bcp de mémoire donc généralement on a la place pour les commandes de debug sans souci)
    Tout le monde me parle de cette carte, mais je vais rester sur Arduino pour les raisons suivantes :
    - il me faut de l'Ethernet, l'ESP32 fonctionne en Wifi (chez moi murs très épais, le Wifi a du mal à passer partout)
    - l'Arduino a assez de mémoire pour mon projet
    - l'Arduino accueille directement le shield Ethernet sans avoir besoin de câblage
    - l'Arduino accepte une alimentation comprise entre 7V à 12V, je peux donc fournir l'alimentation à tous mes Arduinos avec de longs câbles depuis un point central (en ajoutant éventuellement une résistance et un condensateur de découplage pour être tranquille) ; l'ESP demande une alimentation USB 5V, comme les Raspberry Pi donc il faudrait un bloc d'alimentation USB pour chaque carte c'est une contrainte bloquante pour mon projet (je souhaite gérer en central l'alimentation et l'extinction des modules)

    La aussi, ce choix est lié à mon projet, l'ESP32 est certainement mieux adapté à d'autres situations.

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK

    J'avais pas percuté pour l'arduino. Dans ce cas vous ne pourrez pas prendre la bibliothèque AsyncWebServer. Elle ne fonctionne que sur ESP.
    il vous faudra donc effectivement gérer le protocole "à la main" (ce n'est pas compliqué cela dit)

    (On peut bien sûr aussi connecter un module ethernet sur ESP mais j'ai crû comprendre que vous aviez déjà le matériel)


    ---
    PS
    Une Arduino Mega résoudrait le nombre de pin disponibles tout en laissant Serial disponible et en augmentant la mémoire pour le debug si c'est un souci. votre shield ethernet devrait pouvoir se brancher dessus.

    Pour un autre projet (puisque vous préférez enficher votre module ethernet c'est pas adapté ici)- si la place est un souci il existe maintenant des Arduino Mega de taille réduite (plus petits qu'un UNO).

    Nom : MEGA MINI.png
Affichages : 250
Taille : 649,9 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Logiciel pour simuler du Ladder
    Par Rodrigue dans le forum Automation
    Réponses: 4
    Dernier message: 10/12/2009, 10h33
  2. programme pour simuler un serveur dhcp
    Par franckywood dans le forum Linux
    Réponses: 2
    Dernier message: 02/04/2007, 06h42
  3. Un logiciel pour simuler Oracle ?
    Par developman dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2006, 00h03
  4. logiciel de simulation de serveur
    Par thesorrow dans le forum Administration
    Réponses: 1
    Dernier message: 21/11/2006, 15h25
  5. logiciel pour simuler un serveur Oracle
    Par semaj_james dans le forum Oracle
    Réponses: 9
    Dernier message: 06/05/2006, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo