Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: [NDS/Utilitaire] Installateur Homebrews  (Lu 5413 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« 26 Mars 2009, 11:07:03 »

Bonjour à tous,

Je débutes en développement C et C++ et après quelques frayeurs sur mes µSD à cause des multiples plug, je voudrais développer avec l'aide de ceux qui le souhaitent un homebrew en open source.

Ce soft permettrait à des enfants (très important) de télécharger leur homebrew vers leur DS sans l'aide d'adultes sur un serveur FTP installé en local.

Pour ce faire :
- Il devrait utiliser le Wifi en FTP client relié au serveur type XLight (ultra simple à installer).
- La copie des .nds devrait être modifiable en fonction du classement du propriétaire de la DS.
- La place disponible devrait être calculée pour savoir quel homebrew peut ou pas être installé.
- L'interface devrait être très simple (voir SkinUp pour exemple), utilisable par des enfants  Cheesy.

Alors si vous êtes partant, j'ai besoin d'aide....
Surtout sur le transfert en Wifi en FTP vers PC (pas tout compris voir même rien du tout  Undecided).

Merci d'avance pour votre future aide.
Journalisée
Ludo6431 Hors ligne
Administrateur
*****
Messages: 903


Voir le profil WWW
It flies !

« Réponse #1 : 26 Mars 2009, 12:44:09 »

voir libDSFTP pour le FTP (à porter en r25)
Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCLite | SCDS ONE v2 | SCDS TWO | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | iTouch DS | CycloPS' iEvolution
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #2 : 26 Mars 2009, 13:50:00 »

Merci mais où peut on trouver de la doc avec des exemples simple de la libDSFTP ?

En allant sur le site officiel, je n'ai pas compris par exemple comment la DS peut se connecter à la bonne adresse IP ? J'ai bien vu le fichier de config mais seul les parametres du login y sont précisés. Où est définie l'adresse IP et le port ?

Quand tu parles de r25, c'est bien la release du DevkitPro dont tu parles qui doit être en r25. Pourquoi les releases antérieures sont incompatibles avec liBDSFTP ?
« Dernière édition: 26 Mars 2009, 14:03:13 par Squale » Journalisée
unkwar Hors ligne
Hero Member
*****
Messages: 767


Voir le profil
Oeil de L1NX

« Réponse #3 : 26 Mars 2009, 19:49:51 »

au contraire je pense que la lib a ete cree sur une version anterieur donc si tu est en r25 tu vas devoir la modifier.
Journalisée

Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #4 : 26 Mars 2009, 20:52:12 »

Je suis en r21, donc cela devrait marcher ?

J'ai vu dans les sources sur la libDSFTP, WFC_Connect. C'est quoi ce WFC ?
Journalisée
Ludo6431 Hors ligne
Administrateur
*****
Messages: 903


Voir le profil WWW
It flies !

« Réponse #5 : 27 Mars 2009, 19:17:29 »

exact
Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCLite | SCDS ONE v2 | SCDS TWO | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | iTouch DS | CycloPS' iEvolution
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #6 : 18 Juillet 2009, 13:59:57 »

Ludo6431,

Je suis allé sur ton site et j'ai vu ton homebrew fileup qui pourrait peut être être la base du mien.

J'ai essayé de comprendre le principe mais je pèche un peu...

Où sont stockés tes paramètres du serveur FTP (IP, user et Password) ?
Quel serveur FTP as tu installé sur le PC ?
Comment choisis tu le fichier à downloader ?

Merci de ton aide. Attention je ne suis pas trop calé en C et encore moins en C++. d'habitude je développe sur C#
Journalisée
Valryon Hors ligne
Sr. Member
****
Messages: 331


Voir le profil WWW
The World ends with you !

« Réponse #7 : 18 Juillet 2009, 15:23:24 »

A mon avis le serveur FTP importe peu, non ?

Le principe de l'application n'est-il pas que le(s) parent(s) installe(nt) tout ça sur le PC, l'enfant n'ayant ensuite plus qu'à utiliser le homebrew pour installer ce qu'il souhaite ?
Les homebrews sont donc stockés sur le PC, donc ils ont été téléchargés par quelqu'un (parent ou enfant ?), dans un dossier partagé en FTP.

Pour ce qui est du homebrew, il te faut d'abord une couche qui gère le FTP aisément. Des fonctions de connexion simple. Faire du FTP revient à établir une connexion TCP/IP via un socket et à utiliser le protocole défini (http://fr.wikipedia.org/wiki/File_Transfer_Protocol).

Concrètement il faut ouvrir un socket vers le serveur, et envoyer des tableaux de caractères qui contiennent des messages compréhensibles par le FTP. Je ne sais pas du tout comment la DS gère ça, mais j'ai vu dans un vieil exemple (qui n'et probablement plus compatible) qu'elle pouvait gérer les sockets. Je joins cet exemple à mon message, je ne sais plus du tout d'où il vient donc je m'en excuse auprès de son auteur  Undecided
C'est comme en C sur PC donc, sauf que logiquement ici c'est le WiFi de la DS (Nintendo WFC = WiFi Connection chez Nintendo).
Envoyer des messages au serveur c'est bien, il faut aussi pouvoir les lire. Il faut donc une fonction capable de "parser" ce que tu reçois du serveur ("numero message\r\n") pour pouvoir faire une petite application FTP.

Après avec FTP il faut pouvoir gérer l'ouverture d'un canal (socket) secondaire pour y lire des données, c'est pas vraiment trivial mais c'est faisable. C'est comme ça que sont transférer les fichiers ainsi que la liste des fichiers présents sur le serveur, c'est donc assez capital.

Si je raconte tout ça c'est parce que j'ai fait un petit projet de client/serveur FTP en C lors de ma deuxième année de DUT et comme j'ai vu que ça fait pas mal de temps que ce projet est lancé, je me suis dit que je pouvais partager mon expérience sur ce genre de programme Wink Je n'ai malheureusement plus les sources C de cep rogramme, mais j'ai celles en Java qui peuvent donner quelques idées... http://www.valryon.fr/?p=92

Donc bref je pense que plutôt que de bloquer sur l'utilisation d'une librairie FTP tu peux faire ta propre librairie, ce n'est pas très compliqué (attention à la gestion des chaînes de caractères en C...) et tu auras exactement ce que tu veux pour ton application. Tu peux même reprendre une librairie FTP simple développée en C et la porter sur DS...

EDIT : WFC_Connect permet de se connecter au WiFI en utilisant les paramètres enregistrés dans la console (je ne sais pas si on peut le paramétrer, à part en passant par un jeu qui gère le WiFi comme Tetris ou Mario Kart).

* WIFIds.txt (1.92 Ko - Téléchargé 92 fois.)
« Dernière édition: 18 Juillet 2009, 15:25:25 par Valryon » Journalisée

Développeur professionnel et passionné de jeu vidéo, auteur de The Great Paper Adventure (PC/X360) :
-> http://www.thegreatpaperadventure.com
Ludo6431 Hors ligne
Administrateur
*****
Messages: 903


Voir le profil WWW
It flies !

« Réponse #8 : 18 Juillet 2009, 18:43:41 »

Squale, ce n'est pas du ftp, en fait le serveur il est sur la DS, et j'utilise un petit client simple côté PC pour envoyer des fichiers sur la DS.
J'envoie un petit header qui contient la taille du fichier à la DS et elle attends ensuite les données du fichier à la suite de ce header. (dans ce header il y a aussi l'emplacement auquel je veux le stocker sur la carte), attention, c'est du code fait très rapidement. (je l'utilise cependant tout les jours pour envoyer mes binaires DS lors des phases de test de mes hbs.)

Et sinon, je suis aussi d'accord avec Valryon, il est "assez" simple de ce faire une lib FTP en en suivant scrupuleusement les specifications.
Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCLite | SCDS ONE v2 | SCDS TWO | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | iTouch DS | CycloPS' iEvolution
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #9 : 19 Juillet 2009, 11:49:50 »

J'aurais souhaité ne pas utiliser WFC et passer comme Lilou (voir http://www.playeradvance.org/forum/showthread.php?t=6874) par une connection complètement paramètrable (IP serveur, Port, User, Password)

Comment faire ? Je ne trouves aucun exemple qui explique le fonctionnement.
J'ai essayé de contacter Lilou mais elle m'a répondu :
"les sources j’ai jamais eu le courage d’en faire un package exploitable, car j’ai modifié les lib wifi, nds … voilà voilà"
Journalisée
Ludo6431 Hors ligne
Administrateur
*****
Messages: 903


Voir le profil WWW
It flies !

« Réponse #10 : 19 Juillet 2009, 12:04:02 »

Squale, écoutes, le mieux, c'est de regarder les sources de la lib wifi, le dswifi9.h est bien commenté, tu devrais t'en sortir facilement Wink
Journalisée

Mon matériel : DS Lite blanche flashée v8 | DSi noire | SCLite | SCDS ONE v2 | SCDS TWO | DSerial EDGE | MK-R6 gold | rumble pack | R4(r4ds.cn) | M3i Zero | Acekard 2i | iTouch DS | CycloPS' iEvolution
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #11 : 19 Juillet 2009, 13:01:53 »

Voilà ce que j'ai pu établir pour l'instant :

Code
(c):
//*****  Début INCLUDES  *****
 
#include <PA9.h> // Necessaire pour l'utilisation de la PA_Lib
 
//*****  Fin INCLUDES  *****
 
//*****  Debut des procedures  *****
 
int main(int argc, char ** argv)
{
PA_Init();    // Initialisation PA_Lib
PA_InitVBL(); // Initialisation VBL
 
PA_InitText(0,2);      // Initialisation Test écran 0 sur l'arrière-plans (background) 2
PA_Init16bitBg(1, 3);    // Initialisation Image écran 1 a 16 bit (GIF, BMP et JPG)
PA_InitText(1, 0);  // Initialise the text system on the top screen
 
PA_WaitForVBL();
 
PA_OutputSimpleText(0,1,23,"Initialisation Wifi ");
PA_InitWifi(); // Initialisation Wifi
 
if (!fatInitDefault()) //Initialise la fat library et indique la réussite
{
PA_OutputText(1,2,2,"Fat non initialise.");
return 1;
}
else
{
PA_OutputSimpleText(1, 1, 1, "FAT Test - Do not power off");
 
if (PA_ConnectWifiWFC()) // Connexion Wifi
{
PA_OutputSimpleText(0,1,23,"Connexion Wifi     ");
 
struct sockaddr_in sin; // information du serveur
 
sin.sin_family = AF_INET; // AF_INET pour la famille
sin.sin_port = htons(21); // port http
sin.sin_addr.s_addr = inet_addr("192.168.0.2"); // ip serveur
 
PA_OutputSimpleText(0,1,23,"Prepartion Socket");
int sock = 0; // le descripteur de socket
sock = socket(AF_INET, SOCK_STREAM, 0); // creation du socket
 
PA_OutputSimpleText(0,1,23,"Connect");
 
connect(sock,(struct sockaddr *)&sin,sizeof(struct sockaddr));
 
PA_OutputSimpleText(0,1,4,"Query");
char *querry = "user\r\nnom_utilisateur\r\nmotdepasse\r\n";
send(sock, querry, (int)strlen(querry), 0);
 
}
else
{
PA_OutputSimpleText(0,1,23,"Erreur Cnx Wifi");
}
 
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
}
return 0;
}
 
//*****  Fin des procedures  *****
 

Je vois bien Query sur la NDS, mais le serveur FTP vois un user non connu. Comment faire pour se logger au serveur FTP.
J'ai testé cela par la console "cmd" :
Code
(dos):
ftp
user
nom_utilisateur
motdepasse

et ça marche... comprend pas...
Journalisée
Valryon Hors ligne
Sr. Member
****
Messages: 331


Voir le profil WWW
The World ends with you !

« Réponse #12 : 19 Juillet 2009, 14:04:48 »

Pour se connecter à un serveur FTP, il faut suivre le protocole de ce dernier.

Une connexion se fait dans ce style là :
NDS : "USER login\r\n"
FTP : "300 PASSWORD REQUIRED\r\n" (pas sûr du chiffre m'enfin voilà)
NDS : "PASS password\r\n"
FTP : "200 OK CONNECTED\r\n" ou "500 ERROR"

Quand tu passes par cmd, tu utilises le programme "ftp" de windows (ou linux), qui est un client ftp en ligne de commande... et non une connexion "brute" au serveur FTP.

Pour vraiment tester le protocole, il faut te connecter en telnet ou en ssh au serveur ftp, donc sur le port 21 :
telnet/ssh 192.168.0.2 21

et après tu peux envoyer des commandes du protocole FTP, comme je l'ai mis ci-dessus.
Journalisée

Développeur professionnel et passionné de jeu vidéo, auteur de The Great Paper Adventure (PC/X360) :
-> http://www.thegreatpaperadventure.com
Squale Hors ligne
Jr. Member
**
Messages: 70


Voir le profil WWW
« Réponse #13 : 19 Juillet 2009, 20:04:48 »

Voici mon code en test :
Code
(c):
//*****&#160; Debut INCLUDES&#160; *****
#include <PA9.h> // Necessaire pour l'utilisation de la PA_Lib
//*****&#160; Fin INCLUDES&#160; *****
//*****&#160; Debut des procedures&#160; *****
 
int main(int argc, char ** argv)
{
PA_Init();&#160; &#160; // Initialisation PA_Lib
PA_InitVBL(); // Initialisation VBL
 
PA_InitText(0,2);&#160; &#160; &#160; // Initialisation Test &#233;cran 0 sur l'arri&#232;re-plans (background) 2
PA_Init16bitBg(1, 3);&#160; &#160; // Initialisation Image &#233;cran 1 a 16 bit (GIF, BMP et JPG)
PA_InitText(1, 0);&#160; // Initialise the text system on the top screen
 
PA_WaitForVBL();
 
PA_OutputSimpleText(0,1,23,"Initialisation Wifi ");
PA_InitWifi(); // Initialisation Wifi
 
if (!fatInitDefault()) //Initialise la fat library et indique la r&#233;ussite
{
PA_OutputText(1,2,2,"Fat non initialise.");
return 1;
}
else
{
PA_OutputSimpleText(1,1,1,"FAT Test - Do not power off");
 
if (PA_ConnectWifiWFC()) // Connexion Wifi
{
int i = 1;
 
PA_OutputSimpleText(0,1,23,"Connexion Wifi&#160; &#160;  ");
 
struct sockaddr_in sin; // information du serveur
 
sin.sin_family = AF_INET; // AF_INET pour la famille
sin.sin_port = htons(21); // port http
sin.sin_addr.s_addr = inet_addr("192.168.0.2"); // ip serveur
 
PA_OutputSimpleText(0,1,23,"Preparation Socket");
int sock = 0; // le descripteur de socket
sock = socket(AF_INET, SOCK_STREAM, 0); // creation du socket
 
PA_OutputSimpleText(0,1,23,"Connection Socket ");
 
connect(sock,(struct sockaddr *)&sin,sizeof(struct sockaddr));
 
PA_OutputSimpleText(0,1,i,"User"); i++;
 
char *querryUser = "user asticot\r\n";
send(sock, querryUser, (int)strlen(querryUser), 0);
PA_OutputSimpleText(0,1,i,querryUser); i++;
 
PA_OutputSimpleText(0,1,i,"recv User"); i++;
 
char *bufferUser = "Nothing User";
recv(sock, bufferUser, 1024, 0);
PA_OutputSimpleText(0,1,i,bufferUser); i++;
 
}
else
{
PA_OutputSimpleText(0,1,23,"Erreur Cnx Wifi");
}
 
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
}
return 0;
}
 
//*****&#160; Fin des procedures&#160; *****

Et voici ce que j'obtiens sur l'écran de la NDS :
Code
(dos):
User
user asticot
recv User
220 Xlight FTP Server 3.1 ready.Needed %d free blocks

Quelques soit ce que j'insère derrière je n'ai pas de retour du ftp.
Que veut dire ce "Needed %d free blocks" ?

Je m'arrache les cheveux là .....
Comment faire pour se connecter à un serveur FTP en mode sécurisé (user et password) par la nds ? Personne n'a un bout de code qui expliquerait cela ?
« Dernière édition: 19 Juillet 2009, 20:19:05 par Squale » Journalisée
Valryon Hors ligne
Sr. Member
****
Messages: 331


Voir le profil WWW
The World ends with you !

« Réponse #14 : 19 Juillet 2009, 22:46:24 »

Lors de la connexion au serveur FTP, même si tu ne lui envoies rien celui-ci envoie un message d'accueil "220 message".

Ensuite il faut lui envoyer USER, et PASS

Donc tu dois d'abord recevoir un message,

Code:
recv(sock, bufferUser, 1024, 0);
PA_OutputSimpleText(0,1,i,bufferUser); i++;

ensuite tu envoies USER et PASS

Code:
char *querryUser = "USER asticot\r\n";
send(sock, querryUser, (int)strlen(querryUser), 0);

Le serveur FTP doit te renvoyer une réponse (3xx pour connexion possible, mot de passe attendu, 5xx sinon)
Donc on lit (et on analyse !) cette réponse
Code:
recv(sock, bufferUser, 1024, 0);
PA_OutputSimpleText(0,1,i,bufferUser); i++;

Si c'est 3xx (à vérifier dans la norme) on envoie PASS
Code:
char *querryUser = "PASS tonmotdepasse\r\n";
send(sock, querryUser, (int)strlen(querryUser), 0);

Et là tu reçois la réponse du serveur te disant si tu es connecté (2xx) ou s'il y a une erreur (5xx)
Code:
recv(sock, bufferUser, 1024, 0);
PA_OutputSimpleText(0,1,i,bufferUser); i++;

Voilà ta fonction d'identification.
Journalisée

Développeur professionnel et passionné de jeu vidéo, auteur de The Great Paper Adventure (PC/X360) :
-> http://www.thegreatpaperadventure.com
Pages: [1] 2   Haut de page
Imprimer

Aller à: