/**
* Classe ClientX10
*
* Classe pour l'envoi de commandes X10 au ServeurX10 via un socket en transmettant un objet de type DataX10.
*
* Client en ligne de commande
*
* Ces paramètres sont passés au programme BottleRocket (pour l'utilitaire br) via le ServeurX10
*
* La syntaxe de la commande ClientX10 sera :
*
* java ClientX10 [-u Utilitaire] [-hc House_Code] [-kc Key_Code] [-cc Command_Code] [-o Options] [-i ID] [-p Mot_Passe]
* [-as IP_Serveur] [-ps Port_Serveur] [-ac IP_Client] [-pc Port_Client]
*
* Où :
*
* Utilitaire = br,uc, rf ou pl. br --> BottleRocket, uc --> microcontrôleur et Firecracker (à venir...)
* rf --> Interface RF (à venir...) et pl --> Interface à courant porteur (à venir...)
* House_Code = A-P
* Key_Code = 1-16
* Command_Code = ON, OFF, DIM, BRIGHT, ALL_ON, ALL_OFF,
* LAMPS_ON ou LAMPS_OFF
* Options = Toutes les options possibles de l'utilitaire BottleRocket.
* ID = numéro de l'utilisateur (à venir)
* Mot_Passe=Mot de passe de l'utilisateur (à venir)
* IP_Serveur : Adresse IP du serveur
* Port_Serveur : Port de communication pour le serveur
* IP_Client : Adresse IP du client (à venir)
* Port_Client : Port de communication pour le client (à venir)
*
*
*
* Par exemple :
*
* java ClientX10 -u br -hc A -kc 1 -cc ON -o "--repeat=5 -v" -as 192.219.68.30 -ps 2222
*
* java ClientX10 -u br -hc A -cc ALL_ON -as 192.219.68.30 -ap 2222
*
* java ClientX10 -u br -o "--house=A --on=1 --repeat=5 -v" -as 192.219.68.30 -ap 2222
*
* Gestion de l'information 247-616-SH
* Hiver 2014
*
* @author Jordan Careau-Beaulieu
* @version Feb 3 2014
*/
import java.io.*;
import java.net.*;
import DataX10.*;
public class ClientX10
{
Socket _sClient;
DataX10 _dx10;
String _sConnError = "";
public static void main(String[] sArgs)
{
DataX10 dx10 = new DataX10();
// S'il a eu une erreur dans le parsing on affiche la syntaxe
if((parseArguments(sArgs, dx10)) == 1)
{
printSyntax();
}
printDataX10(dx10);
ClientX10 client = new ClientX10(dx10);
}
/* Constructeur de l'objet ClientX10
* @param dx10Commande objet dataX10 qui contient les informations
* comme l'addresse du serveur, le port, l'utilitaire, le house code, etc.
*/
public ClientX10(DataX10 dx10Commande)
{
_dx10 = dx10Commande;
try {
// Objet Socket pour établir la connexion au miniserveur
_sClient = new Socket(_dx10.getIPAdressServer(),
_dx10.getPortServer());
// Requête vers le serveur... (flux de données)
OutputStream osOut = _sClient.getOutputStream();
ObjectOutputStream oosOut = new ObjectOutputStream(osOut);
oosOut.writeObject(_dx10);
// Reception de la réponse du serveur... (flux de données)
InputStream isIn = _sClient.getInputStream();
ObjectInputStream oisIn = new ObjectInputStream(isIn);
//DataX10 dx10Reponse = new DataX10();
_dx10 = (DataX10) oisIn.readObject();
System.out.println("Réponse: \n" + _dx10.getMessage());
// Fermeture des objets de flux de données
oosOut.close();
osOut.close();
oisIn.close();
isIn.close();
// Si tout s'est déroulé correctement on indique qu'il n'y a pas eu d'erreurs
_sConnError = "";
}
catch (UnknownHostException e)
{
// Nom ou adresse du miniserveur inexistant
System.out.println(e.toString());
// Si il y a eu une erreur on l'indique
_sConnError = "Serveur non-valide\n";
}
catch (IOException e) {
// Problème de communication réseau
System.out.println(e.toString());
_sConnError = "Problème de communication\n";
}
catch (SecurityException e) {
// Problème de sécurité (si cela est géré...)
System.out.println(e.toString());
_sConnError = "Problème de sécurité\n";
}
catch (ClassNotFoundException e) {
// Objet indéfinie pour la sérialisation...
System.out.println(e.toString());
}
catch (Exception e) {
// Autre erreur...
System.out.println(e.toString());
_sConnError = "Problème inconnu\n";
}
}
/* Méthode pour obtenir l'objet dataX10 de la classe
* @returns L'objet dataX10
*/
public DataX10 getDX10()
{
return _dx10;
}
/* Méthode qui retourne la string d'erreur du clientX10
* @returns String Message d'erreur
*/
public String getErrorStr()
{
return _sConnError;
}
/* Méthode qui traite les arguments reçus de la ligne de commande et
* qui construit l'objet dataX10 en fonction de ces commandes.
* @param sArgs Tableau de strings contenant les arguments de la ligne de commande
* @param dx10 Objet dataX10 qui sera utilisé pour établir la connexion et
* qui sera envoyé au serveur.
*/
public static int parseArguments(String[] sArgs, DataX10 dx10)
{
int returnValue = 0;
// S'il n'y a pas d'arguments on retourne une erreur
if(sArgs.length == 0)
returnValue = 1;
// Boucle tant que tous les éléments ont été traitées
for(int i = 0; i < sArgs.length; i++) {
// Si l'argument est l'utilitaire
if(sArgs[i].equals("-u"))
{
// Si l'argument est valide on le place dans l'objet
if( (sArgs[i+1].equals("br")) || (sArgs[i+1].equals("uc"))
|| (sArgs[i+1].equals("rf"))
|| (sArgs[i+1].equals("pl")) )
{
dx10.setUtilitaire(sArgs[i+1]);
}
// Si le choix n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
break;
}
// Si l'argument est le house code
else if(sArgs[i].equals("-hc"))
{
// Si le house code est de A-P et n'est qu'un caractere
// on le place dans l'objet
if( (sArgs[i+1].matches("[A-P+]")) &&
(sArgs[i+1].length() == 1) )
{
dx10.setHouseCode(sArgs[i+1]);
}
// Si le choix n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
break;
}
// Si l'argument est le key code
else if(sArgs[i].equals("-kc"))
{
// si le keycode est entre 1 et 16 on le place dans l'objet
try
{
int iKc = Integer.parseInt(sArgs[i+1]);
if( (iKc >= 1) && (iKc <= 16) )
{
dx10.setKeyCode(sArgs[i+1]);
}
// Si le choix n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
}
// Si la string ne peut etre convertie en int
catch(Exception e)
{
System.out.println(e.toString());
returnValue = 1;
}
break;
}
// Si l'argument est le command code
else if(sArgs[i].equals("-cc"))
{
// Si le command code est valide on le place dans l'objet
if( (sArgs[i+1].equals("ON")) || (sArgs[i+1].equals("OFF"))
|| (sArgs[i+1].equals("DIM"))
|| (sArgs[i+1].equals("BRIGHT"))
|| (sArgs[i+1].equals("ALL_ON"))
|| (sArgs[i+1].equals("ALL_OFF"))
|| (sArgs[i+1].equals("LAMPS_ON"))
|| (sArgs[i+1].equals("LAMPS_OFF")) )
{
dx10.setCommandCode(sArgs[i+1]);
}
// Si le choix n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
break;
}
// Si l'argument est celui des options
else if(sArgs[i].equals("-o"))
{
dx10.setOptions(sArgs[i+1]);
break;
}
// Si l'Argument est celui de l'ID
else if(sArgs[i].equals("-i"))
{
try
{
int iID = Integer.parseInt(sArgs[i+1]);
dx10.setID(iID);
}
// Si la string ne peut etre convertie en int
catch(Exception e)
{
System.out.println(e.toString());
returnValue = 1;
}
break;
}
// Si l'argument est celui du mot de passe
else if(sArgs[i].equals("-p"))
{
dx10.setPassword(sArgs[i+1]);
break;
}
// Si l'argument est celui de l'ip du serveur
else if(sArgs[i].equals("-as"))
{
dx10.setIPAdressServer(sArgs[i+1]);
break;
}
// Si l'argument est le port du serveur
else if(sArgs[i].equals("-ps"))
{
try
{
// Convertis la string in int
int iPort = Integer.parseInt(sArgs[i+1]);
// Si le port est valide on le place dans l'objet
if( (iPort >= 1) && (iPort <= 65535) )
{
dx10.setPortServer(iPort);
}
// Si le port n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
}
// Si la string ne peut etre convertie en int
catch(Exception e)
{
System.out.println(e.toString());
returnValue = 1;
}
break;
}
// Si l'argument est celui de l'ip du client
else if(sArgs[i].equals("-ac"))
{
dx10.setIPAdressClient(sArgs[i+1]);
break;
}
// Si l'argument est celui du port du client
else if(sArgs[i].equals("-pc"))
{
try
{
// Convertis la string in int
int iPort = Integer.parseInt(sArgs[i+1]);
// Si le port est valide on le place dans l'objet
if( (iPort >= 1) && (iPort <= 65535) )
{
dx10.setPortClient(iPort);
}
// Si le port n'est pas valide on retourne une erreur
else
{
returnValue = 1;
}
}
// Si la string ne peut etre convertie en int
catch(Exception e)
{
System.out.println(e.toString());
returnValue = 1;
}
break;
}
}
if(dx10.getOptions() == null)
{
dx10.setOptions("");
}
return returnValue;
}
/* Méthode qui écrit la syntaxe à utiliser pour le mode ligne de commande
*/
public static void printSyntax()
{
String sSyntax = "java ClientX10 [-u Utilitaire] [-hc House_Code] \n"
+ " [-kc Key_Code] [-cc Command_Code] [-o Options] [-i ID]\n"
+ " [-p Mot_Passe] [-as IP_Serveur] [-ps Port_Serveur]\n"
+ " [-ac IP_Client] [-pc Port_Client]";
System.out.println("Syntaxe a utiliser:");
System.out.println(sSyntax);
}
/* Méthode qui affiche le contenu d'un objet DataX10
*/
public static void printDataX10(DataX10 dx10)
{
System.out.println("DataX10");
System.out.println("-u = " + dx10.getUtilitaire());
System.out.println("-hc = " + dx10.getHouseCode());
System.out.println("-kc = " + dx10.getKeyCode());
System.out.println("-cc = " + dx10.getCommandCode());
System.out.println("-o = " + dx10.getOptions());
System.out.println("-iID = " + dx10.getID());
System.out.println("-p = " + dx10.getPassword());
System.out.println("-as = " + dx10.getIPAdressServer());
System.out.println("-ps = " + dx10.getPortServer());
System.out.println("-ac = " + dx10.getIPAdressClient());
System.out.println("-pc = " + dx10.getPortServer());
}
}