Differences

This shows you the differences between two versions of the page.

Link to this comparison view

fr:protocole_tcp [2016/01/13 20:28] (current)
Line 1: Line 1:
 +====== Protocole Client/​Serveur ======
  
 +===== Introduction =====
 +
 +La centrale Calaos permet le contrôle et la récupération d'​information de la maison au travers d'un protocole en ligne de commande simple par TCP/IP. La centrale permet les connections sur un port spécifique et peut être utilisé pour le débugage avec l'​utilitaire Telnet. La centrale écoute sur le port 4456.
 +
 +Le protocole est relativement simple et chaque commande reçu par la centrale est renvoyé en retour. Si une réponse est attendu, elle sera ajouté à la requête. Le séparateur de fin de ligne est le retour chariot (<​LF>,​ soit le caractère ASCII 10 ou 0x0A). Le serveur accèpte <LF>, <CR>, 0x00 ou n'​importe quel combinaison des trois. Il répondra avec ce qui a été envoyé dans la requête. Pour les chaines de caractères,​ la centrale utilise l'​encodage UTF-8 et les paramètres des requêtes sont encodés grâce au principe d'url encoding ([[http://​en.wikipedia.org/​wiki/​Percent-encoding|Percent-encoding]])
 +
 +===== Format des commandes =====
 +
 +Le format des commandes, requêtes et réponses est le suivant:
 +
 +  <​command>​ <​param0>​ ... <​paramN>​ <LF>
 +
 +<​param0>​ à <​paramN>​ sont les paramètres envoyés ou reçus.
 +
 +**Note:** Chaque paramètre doit être encodé suivant le procédé d'URL encoding ([[http://​en.wikipedia.org/​wiki/​Percent-encoding|Percent-encoding]],​ les espaces sont remplacés par %20).
 +
 +===== Liste des commandes =====
 +
 +==== Commande de base ====
 +
 +=== Login ===
 +
 +  login <​user>​ <​password>​
 +
 +La commande //login// permet de s'​authentifier sur la centrale. Les paramètres //user// et //​password//​ doivent être url-encodé comme pour n'​importe quel paramètre. Si l'​authentification réussi, le serveur renvoie "​ok"​ à la place du mot de passe. Si elle échoue, le serveur se déconnecte.
 +
 +Exemples:
 +  Requête : "login theuser thepassword<​LF>"​
 +  Réponse : "login theuser ok<​LF>"​
 +
 +  Requête : "login theuser mauvaispassword<​LF>"​
 +  Réponse : fermeture de la connection
 +
 +=== Version ===
 +
 +  version
 +
 +Cette commande renvoie la version du serveur.
 +
 +Exemple:
 +  Requête : "​version ?<​LF>"​
 +  Réponse : "​version 1.23<​LF>"​
 +
 +=== Save ===
 +
 +  save <​option>​
 +
 +Cette commande sauvegarde la configuration dans la mémoire et/ou dans la compact flash.
 +
 +Exemple:
 +  Requête : "save default<​LF>"​ Sauvegarde la configuration par defaut (chargé en cas de probleme avec la configuration courante)
 +  Réponse : "save ok<​LF>"​
 +  Requête : "​save<​LF>"​ Sauvegarde la configuration sur la compact flash
 +  Réponse : "save ok<​LF>"​
 +
 +=== System ===
 +
 +  system reboot <​option>​
 +
 +Cette commande permet d'​arrêter calaosd, calaos_gui ou les 2 (all)
 +
 +Exemple:
 +  Requête : "​system reboot calaosd"​
 +  Requête : "​system reboot calaos_gui"​
 +  Requête : "​system reboot all"
 +
 +=== System date ntp_on ===
 +
 +  system date ntp_on <​timezone>​
 +
 +Active le ntp et règle le fuseau horaire.
 +
 +Exemple:
 +    Requête : "​system date ntp_on 4"
 +    Réponse : "​system date ok"
 +
 +=== System date ntp_off ===
 +
 +  system date ntp_off <hh> <mm> <ss> <JJ> <MM> <​YYYY>​
 +
 +Désactive le ntp et règle l'​heure.
 +hh: heures
 +mm: minutes
 +ss: secondes
 +
 +JJ: jour
 +MM: mois
 +YYYY: années
 +
 +Exemple:
 +    Requête : "​system date ntp_off 0 12 34 46 4 2 9"
 +    Réponse : "​system date ok"
 +
 +=== firmware ===
 +
 +  firmware <​option>​
 +
 +Cette commande permet de demander la mise à jour du firmware
 +
 +Exemple:
 +    Requête : "​firmware webupdate"​
 +
 +=== Listen ===
 +
 +  listen
 +
 +Cette commande mets la connexion en mode d'​écoute. Le serveur va envoyer les différents évennements survenant dans le systeme sur toutes les connexions en mode listen. Une telle connexion ne pourra plus envoyer de commande.
 +
 +Exemple:
 +    Requête : "​listen"​
 +
 +=== Listen (polling) ===
 +
 +  poll_listen
 +
 +Cette commande similaire à listen permet d'​interroger la centrale à intervalle régulière pour avoir les évènements survenant dans le systeme. Il faut tout d'​abord créer un identifiant et ensuite utiliser cet identifiant pour récupérer les évènements. Après 5 min d'​inactivité,​ un identifiant devient automatiquement invalide.
 +
 +Exemple:
 +    Requête : "​poll_listen register"​
 +    Réponse : "​poll_listen 5716cb99-235c-4ac0-a99b-28d59659a9f4"​
 +    ​
 +    Requête : "​poll_listen get 5716cb99-235c-4ac0-a99b-28d59659a9f4"​
 +    Réponse : "​poll_listen get input%3Ainput_2%3Astate%3Aonsongchange output%3Aoutput_0%3Astate%3Atrue"​
 +    ​
 +    Requête : "​poll_listen unregister 5716cb99-235c-4ac0-a99b-28d59659a9f4"​
 +    Réponse : "​poll_listen unregister true"
 +
 +
 +==== Commandes des caméras ====
 +
 +=== camera ===
 +
 +  camera <​param1>​ <​paramN>​
 +
 +La commande camera permet soit de récupérer le nombre de caméra disponible (argument "?"​),​ soit de récupérer les informations (url du flux mjpeg, capture d'une image, nom, etc...) des caméras avec l'​argument "​get",​ soit encore d'​effectuer des actions (Uniquement pour les caméras disposant de ces fonctionnalités) sur une caméra avec l'​argument "​action"​.
 +
 +Exemple:
 +    Requête : "​camera ?<​LF>"​
 +    Réponse : "​camera 2<​LF>"​ 2 caméras disponibles
 +    Requête : "​camera get 0<​LF>"​
 +    Réponse : "​camera 0 id:cam0 name:​Caméra1 url:​!http://​10.0.0.1:​80 mjpeg_url:​!http://​10.0.0.1:​80/​mjpeg.cgi mpeg_url:​!http://​10.0.0.1:​80/​mpeg4.cgi jpeg_url:​!http://​10.0.0.1:​80/​picture.cgi ptz:​false<​LF>"​
 +
 +Uniquement pour les modèles PTZ (motorisé):​
 +    Requête : "​camera move 0 left<​LF>​ bouge la camera a gauche (left, right, up, down, home)"
 +    Réponse : "​camera move 0 ok<​LF>"​
 +    Requête : "​camera save 0 5<LF> sauvegarde la position de la camera à l'​emplacement 5 (emplacement de 1 à 16)"
 +    Réponse : "​camera save 0 ok<​LF>"​
 +    Requête : "​camera move 0 5<LF> bouge la camera a la position sauvegardé en 5"
 +    Réponse : "​camera move 0 ok<​LF>"​
 +
 +Gestion des propriété des cameras:
 +    Requête : "​camera capabilities 0 get<​LF>"​
 +    Réponse : "​camera capabilities 0 ptz:true resolution:​640x480 led:true contrast:​255<​LF>"​
 +    Requête : "​camera capabilities 0 set contrast:​100 led:​false<​LF>"​ mets le contraste a 100 et eteint les leds
 +    Réponse : "​camera capabilities 0 set ok<​LF>"​
 +
 +Notes: Les propriétés renvoyés par camera get peuvent varier suivant le type de caméras.
 +
 +==== Commandes de la maison ====
 +
 +=== home ===
 +
 +  home <​param1>​ <​paramN>​
 +
 +La commande home, avec l'​argument "?",​ sert à récupérer les types de pièces définit dans la maison. Avec l'​argument "​get",​ on peut récupérer les informations d'un type de pièce. Par ex, pour récupérer tous les salons de la maison, on utilisera les paramètres "get salon"​. Pour obtenir tous les types disponibles,​ il faut utiliser "get ?".
 +
 +Notes: L'​ordre des pièces dans les réponses respecte l'​ordre du fichier [wiki:​StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "home ?<​LF>"​
 +    Réponse : "home salon:2 cuisine:1 sdb:1 chambre:2 chambre_parent:​1<​LF>"​ Dans cette configuration,​ nous avons 2 salons, 1 cuisine, etc...
 +    Requête : "home get salon<​LF>"​
 +    Réponse : "home count:2 0:​name:​Salon1 0:hits:152 1:​name:​Salon2 1:​hits:​59<​LF>"​ Récupération des salons (noms, plus nombre de [wiki:hits Hits])
 +
 +=== room ===
 +
 +  room <​type>​
 +
 +La commande room permet de récupérer les différentes entrées/​sorties d'une pièce de type <​type>​
 +
 +Exemple:
 +    Requête : "room salon ?<​LF>"​
 +    Réponse : "room salon:​2<​LF>"​ 2 salons disponibles
 +    Requête : "room salon get 0<​LF>"​ demande les infos du salon 0
 +    Réponse : "room salon:0 name:salon1 hits:99 input:in1 input:in2 output:out1 input:in45 output:​lum01 input:​scenario23<​LF>"​
 +    Requête : "room salon delete 0<​LF>"​
 +    Réponse : "room salon delete ok<​LF>"​ Le salon a été supprimé
 +
 +=== room get ===
 +
 +  room get <id>
 +
 +La commande room get permet de récupérer les différentes entrées/​sorties d'une pièce
 +
 +Notes: id respecte l'​ordre des pièces du fichier [wiki:​StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "room get 0<​LF>"​
 +    Réponse : "room id:0 input:in1 input:in2 output:out1 input:in45 output:​lum01 input:​scenario23<​LF>"​
 +
 +=== room get ===
 +
 +  room <​type>​ get <nom>
 +
 +Cette commande permet de récupérer les informations concernant la pièce de nom "​nom"​.
 +
 +Exemple:
 +    Requête : "room chambre get chambre_parent"​
 +    Réponse : "room id:0 input:in1 input:in2 output:out1 input:in45 output:​lum01 input:​scenario23<​LF>"​
 +
 +=== room set ===
 +
 +  room <​type>​ set <id> <​type>​ <​nouvelle_valeur>​
 +
 +La commande room set permet de modifier une variable d'un enregistrement room.
 +
 +Notes: id respecte l'​ordre des pièces du fichier [wiki:​StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "room salon set 0 name Chambre3<​LF>"​
 +    Réponse : "room salon set 0 name ok<​LF>"​ le nom a été changé
 +    Requête : "room salon set 0 type chambre<​LF>"​
 +    Réponse : "room salon set 0 type ok<​LF>"​ le type a été changé en chambre
 +    Requête : "room chambre set 0 hits 56<​LF>"​
 +    Réponse : "room chambre set 0 hits ok<​LF>"​
 +    Requête : "room add chambre Chambre1<​LF>"​
 +    Réponse : "room add ok<​LF>"​
 +
 +=== room create ===
 +
 +  room <​type>​ <id> create <​io_type>​ <​param1>​...<​paramN>​
 +
 +La commande room <​type>​ <id> create permet de créer une entrée/​sortie dans une pièce.
 +
 +Exemple:
 +    Requête : "room salon 0 create input type:​WIDigitalTriple name:Inter1 host:​10.0.0.123 port:​502<​LF>"​
 +    Réponse : "room salon 0 create ok<​LF>"​ l'​interrupteur a été crée
 +    Requête : "room salon 0 create camera name:​Camera1 host:​10.0.0.5<​LF>"​
 +    Réponse : "room salon 0 create ok<​LF>"​
 +
 +=== input ===
 +
 +  input <id> <​action>​
 +
 +Permet de récuperer les informations d'une entrée, ou de forcer une entrée (pour activer un scénario par exemple)
 +
 +Exemple:
 +    Requête : "input id1 get<​LF>"​
 +    Réponse : "input id:id1 name:​Entree1 type:​scenario<​LF>"​
 +    Requête : "input id1 set true<​LF>"​
 +    Réponse : "input id1 set ok"
 +    Requête : "input id1 state?<​LF>"​
 +    Réponse : "input id1 123"
 +    Requête : "input id1 states?<​LF>"​
 +    Réponse : "input id1 default:123 power:true statusN:​valueN"​
 +    Requête : "input id1 delete<​LF>"​
 +    Réponse : "input id1 ok"
 +    Requête : "input id1 query input_source ?<​LF>"​ Envoie une demande d'​infos complémentaire (uniquement pour certaines entrées et paramètre renvoyant une liste d'​items)
 +    Réponse : "input id1 query input_source 0:Test 2:​Param2"​
 +    Requête : "input id1 params?<​LF>"​ Permet de récupérer les paramètres avancés
 +    Réponse : "input name:truc id:id1 var:3 ip:​192.168.0.4"​
 +    Requête : "input id1 set_param name bidule<​LF>"​
 +    Réponse : "input id1 set_name name ok"
 +    Requête : "input id1 delete_param name<​LF>"​
 +    Réponse : "input id1 delete_param ok"
 +    Requête : "input plage1 plage get<​LF>​ à utiliser uniquement pour les entrées de type InPlageHoraire"​
 +    Réponse : "input plage1 1:​13:​00:​00:​0:​1:​15:​00:​00:​0:​1 1:​17:​00:​00:​0:​1:​17:​30:​00:​0:​1 2:​13:​00:​00:​1:​1:​15:​00:​00:​0:​1<​LF>"​ 1..7 représente le jour de la semaine suivit de la plage
 +    Requête : "input plage1 plage set 1:​12:​00:​00:​0:​1:​14:​00:​00:​0:​1<​LF>"​ à utiliser uniquement pour les entrées de type InPlageHoraire
 +    Réponse : "input plage1 plage set ok<​LF>"​
 +    Requête : "input plage1 plage months get<​LF>"​
 +    Réponse : "input plage1 plage months 111010011000<​LF>"​
 +    Requête : "input plage1 plage months set 000000111111<​LF>"​
 +    Réponse : "input plage1 plage months set ok<​LF>"​
 +    Requête : "input list<​LF>"​ Retourne une liste de toutes les entrées disponibles
 +    Réponse : "input id2 in3 scenar4<​LF>"​
 +
 +=== output ===
 +
 +  ouput <id> <​action>​
 +
 +Permet de récuperer les informations d'une sortie, ou de forcer une sortie (pour activer/​désactiver une lumière par exemple)
 +
 +Exemple:
 +    Requête : "​output id1 get<​LF>"​
 +    Réponse : "​output id:id1 name:​Sortie1 type:​WODigital gtype:light state:​true<​LF>"​
 +    Requête : "​output id1 set true<​LF>"​
 +    Réponse : "​output id1 set ok"
 +    Requête : "​output id1 state?<​LF>"​
 +    Réponse : "​output id1 true"
 +    Requête : "​output id1 delete<​LF>"​
 +    Réponse : "​output id1 ok"
 +    Requête : "input id1 query input_source ?<​LF>"​ Envoie une demande d'​infos complémentaire (uniquement pour certaines entrées et paramètre renvoyant une liste d'​items)
 +    Réponse : "input id1 query input_source 0:Test 2:​Param2"​
 +    Requête : "​output id1 params?<​LF>"​ Permet de récupérer les paramètres avancés
 +    Réponse : "​output name:truc id:id1 var:3 ip:​192.168.0.4"​
 +    Requête : "​output id1 set_param name bidule<​LF>"​
 +    Réponse : "​output id1 set_name name ok"
 +    Requête : "​output id1 delete_param name<​LF>"​
 +    Réponse : "​output id1 delete_param ok"
 +    Requête : "​output list<​LF>"​ Retourne une liste de toutes les sorties disponibles
 +    Réponse : "​output volet1 tr1 lum2<​LF>"​
 +
 +==== Commandes des règles ====
 +
 +=== rules ===
 +
 +  rules <​type:​name>​ <​action>​ <​param0>​ ... <​paramN>​
 +
 +Permet de gérer les règles.
 +
 +Exemple:
 +    Requête : "rules ?<​LF>"​
 +    Réponse : "rules light:2 volet:​5<​LF>"​Il y a 2 catégories de règles
 +    Requête : "rules light get 0 condition<​LF>"​
 +    Réponse : "rules type:light name:​Lumiere1 0:id:id1 0:oper:== 0:val:true 0:​var_val:​id3<​LF>"​
 +    Requête : "rules light get 0 action<​LF>"​
 +    Réponse : "rules type:light name:​Lumiere1 0:id:id2 0:val:true 1:id:id3 1:​val:​false<​LF>"​
 +    Requête : "rules light set 0 condition 0 id:id6 oper:!= val:false var_val:<​LF>"​
 +    Réponse : "rules light set 0 condition 0 ok<​LF>"​
 +    Requête : "rules light set 0 action 0 id:id8 val:​false<​LF>"​
 +    Réponse : "rules light set 0 action 0 ok<​LF>"​
 +    Requête : "rules light delete 0 condition 0<​LF>"​
 +    Réponse : "rules light delete 0 condition 0 ok<​LF>"​
 +    Requête : "rules light delete 0 action 0<​LF>"​
 +    Réponse : "rules light delete 0 action 0 ok<​LF>"​
 +    Requête : "rules light delete 0<​LF>"​
 +    Réponse : "rules light delete ok<​LF>"​
 +    Requête : "rules add light Regle 0:iid:id2 0:​ioper:​true 0:ival:true 0:​ivar_val:​true 0:oid:id3 1:​oval:​false<​LF>"​
 +    Réponse : "rules add ok<​LF>"​
 +    Requête : "rules light add 0 condition id:id2 oper:true val:true var_val:​true<​LF>"​
 +    Réponse : "rules light add ok<​LF>"​
 +    Requête : "rules light add 0 action id:id2 val:​true<​LF>"​
 +    Réponse : "rules light add ok<​LF>"​
 +
 +==== Commandes des zones de musique ====
 +
 +=== audio ===
 +
 +  audio <​param1>​ <​paramN>​
 +
 +La commande audio permet de gérer les lecteurs de musiques.
 +
 +Exemple:
 +    Requête : "audio ?<​LF>"​
 +    Réponse : "audio 2<​LF>"​ 2 lecteurs audios disponibles
 +    Requête : "audio get 0<​LF>"​
 +    Réponse : "audio 0 id:audio0 name:​Lecteur%20Salon playlist:​true database:​true<​LF>"​ On est capable de gerer la playlist du lecteur et on a également accès a sa base de donnée de musiques.
 +
 +    Requête : "audio 0 play<​LF>​ lance la lecture
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 pause<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 stop<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 next<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 previous<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 off<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 on<​LF>​
 +    Réponse : "audio 0 ok<​LF>"​
 +    Requête : "audio 0 volume?<​LF>​
 +    Réponse : "audio 0 volume:​75<​LF>"​
 +    Requête : "audio 0 volume 80<​LF>​
 +    Réponse : "audio 0 volume ok<​LF>"​
 +    Requête : "audio 0 songinfo?<​LF>​
 +    Réponse : "audio 0 title:​Some%20Title artist:​Some%20Artist album:​Some%20Album cover:true Genre:Rock duration:​10.5566 bitrate:​192Kbps type:​mp3<​LF>"​
 +    Requête : "audio 0 cover?<​LF>​
 +    Réponse : "audio 0 cover:​http://​host/​cover.jpg<​LF>"​
 +    Requête : "audio 0 cover 456<​LF>​
 +    Réponse : "audio 0 cover http://​host/​cover.jpg<​LF>"​
 +    Requête : "audio 0 time?<​LF>​
 +    Réponse : "audio 0 time:​5.12233<​LF>"​
 +    Requête : "audio 0 time 15.65<​LF>​
 +    Réponse : "audio 0 time ok<​LF>"​
 +    Requête : "audio 0 status?<​LF>​
 +    Réponse : "audio 0 status:​playing<​LF>"​
 +    Requête : "audio stop all<​LF>"​ arrête toutes les lectures en cours
 +    Réponse : "audio stop ok<​LF>"​
 +
 +Commandes pour la playlist:
 +    Requête : "audio 0 playlist size?<​LF>​
 +    Réponse : "audio 0 playlist 25<​LF>"​
 +    Requête : "audio 0 playlist current?<​LF>​
 +    Réponse : "audio 0 playlist 5<​LF>"​ La piste courrante est la 5
 +    Requête : "audio 0 playlist 13 getitem?<​LF>​
 +    Réponse : "audio 0 playlist item:13 title:​Some%20Title artist:​Some%20Artist album:​Some%20Album cover:true Genre:Rock duration:​10.5566 bitrate:​192Kbps type:​mp3<​LF>"​
 +    Requête : "audio 0 playlist 13 cover?<​LF>​
 +    Réponse : "audio 0 playlist 13 cover:​http://​host/​cover.jpg<​LF>"​
 +    Requête : "audio 0 playlist 13 moveup<​LF>​
 +    Réponse : "audio 0 playlist 13 ok<​LF>"​
 +    Requête : "audio 0 playlist 13 movedown<​LF>​
 +    Réponse : "audio 0 playlist 13 ok<​LF>"​
 +    Requête : "audio 0 playlist 13 delete<​LF>​
 +    Réponse : "audio 0 playlist 13 ok<​LF>"​
 +    Requête : "audio 0 playlist 13 play<​LF>​
 +    Réponse : "audio 0 playlist 13 ok<​LF>"​
 +    Requête : "audio 0 playlist clear<​LF>​
 +    Réponse : "audio 0 playlist ok<​LF>"​
 +    Requête : "audio 0 playlist save Ma_Playlist<​LF>​
 +    Réponse : "audio 0 playlist save ok<​LF>"​
 +    Requête : "audio 0 playlist add track_id:​123<​LF>​ Peut etre track_id, album_id, artist_id, genre_id, year, playlist_id,​ folder_id, radio_id
 +    Réponse : "audio 0 playlist add ok<​LF>"​
 +    Requête : "audio 0 playlist play track_id:​123<​LF>​
 +    Réponse : "audio 0 playlist play ok<​LF>"​
 +
 +Notes:
 +  Pour radio_id, il faut passer le type de radio: radio_id:​123:​shoutcast
 +
 +    Requête : "audio 0 options?<​LF>​
 +    Réponse : "audio 0 options sync:true sleep:​true<​LF>"​
 +    Requête : "audio 0 options sync?<​LF>​
 +    Réponse : "audio 0 options sync id:123123 name:​Lecteur1<​LF>"​
 +    Requête : "audio 0 options sync list?<​LF>​
 +    Réponse : "audio 0 options sync id:123123 name:​Lecteur1 id:456456 name:​Lecteur2<​LF>"​
 +    Requête : "audio 0 options sync id:​123123<​LF>​
 +    Réponse : "audio 0 options sync ok<​LF>"​
 +    Requête : "audio 0 options sync off<​LF>​
 +    Réponse : "audio 0 options sync ok<​LF>"​
 +    Requête : "audio 0 options sleep?<​LF>​
 +    Réponse : "audio 0 options sleep:​45<​LF>"​
 +    Requête : "audio 0 options sleep:​60<​LF>​
 +    Réponse : "audio 0 options sleep ok<​LF>"​
 +
 +Commandes pour la librairie de musique:
 +    Requête : "audio 0 database capabilities?<​LF>​
 +    Réponse : "audio 0 database artist:true album:true genre:false year:false music%20folder:​true playlist:​true radio:false search:​true<​LF>"​
 +    Requête : "audio 0 database stats?<​LF>​
 +    Réponse : "audio 0 database artists:563 albums:2033 genres:53 years:123 music%20folder:​4456 playlists:​13 radios:​5<​LF>"​
 +
 +  Les requetes de base de donnée se présente sous cette forme:
 +    audio <id> database <type de requete> <​from>​ <nb max de reponse> [paramètres optionnels]
 +
 +    Requête : "audio 0 database albums 0 2<​LF>​renvoie la liste d'​albums
 +    Réponse : "audio 0 database albums id:563 year:1999 name:​Album%20machin artist:​Artiste%20machin cover_id:​4456 id:123 year:2000 name:​Album%20machin2 artist:​Artiste%20machin2 cover_id:​66445<​LF>"​
 +    Requête : "audio 0 database album_titles 0 1 album_id:​123<​LF>​renvoie la liste de piste d'un album
 +    Réponse : "audio 0 database album_titles id:563 title:Titre year:2000 artist:​Artiste album:Album genre:Genre cover_id:​4456 duration:​1233 type:mp3 bitrate:​128<​LF>"​
 +
 +    Requête : "audio 0 database artists 0 2<​LF>​renvoie la liste d'​artistes
 +    Réponse : "audio 0 database artists id:563 name:​Artiste id:123 name:​Artiste2<​LF>"​
 +    Requête : "audio 0 database artist_albums 0 1 artist_id:​123<​LF>​renvoie la liste d'​album d'un artiste
 +    Réponse : "audio 0 database artist_albums id:563 name:Nom year:2000 artist:​Artiste cover_id:​4456<​LF>"​
 +
 +    Requête : "audio 0 database genres 0 2<​LF>​renvoie la liste de genres
 +    Réponse : "audio 0 database genres id:563 name:Rock id:123 name:​Valse<​LF>"​
 +    Requête : "audio 0 database genre_artists 0 1 genre_id:​123<​LF>​renvoie la liste d'​artiste d'un certain genre
 +    Réponse : "audio 0 database genre_artists id:563 name:​Nom<​LF>"​
 +
 +    Requête : "audio 0 database years 0 2<LF> renvoie la liste d'​années
 +    Réponse : "audio 0 database years year:1960 year:​2000<​LF>"​
 +    Requête : "audio 0 database year_albums 0 1 year:​2000<​LF>​ renvoie la liste d'​albums d'une certaine année
 +    Réponse : "audio 0 database year_albums id:563 name:Nom year:2000 artist:​Artiste cover_id:​4456<​LF>"​
 +
 +    Requête : "audio 0 database playlists 0 2<​LF>​renvoie la liste de playlists
 +    Réponse : "audio 0 database playlists id:123 name:​playlist1 id:234 name:​playlist2<​LF>"​
 +    Requête : "audio 0 database playlist_titles 0 1 playlist_id:​123<​LF>​renvoie la liste de piste d'une playlist
 +    Réponse : "audio 0 database playlist_titles id:563 title:Titre year:2000 artist:​Artiste album:Album genre:Genre cover_id:​4456 duration:​1233 type:mp3 bitrate:​128<​LF>"​
 +    Requête : "audio 0 database playlist delete playlist_id:​123<​LF>​supprime une playlist
 +
 +    Requête : "audio 0 database radios 0 2<​LF>​renvoie la liste de radios
 +    Réponse : "audio 0 database radios id:​shoutcast name:​ShoutCAST id:radioio name:​RadioIO<​LF>"​
 +    Requête : "audio 0 database radio_items 0 2 radio_id:​shoutcast<​LF>​ renvoie la liste d'item pour un certaine radio
 +    Réponse : "audio 0 database radio_items id:563 name:​NomRadio isaudio:1 id:5634 name:​NomRadio2 isaudio:​0<​LF>"​
 +    Requête : "audio 0 database radio_items 0 1 radio_id:​shoutcast item_id:​5634<​LF>​ renvoie la liste d'item pour un certaine radio et un sous item
 +    Réponse : "audio 0 database radio_items id:5634.1 name:​NomRadioSousItem isaudio:​1<​LF>"​
 +    Requête : "audio 0 database radio_items 0 1 radio_id:​shoutcast item_id:​5634 search:​Nirvana<​LF>​ renvoie la liste d'item pour un certaine radio et un sous item, inclut aussi une recherche
 +    Réponse : "audio 0 database radio_items id:5634.1 name:​NomRadioSousItem isaudio:​1<​LF>"​
 +
 +    Requête : "audio 0 database randoms 0 100<​LF>​renvoie la liste de type de random disponible
 +    Réponse : "audio 0 database randoms id:tracks name:​RandomTracks id:albums name:​RandomAlbums id:artists name:​RandomArtists id:years name:​RandomYears<​LF>"​
 +    Requête : "audio 0 random random_id:​tracks<​LF>​ active le mode de random sélectionné
 +    Réponse : "audio 0 random ok<​LF>"​
 +
 +    Requête : "audio 0 database search 0 2 search_terms:​quelquechose<​LF>​ renvoie la reponse a une recherche
 +    Réponse : "audio 0 database search id:123 type:album name:​quelquechose id:234 type:track track_id:​563 title:Titre year:2000 artist:​Artiste album:Album genre:Genre cover_id:​4456 duration:​1233 type:mp3 bitrate:​128<​LF>"​
 +
 +    Requête : "audio 0 database music_folder 0 2<LF> renvoie la liste du dossier racine
 +    Réponse : "audio 0 database music_folder id:1.1 type:folder name:​Dossier id:1.3 type:track track_id:​563 title:Titre year:2000 artist:​Artiste album:Album genre:Genre cover_id:​4456 duration:​1233 type:mp3 bitrate:​128<​LF>"​
 +    Requête : "audio 0 database music_folder 0 2 folder_id:​1.1<​LF>​ renvoie la liste d'un sous dossier
 +    Réponse : "audio 0 database music_folder id:2.1 type:folder name:​Dossier id:2.3 type:track track_id:​563 title:Titre year:2000 artist:​Artiste album:Album genre:Genre cover_id:​4456 duration:​1233 type:mp3 bitrate:​128<​LF>"​