Piloter à distance un serveur via sms

Contenu du snippet

Le code suivant illustre comment recevoir des SMS envoyes depuis des lignes SFR dans son serveur java via une simple servlet (http://www.commentcamarche.net/contents/servlets/servcarac.php3)

Le principe est simple, il suffit de
- declarer une servlet permettant une connexion avec de type POST : public void doPost(HttpServletRequest req, HttpServletResponse res).
- enregistrer l'url de cette servlet sur SFR API via la methode SetSubscriptionSMS pour qu'elle soit appelee à chaque SMS reçu (en integrant l'appel dans votre application ou en passant par l'API Test Tool : https://api.sfr.fr/index.php?q=apitesttool/)
- d'attribuer un numéro court a chaque ligne SFR souhaitant envoyer des SMS au serveur.

Ci-joint a cet article, le code du servlet permettant de récupérer le token du SMS recu puis son contenu.

Source / Exemple :


//Code invoque a la réception d'un SMS
//req recoit l'identifiant du SMS à récupérer
//La methode getMessageSMS permet de récupérer ce message au format json.
//Le token utilisé dans l'appel est fictif, vous devez vous inscrire sur SFR API pour en obtenir un gratuitement.

public void doPost(HttpServletRequest req, final HttpServletResponse resp) throws IOException {	
     resp.setContentType("text/plain");
		
	//La servlet recoit l'identifiant du SMS à récupérer. On doit utiliser cet identifiant avec
	//la methode getMessageSMS pour récupérer le contenu du SMS ainsi que l'expéditeur
	final String token=req.getParameter("token");
	if(token!=null){
		//La méthode RestCall est une classe facilitant les appels REST
		new RestCall("https://ws.red.sfr.fr/red-ws/red-b2c/resources/event/getMessageSMS?responseType=json&tokenMessage="+token,null){
			@Override public void onSuccess(String rep){				
			   try {
				JsonNode rootNode = new ObjectMapper().readValue(rep, JsonNode.class);		
				if(rootNode.has("messageSMS")){
					String number=rootNode.get("messageSMS").get("sourceMsisdn").getTextValue();
					String mes=rootNode.get("messageSMS").get("body").getTextValue().toLowerCase();
				}
			   }    
                            catch (JsonParseException e1) {e1.printStackTrace();}
			    catch (JsonMappingException e1) {e1.printStackTrace();}
			    catch (IOException e1) {e1.printStackTrace();};			
			   }
			};

			resp.setStatus(HttpServletResponse.SC_OK); //Reponse positive pour le serveur
		} else
			resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
}

//La classe RestCall permet de faire des appels à des web services via REST en utilisant le POST ou le GET
//Les méthodes onSuccess et onFailure peuvent être surchargée dans l'instance de RestCall pour mettre en place
//un traitement adapté
public class RestCall  {
	
	private String ExecuteRest(String urlServer,String params){	
			try {
				URL url = new URL(urlServer);
	            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	        
	            connection.setUseCaches(false);           
	                        
	            if(params!=null){
	            	connection.setDoOutput(true);
		            connection.setRequestProperty("Content-Length", ""+params.getBytes().length);
		            connection.setRequestMethod("POST");
		            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
		            writer.write(params);
		            writer.close();
	            } else 
	            	connection.setRequestMethod("GET");

	            // give it 15 seconds to respond
	            connection.setReadTimeout(15*1000);
	            connection.connect();

	            //Récuperation de la réponse
		        BufferedReader buffer=new BufferedReader(new InputStreamReader(connection.getInputStream()));
		        String line="";
				StringWriter writer=new StringWriter();
				while ( null!=(line=buffer.readLine()))writer.write(line);
		        
				int reponseCode=connection.getResponseCode();
		        if (reponseCode == HttpURLConnection.HTTP_OK) {     	
					if(reponseCode==200)					
						onSuccess(writer.toString());       		
					else 
						onFailure(reponseCode);
				
				return null;
		        }
			
	    } catch (MalformedURLException e) {
	        // ...
	    } catch (IOException e) {
	        // ...
	    }	
				
		return null;	
	}    
		  

	
	
	public RestCall(String url,String params) {				
		url+="&token=1ec47c60fbf1e21027bd71b6ed8bd8a2";
		this.ExecuteRest(url,params);
	}
	
	public void onSuccess(String rep) {};
	public void onFailure(int reponseCode) {}	
}

Conclusion :


Afin de simplifier l'envoi de SMS au serveur il est conseiller de
1. recuperer sur le serveur le numero du mobile expediteur (via une interface web ou un autre servlet)
2. de lui attribuer un numéro court en utilisant la méthode GetSMSShortCode de SFR API (voir la méthode generateSMSShortCode sur https://api.sfr.fr/api/sms#api-navtab)
3. de lui afficher se numéro ou de lui envoyer un SMS pour lui donner le numéro court attribué à votre application (voir la méthode SendSMS sur https://api.sfr.fr/api/sms#api-navtab)

Retrouver l'ensemble de la documentation sur https://api.sfr.fr/api/event#api-navtab

Herve Hoareau
Responsable developpement SFR API

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.