un peu d'aide simple pour un débutant

bonjour,


je suis nouveau dans le domaine du développement sur mac et iphone ,j'ai donc choisi de commencer en swift ,j'essaye de communiquer avec un automate en wifi ,j'ai d'ailleurs aucun soucis de communication avec un autre langage sous windows .


 


il faut donc envoyer des trames avec un socket ,j'ai choisi CFStreamCreatePairWithSocketToHost ,l'envoie fonctionne parfaitement mais le retour du résultat doit se faire attendre ,pour l'obtenir pour l'instant je fait un point d'arrêt juste après le write et avant le read ... 


 


MonoutputStream.write(&buffer, maxLength: data.length)


println(buffer) // = [65, 84, 90, 13]


 ///je fais un point d'arrêt ici pour lui laissé le temps de renvoyer le résultat       


var readByte = [UInt8](count: 80, repeatedValue: 0)


MoninputStream.read(&readByte, maxLength: 100)


println(readByte) // = [65, 84, 90, 13, 13, 13, 69, 76, 77, 51, 50, 55, 32, 118, 49, 46, 53, 13, 13, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


 


 


j'aurai besoin d'aide pour éviter de tourner en rond pendant des heures et comprendre plus rapidement les subtilités des classes etc ...


il me faudrait une boucle qui cumule le read et qui en sort quand il trouve dans la chaine le marqueur de fin qui doit être 13, 13, 62 (rc,rc,>) et qui en sort aussi automatiquement au bout de 100 passage pour éviter de tourner en rond comme moi .


il faudrait aussi retranscrire le tableau d'UInt8 en chaine ,j'ai essayer 50 trucs mais rien ne va ...


si quelqu'un avait le temps de m'aider ,ce serais super ...,c'est pas bien difficile mais je plane grave dans ce langage swift ou objective C


 


 


Réponses

  • LarmeLarme Membre

    Tu utilises des NSStreams, c'est ça ?


    Tu as une méthode de NSStream Delegate (stream:handleEvent:) 


    https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Streams/Articles/WritingOutputStreams.html


  • MalaMala Membre, Modérateur

    Regardes le lien de Larme. Ton approche n'est pas bonne. Il ne faut surtout pas tourner en rond à  faire un read. L'idée de base est de recevoir des évènements de manière asynchrone lorsque des données sont dispo.


     


    A la reception des données, tu stockes dans un NSMutableData. Et pour la conversion en string, je dirais de passer par la méthode de NSString:



    - (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

  • LarmeLarme Membre

    J'ai pas testé, mais je vais donner quelques pistes possibles (en Objective-C car je ne parle pas le Swift, mais vu que c'est du Cocoa la logique devrait être la même et la traduction faisable).


    Un NSMutableData auquel tu ajoutes au fur et à  mesure tes bytes reçus dans stream:handleEvent:



    int length = (int)[(NSInputStream *)aStream read:buffer maxLength:64];
    if (length > 0)
        [tonMutableData appendData:[NSData dataWithBytes:buffer length:length]];

    Tu peux utiliser ça:



    Byte bytesRemarquables[3];
    bytesRemarquables[0] = 13, bytesRemarquables[1] = 13; bytesRemarquables[2] = 62;
    NSData *dataRemarquable = [NSData dataWithBytes:bytesRermarquables length:3];

    Grâce à  ça, tu peux effectuer des rangeOfData:option:range: qui fonctionne grosso-modo comme la version analogue de NSString pour trouver des substrings :



    NSRange range = [tonMutableData rangeOfData:dataRemarquable options:?? range:NSMakeRange(0, [tonMutableData lenght])];
    if (range.location != NSNotFound)
        //Tu as trouvé tes bytesRemarquables
    //Si ce sont des marqueurs de fin, tu as récupérer toute ta data, tu peux passer à  autre chose.
  • styck007styck007 Membre
    mars 2015 modifié #5

    merci pour vos réponses Larme et Mala mais vous êtes en objective C que je comprends très très mal ,je commence avec swift et Xcode car plus en corrélation avec mon petit cerveau ,je débute et c'est déjà  bien galère si en plus le rajoute une grosse couche d'objective C ,la je descends du train B)  ...


    je comprends bien que l'on peut mettre un événement sur la réception mais je ne sais pas comment ,j'ai trouver çà  mais c'est de l'obj c



    - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

    NSLog(@stream event %i, streamEvent);

    switch (streamEvent) {

    case NSStreamEventOpenCompleted:
    NSLog(@Stream opened);
    break;
    case NSStreamEventHasBytesAvailable:

    if (theStream == inputStream) {

    uint8_t buffer[1024];
    int len;

    while ([inputStream hasBytesAvailable]) {
    len = [inputStream read:buffer maxLength:sizeof(buffer)];
    if (len > 0) {

    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

    if (nil != output) {

    NSLog(@server said: %@", output);
    [self messageReceived:output];

    }
    }

    }
    }
    break;


    case NSStreamEventErrorOccurred:

    NSLog(@Can not connect to the host!);
    break;

    case NSStreamEventEndEncountered:

                [theStream close];
                [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
                [theStream release];
                theStream = nil;

    break;
    default:
    NSLog(@Unknown event);
    }

    }

     pas facile à  transcrire en swift pour un debutant  :o  

  • MalaMala Membre, Modérateur

    Tu illustres bien tout le paradoxe de Swift. Les newbies foncent dessus parce que c'est aware et que c'est l'avenir sauf que dans les faits c'est un langage encore en maturation et beaucoup moins développé qu'Objective-C en terme de ressources sur la toile.


     


    Allez hop! hop! hop! les pro Swift! On vient aider notre ami. ;)


  • LarmeLarme Membre


    Tu illustres bien tout le paradoxe de Swift. Les newbies foncent dessus parce que c'est aware et que c'est l'avenir sauf que dans les faits c'est un langage encore en maturation et beaucoup moins développé qu'Objective-C en terme de ressources sur la toile.




    C'est pour ça que je dis que ceux qui apprennent le Swift devraient apprendre quelques bases en Objective-C, au moins être capable de comprendre la syntaxe pour faire de la traduction.


     


    Sinon, styck007, c'est possible d'utiliser la balise CODE ?

  • LeChatNoirLeChatNoir Membre, Modérateur

    moi ce qui m'énerve, c'est qu'on trouve de plus en plus de ressources en swift....


    Ca me gonfle parce que j'ai pas envie de m'y mettre ^^

  • iLandesiLandes Membre
    mars 2015 modifié #9


    moi ce qui m'énerve, c'est qu'on trouve de plus en plus de ressources en swift....


    Ca me gonfle parce que j'ai pas envie de m'y mettre ^^




     


    Je pense qu'il faudra se mettre à  Swift mettre quoi qu'il arrive. J'ai assisté une fois à  un CocoaHead à  Paris ou un participant était prés à  s'en couper une si un jour la majorité de dev présents passait à  swift. C'est inéluctable, un jour, une nouvelle fonction, un nouvel OS, un nouvel iBidule ne pourra se faire qu'en swift. Ceux qui n'auront pas pris le train en marche galèreront et le gars de CocoaHead ne sera plus qu'un eunuque. Je citerais pas de nom mais je le suis sur Twitter en espérant bientôt voir passer un faire part de naissance avant qu'il ne soit trop tard pour lui^^


     


    Je sais ma réponse est hors sujet mais nous sommes en week-end...


     


    Sinon pour les String en Swift il ne s'agit pas d'un tableau de caractères ll faut faire attention quand on les manipule ou quand on navigue dedans. Je débute aussi en swift et je repasse souvent mes String (swift) en NSString (Cocoa) car NSString à  plein de méthode bien pratique.


  • Tu verras c'est cool de Swifter !

Connectez-vous ou Inscrivez-vous pour répondre.