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

VB.NET Discussion :

Simuler serveur web avec VB.NET


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut Simuler serveur web avec VB.NET
    Bonjour,

    Je vous écris pour un besoin très particulier...

    J'aimerais trouver comment simuler un serveur web avec VB.NET

    Des logiciels existent (Wamp64, EASYPHP, UWAMP, Caddy...) mais ils ne seront pas adaptés à ce que j'ai besoin de faire.

    Je suis en train de mettre au point un système domotique qui comporte :
    - des modules Arduino qui fonctionnent en client web, ces modules sont associés à un écran tactile TFT
    - un module Arduino "central" qui fonctionne en serveur web, ce module sera associé à des capteurs et des actionneurs
    Tout ce beau monde est relié ensemble avec des câbles Ethernet sur un routeur

    Ca va être très fastidieux, à chaque étape du développement, de mettre à jour l'Arduino client puis l'Arduino serveur

    C'est pour cela que je cherche à simuler un serveur web sur mon PC avec VB.NET
    Cela me permet de mettre au point le client Arduino, ensuite il me restera à porter mon code VB.NET sur l'Arduino serveur

    Les clients Arduino vont envoyer des requêtes HTTP au serveur avec des paramètres dans la requête après le caractère ? (comme le ferait un client web "normal" avec un formulaire)
    Le serveur Arduino, que je souhaite émuler en VB.NET pour la mise au point, va, en fonction de la requête, envoyer une page web au client.
    Les Arduino ont très peu de ressources : 32Ko de ROM, 2Ko de RAM... la page web sera minimale, avec juste les informations nécessaires.
    En revanche, si c'est un navigateur classique qui émet la requête (navigateur d'un PC ou d'un smartphone relié à mon réseau local), la page web envoyée sera une vraie page web avec un formulaire permettant à l'utilisateur de piloter le système

    L'Arduino utilisé en serveur est un modèle plus "puissant", doté de 256ko de ROM et 8ko de RAM, de quoi faire rêver les fan de tunning informatique

    Paradoxalement, c'est le client qui demandera le plus de travail de développement, car :
    - la gestion de l'écran tactile TFT est lourde
    - 2/3 de la ROM sont déjà occupé par les bibliothèques servant à gérer le module Ethernet, l'écran tactile et les routines d'initialisation
    Le code dans les Arduinos clients devra donc être soigneusement optimisé.
    L'Arduino utilisé en serveur n'a pas à gérer d'écran tactile et il possède beaucoup plus de ROM. Paradoxalement, le serveur aura moins de travail... Pourquoi donc avoir pris un Arduino plus puissant ? Tout simplement parce que le modèle plus puissant a aussi beaucoup plus de broches d'entrée/sorties et c'était nécessaire étant donné le nombre de relais bistables et de capteurs que je devrais piloter.
    C'est pour cela que je dois mettre au point d'abord les clients, le serveur s'adaptera.

    Il y a un petit problème : mon programme en VB.NET devra simuler un serveur qui devra être accessible avec une adresse IP depuis les appareils connectés sur mon réseau local...
    Il ne faut pas que le "serveur virtuel" fait en VB.NET soit accessible seulement sur l'ordinateur où il s'éxecute

    Je ne sais même pas si c'est faisable.

    A noter que mon PC est relié à un routeur 16 ports sur lequel seront reliés les Arduinos ; ce routeur est aussi relié à ma Freebox révolution.
    Mon PC et les Arduinos ont tous des IP fixes.
    La Freebox Revolution offre pas mal de réglages.

    Oui je sais, des demandes comme celles-là vous en voyez pas tous les jours

    Qu'en pensez-vous ?

    NB : j'ai posté un sujet sur le forum Arduino (https://www.developpez.net/forums/d2.../#post11586152), mais compte tenu de la nature de la demande il m'a semblé plus pertinent de faire un sujet ici également

    NB : Avec VB.NET, j'ai déjà simulé un client web pour me connecter à un Arduino NANO ESP Wifi :
    Code : 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
    Imports System.Net
    Public Class FrmPrincipale
        Private Sub But_Lancer_Click(sender As Object, e As EventArgs) Handles But_Lancer.Click
            Dim WB As MyWebClient
            Try
                WB = New MyWebClient
                WB.Headers.Add(Net.HttpRequestHeader.Accept, "text/html")
                WB.Headers.Add("user-agent", "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Safari/537.36")
                TxtResultat.Text = WB.DownloadString(TxtUrl.Text)
            Catch ex As Exception
                TxtResultat.Text = ex.ToString
            End Try
        End Sub
        'Explication donnée sur https://docs.microsoft.com/fr-fr/powerapps/developer/common-data-service/best-practices/business-logic/set-keepalive-false-interacting-external-hosts-plugin
        Friend Class MyWebClient
            Inherits WebClient
            Protected Overrides Function GetWebRequest(ByVal address As Uri) As WebRequest
                Dim req As HttpWebRequest = CType(MyBase.GetWebRequest(address), HttpWebRequest)
                req.KeepAlive = False
                Return req
            End Function
        End Class
    End Class

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Quand vous parlez de 2 Ko et 8 Ko de RAM, vous voulez pas plutôt parler de 2 Go ? Voir à la limite 2 Mo ?

    Car même MS-DOS ou Linux ne sont pas capables de tourner sur 2 Ko... Donc aucun Framework .NET non plus !

    Ensuite, je ne vois pas ce que va apporter votre "faux" serveur.
    Utilisez un vrai serveur, celui définitif, et ne coder en revanche de que du fake dessus (pas de gestion des capteurs, mais renvoi de listes données données, ou pages statiques en dur).

    Enfin, je suis surpris qu'avec aussi peu de ressources vous partiez :
    - sur un serveur WEB, alors qu'un serveur TCP/IP sera bien plus simple et léger
    - sur du HTML plutôt que des données, mises en forme sur le client (XML, JSON, ou même binaire)

    Et pour terminer, VB.NET ne me semble pas le choix le plus judicieux pour partir sur des ressources limitées. D'autres langages sont à mon sens plus adaptés : C++, PHP, etc. car ne nécessitent pas de Framework pour tourner ! Là, dans quelques KO de ROM, vous ne pouvez même pas installer .NET Core !

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Bonjour,

    Ce n'est pas une blague : un Arduino UNO a bien 32ko de ROM et 2ko de RAM

    C'est même beaucoup : mon 8051 n'a que 2ko de ROM et 128 octets de RAM, c'est un CPU 8 bits cadencé à 24Mhz - mais je me contente de 12Mhz, et même à cette vitesse je suis obligé de faire des pauses pour ralentir certaines fonctions
    Ces puces sont programmées en assembleur.
    Avec 2 ko de ROM et 128 octets de RAM on fait plein de choses !
    L'assembleur permet même d'adresser la RAM bit par bit... Si vous avez 8 variables booléenne dans un programme, vous n'avez besoin que d'un octet de RAM !
    Sur un PC un programme qui gère 8 variables booléenne utilise certainement 8 x 4 octets (en 32 bits) voire 8 x 8 octets (en 64 bits) quel gâchis !
    Certaines fonctions permettent de manipuler des quartets (4 bits), typiquement si vous manipulez des chiffres de 0 à 9 (affichage 7 segments) vous pouvez stocker deux chiffres par octet.
    Oui il y a très peu de mémoire sur un microcontrôleur mais on la gère au plus juste.
    L'assembleur a des instructions qui font plusieurs choses (par exemple : compare et saute à telle adresse si la valeur est supérieure à zéro) et qui ne consomment que 1, 2 ou 3 octets de code - adresse comprise (avantage d'avoir très peu de ROM et de RAM : les adresses des pointeurs tiennent sur un ou deux octets seulement) !
    Avec 2ko de ROM et 128 octets de RAM je gère un écran LCD de 2x16 caractères, un clavier matriciel, 8 entrées/sorties, il y a un programme avec un menu qui offre une douzaine de fonctions différentes (minuterie, chien de garde, analyseur logique, compteur d'événements, pilotage de moteurs pas à pas, compteur générateur code gray...)

    Avec l'informatique moderne on a "la folie des grandeurs" : le moindre programme occupe des dizaines de Mo de disque dur et de mémoire, parfois même il faut des Go.

    [MODE VIEUX CON ON]
    J'ai débuté l'informatique avec Amiga 1200 pourvu de 2 Mo de RAM et pour seul stockage de masse un lecteur de disquette basse densité de 720ko. Le CPU (Motorola 68020) était cadencé à 14MHz. Et c'était du luxe, mes amis avaient l'Amiga 500 avec seulement 512ko de RAM, pourvu d'un 68000 tournant à 7Mhz.
    Avec cet Amiga on faisait plein de choses, il y avait un système d'exploitation graphique multitâche (comme Windows) et de supers jeux vidéo meilleurs que sur la Super Nes (Famicon) ou la Mégadrive, et presque aussi bien que sur borne d'arcade. Mon Amiga était capable d'aller sur Internet (modem 56k ), de lire des CD-Rom via un boitier externe, de piloter une imprimante jet d'encre couleur sur port parallèle, de gérer une carte son stéréo 16 bits... L'Amiga pouvait gérer deux souris, deux joysticks, ou une souris + un joystick en même temps.
    Grâce à la commutation de palette lors du "temps mort" pendant le retour à la ligne d'un écran cathodique, on pouvait afficher 256 couleurs différentes pour chaque ligne d'écran. Donc de la qualité "photo"
    Je m'étais débrouillé pour faire tenir le système d'exploitation avec les pilotes et quelques utilitaires sur une seule disquette de 720ko. J'avais une ou deux disquettes pour chaque logiciel.
    Avant de m'en séparer je l'avais équipé d'une extension de mémoire de 4Mo et d'un disque dur de 40Mo, la ça ne rigolait plus, on pouvait afficher 65536 couleurs à l'écran sans commuter la palette, le système bootait en deux secondes...
    Les missions APOLLO ont emmené des hommes sur la Lune et les ont ramené sur terre avec un système informatique embarqué bien moins puissant.
    Alors Windows 10 qui bouffe 50Go de HDD et 2Go de RAM juste pour le système...
    [MODE VIEUX CON OFF]

    Je confirme que l'Arduino UNO, malgrès ses 32ko de ROM et 2ko de RAM arrive a faire tourner un serveur web et gérer un écran tactile TFT.
    Je l'ai fait, ça fonctionne
    Alors... il y a quand même une astuce :
    - le Shield Ethernet (la carte réseau branchée à l'Arduino) embarque un microcontrôleur spécialisé, pourvu de 32ko de mémoire tampon, qui gère la couche TCP/IP ; cette carte gère plein de choses et communique via une liaison série rapide avec l'Arduino qui a juste à envoyer des commandes
    - c'est pareil pour l'écran TFT et sa dalle tactile : les deux ont un microcontrôleur spécialisé et une mémoire RAM dédiée, et communiquent eux aussi via une liaison série rapide avec l'Arduino

    C'est de l'électronique : on associe toujours plusieurs composants et modules qui font chacun une tâche.

    Je comprends que cela étonne les "purs" informaticiens non habitués au monde de l'embarqué... Et aussi les jeunes informaticiens qui ont débuté sur des PC avec un processeur de plusieurs GHz, 1 To de HDD et 4 Go de Ram.

    Faites un petit tour ici pour voir le pouvoir de l'embarqué
    - https://herve-troadec.developpez.com...uino-partie-1/
    - https://www.developpez.net/forums/d2...s-arduino-uno/

    Du coup j'en reviens à ma question : faire un serveur web avec VB.NET ?

    Petite précision : VB.NET ne va pas tourner sur l'Arduino... je vais juste me servir de VB.NET pour émuler un serveur sur mon PC pendant le debuggage des Arduinos clients.

    A bientôt

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Je t'invites à télécharger l'émulateur Windows de ton Arduino chez ton fournisseur !

  5. #5
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Pourquoi ne pas tout simplement créer une machine virtuelle sur ton PC et installer un Windows serveur 2016 par exemple en tant qu'OS de VM ?
    Il faudrait au préalable choisir ton environnement de virtualisation (VirtualBox, VMWare workstation....)
    Grâce aux snapshots de la VM (serveur) il serait possible de revenir un un état système lors de tes tests ou debug..... Tu y gagnerais en debogage avant mise en prod.
    Ensuite il faudra peut-être paramétrer un VSwitch (switch virtuel) dépendant de ta configuration réseau....(que j'ignore du fait).

    A voir......

    Si tu veux + d'infos n'hésites pas

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Bonjour,

    J'ai trouvé exactement ce dont j'avais besoin ici :



    Un programme VB.NET avec juste une fenêtre ; l'URL du serveur est celle de mon PC mais avec un port :1212

    Quand je tape cette URL avec ou non des paramètres, le programme VB.NET reçoit la requête et l'affiche, puis génère une réponse (page web) envoyée au client qui a émis la requête
    Dans le code VB.NET je peux facilement envoyer la réponse que je veux en fonction de la requête reçue. C'est exactement ce que j'ai besoin de faire.

    Simple et efficace !

    Voici le code puis le form designer de la fenêtre :

    Code : 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
    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
            prefixes(0) = "http://*:1212/topup/"
     
            '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
     
            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", ".")
     
                        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
    Code : 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
    Encore mieux :

    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prefixes(0) = "http://*:1212/topup/"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prefixes(0) = "http://*:80/"
    Et l'adresse IP de mon PC sur mon réseau local se comporte comme celle d'une page web.

    Ce genre de petit programme peut se montrer extrêmement utile

    A+

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    [mode vieux con aussi]
    J'ai commencé avec un Commodore 64, qui comme son nom l'indique, n'avait que 64 Ko de mémoire, donc même si depuis je n'ai jamais programmé d'embarqué, je sais très bien qu'avec un 386, 1 Mo de RAM et 80 Mo de HDD on pouvait faire à l'époque bien plus que ce qu'on peut faire avec le dernier iPhone qui est 1 milliard de fois plus puissant... au détail près de la résolution d'affichage, car de toute façon 1 simple image 4k aurait rempli le disque dur
    [/mode vieux con aussi]

    Mon étonnement concernait le serveur web codé en VB.NET capable de tourner dans 8 Ko de RAM... mais avec ton explication, oui, je comprends mieux : l'Arduino n'est que client.

    Cependant, je maintiens ce que j'ai dit plus haut :
    1/ Pourquoi écrire votre propre serveur en VB.NET (développement jetable qui plus est) quand un "vrai" serveur web (Apache, IIS, nginx, etc.) peut faire l'affaire, et délivrer soit des pages statiques (avec de l'url rewritting par exemple) soit des pages dynamiques codées en PHP ou ASP par exemple, qui sont plus simples que du VB.NET "sur mesure" qui va vite montrer ses limites
    2/ Pourquoi s'encombrer avec une couche HTTP (+ html tant qu'on y est) quand une communication TCP me semble parfaitement suffisante, au vu de la description du besoin (économie de lib + données de travail côté client)

    PS : Pour rappel, votre PC sous Windows, quelle que soit la version (sauf Windows 3.11 et antérieurs, mais là on peut plus rien pour vous ) sont dotés de IIS en natif (il suffit de l'activer dans les fonctionnalités). Sous Windows 95, 98 et ME ça s'appelait PWS (personal web server, mais sur toutes les autres versions, que ce soit Home, Desktop, Server, NT ou non, une version IIS complète est inclue).

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Bonjour,

    aussi surprenant que cela peut être, dans mon projet il y aura également un Arduino Serveur, et malgré les faibles ressources, ça fonctionne !

    Pourquoi s'encombrer avec une couche HTTP + HTML ? Cette remarque est pertinente
    - d'abord, cette couche n'est pas si lourde que ça, et les fonctions incluses dans le Shield Ethernet simplifient beaucoup les choses (en fait le code serait à peine plus léger si on utilisait pas HTTP et HTML)
    - ensuite, dans le projet final, les Arduino ne feront pas que communiquer entre eux ; ils pourront communiquer avec un smartphone utilisé en "télécommande wifi" sur le réseau local, via le navigateur web du smartphone. De même, un PC connecté au réseau local pourra interagir via une interface web.

    Du coup, l'avantage du HTTP et de l'HTML c'est le caractère universel et versatile de la communication : non seulement les Arduinos communiquent entre eux mais ils peuvent en plus communiquer avec un Smartphone, un PC, ... sans devoir à développer et à installer un logiciel spécifique pour Smartphone ou pour Ordinateur.
    Un navigateur web capable d'afficher une page HTML avec un formulaire est, en quelque sorte, un sous-système d'exploitation universel disponible sur de nombreux équipements.

    Ce projet est dans ma tête depuis bien longtemps... au début aussi j'ai pensé utiliser quelque chose de plus optimisé et de plus minimaliste :
    - bus CAN
    - bus RS485
    - Ethernet mais juste en TCP/IP
    - Voir même mon propre bus géré directement en assembleur
    Mais après étude, ces solutions se sont révélées paradoxalement à la fois plus limitées, plus difficiles et plus chères à mettre en oeuvre.
    Pour interfacer un smartphone ou un ordinateur, j'aurais eu besoin d'un module serveur Wifi / bus CAN en interface...
    Ou alors, de recourir à des modules infra-rouge pour utiliser une télécommande...

    Avec l’avènement des objets connectés, la communication client/serveur web est devenue un standards très utilisés et beaucoup de produits électroniques munis des firmware et bibliothèque adéquats ont été fabriqués...

    La situation aurait été différente si j'avais du tout développer de A à Z.

    Dans ce type de projet il ne faut surtout pas réinventer la roue.

    Pour le moment j'ai juste eu besoin de raccorder ensemble des éléments du commerce :
    - carte Arduino
    - Shield Arduino Ethernet SPI
    - ecran TFT tactile SPI avec un adaptateur 5V/3,3V
    - câbles RJ45
    - Router

    Ensuite, avec des libraires toutes faites (pour l'écran TFT, pour la dalle tactile, pour le shield Ethernet) et en adaptant les exemples de code source fournis, j'ai réussi :
    - à faire fonctionner un Arduino en server web
    - à faire fonctionner un Arduino en client web

    J'en ai un peu bavé pour faire fonctionner ensemble le Shield Ethernet et l'écran TFT... mais j'y suis arrivé.
    Sachant que j'ai découvert l'Arduino il y a trois mois à peine
    L'écosystème Arduino a ses défauts mais il faut reconnaître que les cartes et les accessoires disponibles, ainsi que les librairies qui vont avec, simplifient considérablement le travail du concepteur.

    Il reste à faire mon application.
    Il y a du travail car je dois concevoir les "pages" qui vont s’afficher sur l'écran TFT, articuler les menus, trouver la bonne ergonomie, concevoir le circuit électronique qui va piloter mes actionneurs et mes capteurs et le code qui va avec...
    Mais grâce aux librairies et aux modules du commerce 90% du boulot est déjà fait.

    A bientôt

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

Discussions similaires

  1. créer deux serveur web avec un seul adresse ip?
    Par Djo00 dans le forum Apache
    Réponses: 3
    Dernier message: 23/08/2006, 09h13
  2. Petit serveur Web avec du PHP
    Par olive_le_malin dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 10
    Dernier message: 08/05/2006, 20h08
  3. [SQL-Server] Quel serveur Web avec SQL Server ?
    Par wolflinger dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/03/2006, 09h15
  4. Réponses: 7
    Dernier message: 03/12/2004, 11h26

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