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

Soyez le premier à donner votre avis sur cette source.

Vue 12 575 fois - Téléchargée 1 195 fois

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

Ajouter un commentaire Commentaires
Messages postés
15
Date d'inscription
lundi 1 septembre 2003
Statut
Membre
Dernière intervention
11 octobre 2011

lorsqu'on s'inscrit sur SFR API, SFR crédite gratuitement 7000 jetons sur le compte. chaque envoi de SMS (appel au web service d'envoi de SMS), enlève 52 jetons. Lorsqu'on arrive à 0, il faut acheter des jetons au prix de 0.1 centimes le jeton.

en revanche, le web service principale de cet appli, à savoir la récupération de SMS est gratuit (ne consomme pas de jeton).

L'inscription n'est pas nécéssaire pour télécharger le kit, elle est nécessaire pour pouvoir utiliser les Web service (idem Google, Facebook, etc ...)
Messages postés
257
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
22 décembre 2012
1
bonjour

je n'ai pas regardé ton projet car je me pose une question, l'envoi des SMS est il gratuit ?

deuxio le téléchargement du kit est soumis à une inscription auprès de SFR pourquoi puisque le kit est gratuit ?

Sinon c'est intéressant comme possibilité d'intégrer ce genre de fonctions à une application.

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.