« 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’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
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.