Résolu => Objective-C - SSH - Raspberry Pi

BobycoBobyco Membre
avril 2017 modifié dans Apple Developer Programs #1

Bonjour, j'aurais besoin d'aide pour un petit projet.


 


J'aimerai faire une application iOS en objectif-C simple, avec un "Button" et un "Label". J'aimerait bien que l'application se connecte en SSH au raspberry pi sur le réseau local en lui donnant une instruction pour lancer un fichier bash. Se que je sais faire avec un Terminal. Mais je ne sais pas comment mettre en place dans mon application un connection SSH avec une commande.


 


Mots clés:

Réponses

  • Merci a toi pour se lien c'est exactement se que je chercher d'après la documentation que j'ai pus lire.


    Mais je doit avoir un problème quand je réalise le framework.


    Je m'explique. J'ai fait comme indiquer dans la documentation, mais quand j'intègre le NMSSH.framework dans mon project et que je lance un build pour tester si sa passe il me ressort une erreur:


     


    ld: framework not found NMSSH


    clang: error: linker command failed with exit code 1 (use -v to see invocation)


     


    Après plusieurs teste en recherche je n'arrive pas corriger cela. D'après se que j'ai compris (Je me trompe peut-être) sa serait du a un problème de compatibilité sur les architecture.

  • LarmeLarme Membre
    février 2017 modifié #4

    Tu l'as installé via Pod/Carthage?


    Tu codes en Swift ?

    Si c'est via Pods, tu as bien ouvert le .xcworkspace et pas le .xcodeproj? Si tu fais du Swift, tu as bien décommenté dans le PodFile le use_framework?


     


    Vu qu'il y a des static libraries (les trucs en .a) d'après ce que j'ai pu voir dans le PodSpec, sur quoi tu essayes de le faire tourner ? Simulateur ? Vrai device?


  • J'utilise Pod et objectif-C.


    Oui j'ai bien lancer avec le .xcworkspace.


    J'ai une question, si je suis passer par pod pour l'utiliser, je ne suis pas obliger de générer a partir de la source comme indiquer sur GitHub ?

  • J'ai pas testé, mais tu ne devrais pas avoir à  importer le .framework.


     


    Il faut juste que tu écrives :
    pod 'NMSSH' dans ton PodFile au bon endroit.


    Tu dois ensuite fait un pod update.


    Une fois terminé, ouvre le .xcworkspace.


    Et fais directement un #import <NMSSH/NMSSH.h> là  où tu veux l'utiliser.


  • Je t'en remercie pour t'on aide, tu ma bien aider pour pouvoir me connecter en SSH.


    Au niveau du Pod j'avais bien créer le fichier et j'avais bien fait install depuis le terminal.


    Par contre je tester plusieurs façon de faire et j'ai générer un framework pour iOS et l'est intégré a mon project et la plus d'erreur donc je sais pas vraiment si les erreur venait de la exactement. 


    Quand j'aurais un peut de tant je testerai a nouveau voir si le problème vient de la.


    Encore merci 


  • BobycoBobyco Membre
    mars 2017 modifié #8

    Re-Bonjour tout le monde. Je revient vous voir car NMSSH me pose un petit problème, Je m'explique.


    J'ai le code de basse qui envoie une commande sur mon raspberry



    NMSSHSession *session = [NMSSHSession connectToHost:@192.168.0.15:22
    withUsername:@pi];

    if (session.isConnected)

    {
    self.LabelInfo.text = [NSString stringWithFormat: @Successfully created a new session];
    NSLog(@Successfully created a new session);

    [session authenticateByPassword:@raspberry];

    if (session.isAuthorized)

    {
    self.LabelInfo.text = [NSString stringWithFormat: @Successfully authorized];
    NSLog(@Successfully authorized);


    NSError *error = nil;
    NSString *SwitchGPIO1Reponse = [session.channel execute:@gpio read 1 error:&error];
    NSLog(@%@", SwitchGPIO1Reponse);

    NSString *Test1 = @1 ;

    if ([SwitchGPIO1Reponse isEqualToString: Test1])
    {
    self.LabelInfo.text = @Yes;
    }
    else
    {
    self.LabelInfo.text = @No;
    }


    Donc je me connecte et demande l'état du port GPIO 1 qui se trouve sur le raspberry. La réponse ne peut être que 1 ou 0.


    Après je veut tester la variable SwitchGPIO1Reponse et selon l'état faire une action. Voila mon problème, après plusieurs essaye avec une autre variable de type NSString ou NSSNumber il me répond toujours No.


    Alors j'ai essayer un petit changement dans le code pour vérifier un truc :



    NSLog(@A%@A", SwitchGPIO1Reponse);

    Et la je voie que dans la console il m'écrit: 



    2017-03-09 11:31:56.908561 test[71995:1341852] NMSSH: Exec command gpio read 1
    2017-03-09 11:31:57.024608 test[71995:1341807] A1
    A
    2017-03-09 11:31:57.025998 test[71995:1341852] NMSSH: Disconnected

    Donc voila je pense que le problème c'est que la commande qui me renvoie la réponse mais un Entrer comme dans un terminal après une commande, se qui fait que ma variable n'est jamais bonne et la je sais pas comment je pourrais la tester, vous avez une idée ?


  • CéroceCéroce Membre, Modérateur
    NSLog() ajoute un retour à  la ligne.

    Sinon:


    NSString *Test1 = @1 ;

    C'est normal l'espace après le 1?
  • Non l'espace n'est pas la normalement je me suis tromper en copiant. Je pense pas que le NSLog ajoute le retour, je pense que c'est le retour de NMSSH. De mémoire je croie que NSString peut être multi ligne, peut être qu'on peut le formater pour n'avoir que une ligne, non ??


  • Je ne comprends pas bien la trace que tu as postée.
    Tu devrais faire une trace moins ambigà¼e pour éviter les erreurs d'interprétation de ce que tu vois dans l'output, par exemple:
    NSLog(@SwitchGPIO1Reponse:'%@'", SwitchGPIO1Reponse);
     
    Dans NSString, comme dans tous les langages que je connais, le changement de ligne est matérialisé par des caractères spéciaux "non affichables". Donc oui, NSString est multiligne et si tu veux supprimer les passages à  la ligne, il faut supprimer les caractères spéciaux correspondant qui se trouvent dans ta chaà®ne de caractère.
    C'est là  que les ennuis commencent quand on fait transiter des chaà®nes de caractères d'un système d'exploitation à  l'autre comme toi :
    https://fr.wikipedia.org/wiki/Carriage_Return_Line_Feed

    Avec ce code tu vas pouvoir supprimer les retours à  la ligne

    NSString *stringWithoutCR = [myString stringByReplacingOccurrencesOfString:@\n withString:@""];
    NSString *stringWithoutCRLF = [stringWithoutCR stringByReplacingOccurrencesOfString:@\r withString:@""];
    ou plus élégant (si tu es certain d'avoir 0 ou 1 dans ta chaine) :

    NSRange range = [myString rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
    if (range.length == 1)
    {
    NSInteger returnCode = [[myString substringWithRange:range] intergerValue];
    }
Connectez-vous ou Inscrivez-vous pour répondre.