Sms receiver : recevoir des sms dans une applis dotnet (vb) via sfr api

Description

« SMS Receiver » déclenche des actions sur le poste Windows qui l'exécute en fonction du contenu des SMS qu'elle reçoit de la part de son utilisateur (qui doit obligatoirement possédé une ligne SFR)

A titre illustratif, 2 actions possibles sont implémentées :
- lancer internet explorer en fonction de l'url contenue dans le SMS si celui-ci commence par « url »
- Géolocaliser l'expéditeur du SMS puis afficher sa position sur google maps lorsque le SMS commence par « pos »

On peut imaginer de nombreuses autres actions déclenchées via les SMS non développée dans cet exemple comme
- L'enregistrement d'émission de TV,
- L'envoi de SMS à une liste de distribution,
- Le pilotage d'objets connectés,
- Etc

L'application se compose d'une librairie réutilisable pour invoquer les web services et d'une interface minimaliste comme démonstrateur.

La librairie : Module SFRAPITools

L'usage de SFR API repose sur une bibliothèque largement réutilisable pour d'autres projets simplifiant la mise en œuvre des principales méthodes telles que l'envoi et la réception de SMS, la géolocalisation, l'attribution d';un numéro court.

L'interface : Fichier frm

L'application repose sur une fenêtre unique utilisant un Timer pour consulter régulièrement l'arrivé d'un éventuel SMS, l'interpréter et déclencher une action éventuelle.
Lorsqu'on quitte l'application, l'utilisateur est informé que l'application ne recevra plus ses SMS.

Source / Exemple :


Module SFRAPITools

    'cette clé est une clé de démonstration des API SFR
    'si elle ne fonctionne plus il faut se créer un compte sur api.sfr.fr puis utiliser
    'sa propre clé obtenu dans l'API test tool (api.sfr.fr/apitesttool/)
    Const devkey = "1f2a294a9fcaf38b0e799f5177f4880d"

    'fonction générique d'appel des méthodes REST générées par l'api test tool retournant un xml
    'pour cette fonction il ne faut pas utiliser le format json
    Function SFRAPI(ByVal url As String) As XmlReader
        Dim sfrAPIService As New System.Net.WebClient

        'si la connexion se fait derrière un proxy
        'sfrAPIService.Proxy = New System.Net.WebProxy("adresse du proxy")
        'sfrAPIService.Proxy.Credentials = New Net.NetworkCredential("user", "password")

        Dim s As String = sfrAPIService.DownloadString(url)
        SFRAPI = XmlReader.Create(New System.IO.StringReader(s))
    End Function

    'réception de SMS entrant
    Function SMSEntrant(ByRef dest As String, ByRef message As String) As Integer
        Dim rc As XmlReader = SFRAPI("http://ws.red.sfr.fr/red-ws/red-b2c/resources/event/consume?responseType=xml&token=" + devkey)
        dest = ""
        Do While (rc.Read())
            If rc.NodeType = XmlNodeType.Element Then
                If rc.Name = "eventCode" Then
                    SMSEntrant = rc.ReadElementString()
                    If SMSEntrant = 11 Then
                        dest = rc.ReadElementContentAsString()
                        message = rc.ReadElementContentAsString()
                    Else
                        dest = "" : message = ""
                    End If
                End If
            End If
        Loop
    End Function

    'Géolocalisation réseau d'un numéro SFR
    Function GeoLoc(ByVal num As String, ByRef x As Single, ByRef y As Single, ByRef rayon As Single) As Integer
        Dim rc As XmlReader = SFRAPI("http://ws.red.sfr.fr/red-ws/red-b2c/resources/loc/localize?responseType=xml&token=" + devkey + "&userIdentifier=" + num + "&type=PhoneNumber")
        Do While (rc.Read())
            If rc.NodeType = XmlNodeType.Element Then
                Select Case rc.Name
                    Case "errorCode" : GeoLoc = rc.ReadElementString()
                    Case "longitude" : x = rc.ReadElementContentAsFloat : y = rc.ReadElementContentAsFloat() : rayon = rc.ReadElementContentAsFloat()
                End Select
            End If
        Loop
    End Function

    'Envoi de SMS à un client SFR
    Function sendSMS(ByVal num As String, ByVal mes As String) As Integer
        Dim rc As XmlReader = SFRAPI("http://ws.red.sfr.fr/red-ws/red-b2c/resources/sms/send?responseType=xml&token=" + devkey + "&to=" + num + "&type=PhoneNumber&msg=" + mes)
        Do While (rc.Read())
            If rc.NodeType = XmlNodeType.Element Then
                Select Case rc.Name
                    Case "errorCode" : sendSMS = rc.ReadElementString()
                End Select
            End If
        Loop
    End Function

    'Cette fonction permet d'obtenir un numéro court par utilisateur pour l'application 
    Function GetNum(ByVal num As String) As String
        Dim rc As XmlReader = SFRAPI("http://ws.red.sfr.fr/red-ws/red-b2c/resources/shortcode/generateSmsShortcode?responseType=xml&token=" + devkey + "&msisdn=" + num)
        Do While (rc.Read())
            If rc.NodeType = XmlNodeType.Element Then
                Select Case rc.Name
                    Case "shortcode" : GetNum = rc.ReadElementString() : Exit Function
                End Select
            End If
        Loop
    End Function
End Module

  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim dest As String = "", mes As String = ""
        If SMSEntrant(dest, mes) = 11 Then
            'On décide arbitrairement de limiter l'usage de l'appli a un numéro de ligne unique :
            If dest = txtGSM.Text Then
                Dim x As Single, y As Single, rayon As Single = 0
                Select Case Strings.Left(LCase(mes), 3)

                    Case "pos"
                        'si le SMS entrant commance par pos on géolocalise l'expéditeur et on affiche une carte
                        If GeoLoc(dest, x, y, rayon) = 0 Then ListBox1.Items.Insert(0, "Position=" & x & "," & y) : launchBrowser("http://maps.google.fr/maps?f=q&source=s_q&hl=fr&geocode=&q=" + Replace(CStr(y), ",", ".") + "," + Replace(CStr(x), ",", ".") + "&z=18")

                    Case "url"
                        'si le SMS entrant commence par url on lance un navigateur avec le contenu
                        Dim url As String = Replace(LCase(mes), "url ", "")
                        ListBox1.Items.Insert(0, "IE vers " & url)
                        launchBrowser(url)

                    Case Else
                        'dans tous les cas on affiche le contenu du message
                        ListBox1.Items.Insert(1, "commande inconnu" + mes)

                End Select
                ListBox1.Refresh()
            End If
        End If
    End Sub

Lorsque le numéro de l’utilisateur est modifié, il faut redemander un numéro court pour assurer la réception des SMS et notifier l’utilisateur du nouveau numéro à utiliser.

Private Sub txtGSM_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtGSM.TextChanged
        If Len(txtGSM.Text) <> 10 
            Timer1.Stop()
        Else
            'si l'on change de numéro de mobile, le propriétaire du mobile est informé qu'il peut
            'utiliser l'application
            If My.Settings("GSM") <> txtGSM.Text Then
                lblNumCourt.Text = GetNum(txtGSM.Text)

                'sendSMS(txtGSM.Text, "Répondez à ce SMS pour vous géolocaliser ou envoyer une URL")
                My.Settings("GSM") = txtGSM.Text
                My.Settings.Save()
                If Len(lblNumCourt.Text) = 4 Then Timer1.Start()
            End If
        End If
    End Sub

Pour finir, la fenêtre principale s&#8217;appui sur 2 événements et une fonction de lancement du navigateur web :

    'fonction générique de lancement d'internet explorer
    Public Function launchBrowser(ByVal url As String) As Boolean
        Dim chromeapp As Object
        chromeapp = CreateObject("InternetExplorer.Application")
        chromeapp.Visible = True
        chromeapp.Navigate(url)
        launchBrowser = True
    End Function

    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        If Len(My.Settings("GSM")) = 10 Then sendSMS(My.Settings("GSM"), "SMS Receiver est inactif.")
        Timer1.Stop()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        txtGSM.Text = My.Settings("GSM")
        If Len(txtGSM.Text) = 10 Then
            lblNumCourt.Text = GetNum(txtGSM.Text)
            sendSMS(txtGSM.Text, "SMS Receiver est actif")
        End If

        Timer1.Interval = 10000
        Timer1.Start()
    End Sub

Conclusion :


Remarques

pour des raisons de sécurité la géolocalisation d'une ligne nécessite le consentement explicite de cette ligne (via réponse par SMS ou en se connectant sur api.sfr.fr/acces)

Afin de conserver le numéro de téléphone utilisé d'une session à l'autre on utilise l'objet My.Settings. Cela nécessite l';intégration du paramètre GSM dans le fichier de configuration de l'application comme cela :

<userSettings>
<WindowsApplication1.My.MySettings>
<setting name="GSM" serializeAs="String">
<value></value>
</setting>
</WindowsApplication1.My.MySettings>
</userSettings>

Le choix d'une architecture REST, rend les API SFR compatibles avec l'ensemble des langages du marché. De nombreux exemples sont disponibles sur le site http://api.sfr.fr

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.