jcheype / NabAlive

Nabaztag server based on Netty
http://www.nabalive.com
63 stars 10 forks source link

Gestion Services du Nabaztag #5

Open Hector47 opened 12 years ago

Hector47 commented 12 years ago

Petite esquisse des modifications à faire pour ajouter la gestion des services (Météo, Trafic, Notification email, Qualité de l'air, Taïchi...)

0) Ajouter au model Nabaztag un champ par service ou une liste des services activé (Oreil Gauche et Droite étant au moins toujours activés) (je pense que le système de liste des services activé est plus simple a mettre en place, après je ne sais pas en ce qui concerne l'optimisation des requêtes vers la BD quand on veux ajouter ou supprimer un service...)

1) Reecrire l'envoi des services lors de la connexion

Pour le service awake/sleep on se base sur les horaire de levée et couchee du lapin donc soit on l'implemente dans la liste des service obligatoires (avec les oreilles) et on le reset (selon si il doit dormir ou pas à cette heure) à la connexion du lapin soit on l'oublie completemment et on check juste a la connextion si il doit etre endormi ou reveiller

(la premiere solution permetrer d'avoir accès rapide a l'etat du lapin depuis l'api)

(la deuxiemme solution est plus simple a faire mais ce serrai cool de savoir si le lapin dort depuis api (via le statut jabber)) (la deuxiemme solution est pour moi la meilleure car on evite de ce retouver avec l'info sur l'etat du nabaztag à deux endroits dans le serveur)

//On rajoute le DAO pour recuper le Lapin (si lapin inconnu on revoi le packet par default ou packet defini (en fonction ))
try{
    nabaztag = checkNotNull(nabaztagDAO.findOne("macAddress", mac));
}catch(NullPointerException e){
    String reply = "<iq from='net.violet.platform@xmpp.nabaztag.com/sources'" +
                    "to='" + from + "' id='" + id + "' type='result'>" +
                    "<query xmlns='violet:iq:sources'>" +
                    "<packet xmlns='violet:packet' format='1.0' ttl='604800'>fwQAAAx////+BAAFAA7/CAALAAABAP8=</packet>" +
                    "</query>" +
                    "</iq>";

    write(e.getChannel(), reply);
}
//on recuper les services du lapin

Iterator<ServiceConfig> iterator = nabaztag.getServicesConfigList().iterator();
AmbientPacket packet = new AmbientPacket();
//je ne sais pas si il faut passe a zero les service non utilisee ou on peux juste les sauter
while (iterator.hasNext()) {
    ServiceConfig next = iterator.next();
    packet.add(next.name,next.value);        
}
//on ajoute le packet sur l'etat dodo/awaike
packet.add(AmbientPacket.SleepStatus,Nabaztag.MAGIE.GetSleepStatus()); //GetSleepStatus revois 00 

//on envoi le packet
String reply = "<iq from='net.violet.platform@xmpp.nabaztag.com/sources'" +
    "to='" + from + "' id='" + id + "' type='result'>" +
    "<query xmlns='violet:iq:sources'>" +
        "<packet xmlns='violet:packet' format='1.0' ttl='604800'>" + packet.getBase64() + "</packet>" +
        "</query>" +
        "</iq>";

write(e.getChannel(), reply);

2) on ajout l'api de gestion des services (pour que les app externe puissent les configuer)

il est plus simple de garder cette api en get pour simplifier le travail des apps externe.

//Je ne sais pas comment passer pluieurs couples en parametres ici max un parametreage de service
.get(new Route("/nabaztags/:apikey/configservices") {
    @Override
    public void handle(Request request, Response response, Map<String, String> map) throws Exception {
        String apikey = checkNotNull(map.get("apikey"));
        Nabaztag nabaztag = checkNotNull(nabaztagDAO.findOne("apikey", apikey));

        String serviceID= checkNotNull(request.getParam("serviceID"));
        String ServiceValue = checkNotNull(request.getParam("ServiceValue"));
        nabaztag.MAGIE.UpdateServiceList(serviceID,ServiceValue);
        AmbientPacket packet = new AmbientPacket();
        packet.add(Integer.parseInt(serviceID), Integer.parseInt(ServiceValue));

        response.writeJSON("ok");
    }
})

OU

//ici on passe tout ceux que l'on veut metre a jour (à -1 pour desactiver le service) //plus simple a utiliser 
.get(new Route("/nabaztags/:apikey/configservices") {
@Override
    public void handle(Request request, Response response, Map<String, String> map) throws Exception {
        String apikey = checkNotNull(map.get("apikey"));
        Nabaztag nabaztag = checkNotNull(nabaztagDAO.findOne("apikey", apikey));

        String Service_Weather = request.getParam("1");
        String Service_StockMarket = request.getParam("2");
        String Service_Periph = request.getParam("3");
        String MoveLeftEar = request.getParam("4");
        String MoveRightEar = request.getParam("5");
        String Service_EMail = request.getParam("6");
        String Service_AirQuality = request.getParam("7");
        String Service_Nose = request.getParam("8");
        String Service_BottomLed = request.getParam("9");
        //String Service_Asleep = request.getParam("10"); //on ne peux pas l'utiliser comme ca ?
        String Service_TaiChi = request.getParam("14");

        AmbientPacket packet = new AmbientPacket();
        if (Service_Weather != null) {
            nabaztag.MAGIE.UpdateServiceList(AmbientPacket.Service_Weather,Service_Weather);
            if(Integer.parseInt(Service_Weather) == -1){
                packet.add(AmbientPacket.Disable_Service, AmbientPacket.Service_Weather);
            }else{
                packet.add(AmbientPacket.Service_Weather, Integer.parseInt(Service_Weather));
            }
        }
        //... on repete ca pour tous les service

        //on envoi le packet final 
        messageService.sendMessage(nabaztag.getMacAddress(), packet);
        response.writeJSON("ok");
    }
})

3) on ajoute dans l'api une facon de recuperer les valeurs des services (recuperer les positions des oreilles, dernier etat (endormi, reveiller) ) avec seulement l'apikey du lapin

//il faudrai ajouter ici l'état du lapin depuis jabber) si non dispo dans la liste des services
get(new Route("/nabaztags/:apikey/services") {
    @Override
    public void handle(Request request, Response response, Map<String, String> map) throws Exception {
        ...

    }
})

3 Bis) Ajouter les valeurs des services dans les api existantes comme /nabaztags et /nabaztags/:mac (je ne sais pas si le DAO les recupere automatiquement)

4) mettre à jour les api pour updater les services ()

nabaztag.MAGIE.UpdateServiceList(AmbientPacket.MoveLeftEar ,Integer.parseInt(posleft));

5) Fin :)

Bon je pense que le plus dur à faire et optimiser sont les fonction MAGIE GetSleepStatus et UpdateServiceList Bien sur ce n'est que mon idée de comment faire et il doit y avoir d'autres beaucoup plus optimisée.

Julien, merci pour tout ton travail pour nos lapins :)

jcheype commented 12 years ago

Merci pour tout ton boulot, je verrai demain pour ajouter tes modifs, sinon n'hésite pas à cloner et me faire des pull request

Hector47 commented 12 years ago

ce n'est qu'une ébauche :( il n'y a aucun code de fonctionnel mais c'est pour donner une idée de comment le faire.

Hector47 commented 12 years ago

Et puis il y a les deux fonctions "Magique" GetSleepStatus et UpdateServiceList à coder et à optimiser. La première est appelé à chaque connexion d'un lapin : elle va recuperer les heures où doit dormir le lapin fait les calcul et renvoi si il doit dormir ou pas. La deuxième doit mettre à jours la liste des services activé et est donc appeler par exemple à chaque changement de position des oreilles (par l'utilisateur ou par l'api) ou a chaque fois que les valeurs d'un service change.

Donc je ne sais pas si ça ne risque pas de surcharger le serveur :(

jcheype commented 12 years ago

normalement tu as :

checkSleep(){}

dans ConnectionWelcome

qui gère (ou pas) si le lapin doit dormir, il y a surement une correction à faire car pour certain il semble y avoir un bug