IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

décodage variables / infos complexes


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut décodage variables / infos complexes
    Bonjour à tous,
    Je suis comme dans la série ... LOST !!!

    Je ne suis absolument pas dev, je commence à m'initier au js... niveau -10. C'est donc pas la peine d'essayer de me parler technique, avec des expressions consacrées. Inutile de prononcer le mot "volant" par exemple... ; vous pouvez aussi juste me dire "le truc rond, sur le tableau de bord, qui sert à faire tourner les roues de la voiture...". Je comprendrai mieux en admettant que je sache déjà où sont les roues ... et la voiture


    A/ Donc, je souhaite pouvoir décoder et récupérer les variables d'un message tcp suivant un pivot de flags (A ou else), et sur le principe suivant :

    // flag A : flag = A (valid datas) ... si datas valides, affiche ceci

    // flag else : flag = else (invalid datas)... si datas invalides, affiche ceci ... et aussi cela en +

    B/ J'ai également besoin de convertir certaines données en vitesse => km/h et en angle directionnel => °

    C/ comment enlever le "#" à la fin dans la réponse?

    D/ Pas besoin de toucher à la conversion texte/GPS decimal, ça fonctionne!!



    Évidemment, ce sont des variables... donc je ne souhaite pas spliter suivant les valeurs réellement affichées dans les messages joints, mais récupérer leur contenu... a convertir pour certaines. Pour infos, seuls IWAP01 et # sont des valeurs fixes...



    Le message en question avec les commentaires en rouge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    // flag A
    //IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#
    // flag else
    //IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97#
    //
    // ON S'AMUSE A PARTIR D'ICI
    //
    let answer = {}
    let elements = msg.payload.split(",")                                                                               // array containing the bits
    // elements[0] is the long string starting IWAP01
    let dateStr = elements[0].substr(6,6)                                                                               // eg "190215" 15th Feb 2019
    answer.date = new Date(Number(dateStr.substr(0,2))+2000, Number(dateStr.substr(2,2))-1, dateStr.substr(4,2))                  // 080524 - date
    answer.valid = (elements[0].substr(12,1) === "A")                                                     // flag true or false - A or else
    if (answer.valid) {
        let degreesN = Number(elements[0].substr(13,2))
        let minutesN = Number(elements[0].substr(15,7))
        let ns = elements[0].substr(22,1)                                                                                 // N or S
        let degreesE = Number(elements[0].substr(23,3))
        let minutesE = Number(elements[0].substr(26,7))
        let ew = elements[0].substr(33,1)                                                                               // E or W
        node.warn(`${degreesN}  ${minutesN}  ${ns}  ${degreesE}  ${minutesE} ${ew}`)
        answer.latitude = degreesN + minutesN/60                                                                  // 2232.9806N
        if (ns === "S") answer.latitude = -answer.latitude
        answer.longitude = degreesE + minutesE/60
        if (ew === "W") answer.longitude = -answer.longitude                                                 // 11404.9355E
    } else {
        answer.latitude = 0
        answer.longitude = 0
    }
    
    answer.speedMoving = elements[0].substr(34,5)                                                                  // 000.1 ...a convertir en Km/h
    answer.angleDirection = elements[0].substr(45,6)                                                                // 323.87 a convertir  en ° (degrés)
    answer.GSMsignal = elements[0].substr(51,3)                                                                     // 060
    answer.satellites = elements[0].substr(54,3)                                                                        // 009
    answer.batteryLevel = elements[0].substr(57,3)                                                                  // 080
    // LBS datas
    answer.mcc = elements[1]                                                                                                // 460
    answer.mnc = elements[2]                                                                                                // 0
    answer.lac = elements[3]                                                                                                  // 9520       
    answer.cid = elements[4]                                                                                                  // 3671... Enlever le # 
    // WIFI bases : quand le flag est else (datas invalid), il faut pouvoir récupérer les bases wifi sur le modèle ssid|macAddress|WIFIsignal quelque soient leurs nombres... j'ai essayé et c'est pas bon du tout!!
    // let i;
    // answer.basesWIFI = []
    // for (i=6; i<6+answer.cid; i++) {
    //   let baseElements = elements[i].split(/[|]|[&]/)
    //  answer.basesWIFI.push({ssid: baseElements[0], macAddress: baseElements[1], WIFIsignal: baseElements[2]})      // Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
    //}
    msg.payload = answer
    return msg
    Je suis à votre dispo pour toute les questions, et il va y en avoir...

    merci!!!
    Dernière modification par SpaceFrog ; 19/02/2019 à 08h11.

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 663
    Points
    66 663
    Billets dans le blog
    1
    Par défaut
    Plutot que de découper tes données avec des substrings à tout va, essaye de regarder du coté des regExp.

    Il faudrait que tu nous donne la structure des données que tu dois traiter parceque se retaper tes substrings ...

  3. #3
    Invité
    Invité(e)
    Par défaut Euh... j'avais précisé pour le volant... :)))
    Je ne suis pas certain de comprendre totalement ta question...mais je vais essayer de répondre... c'est comme ça qu'on fait de la politique après tout

    Est-ce que c'est bien cela dont tu as besoin?
    Les commentaires en anglais sont très succinctement traduits du mandarin (rouillé chez moi)... Non! Ne te pend pas tout de suite!



    // flag A
    //IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#

    où:

    • IWAP01: Command word
    • 080524: 24th May 2008
    • “A”= valid data,”V”shows invalid data ET AFFICHERA DONC DES DONNÉES ADDITIONNELLES ESSENTIELLES dns les 2 cas...
    • 2232.9806N11404.9355E000.1: 22 degrees north latitude 32.9806 points,114 degrees east longitude 04.9355 points...
    • 000.1 : speed
    • 061830: GMT 06:18:30
    • 323.87:direction angle 323.87°
    • 060: GSM signal
    • 009: number of satellites
    • 080: battery level
    • 00102: VRAIMENT PAS IMPORTANT ET VA CHANGER EN TAILLE. FAUT COUPER JUSQU'À LA VIRGULE SUIVANTE... OU NE SURTOUT PAS TRAITER!!
    • 460: mcc
    • 0: mnc
    • lac: 9520
    • cid:3671
    • #: A VIRER ... PAS NÉCESSAIRE!



    // flag else
    //IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97#

    où:

    • IWAP01: Command word
    • 080524: 24th May 2008
    • “A”= valid data,”V”shows invalid data ET AFFICHERA DONC DES DONNÉES ADDITIONNELLES ESSENTIELLES dns le second cas // flag else
    • 2232.9806N11404.9355E000.1: 22 degrees north latitude 32.9806 points,114 degrees east longitude 04.9355 points...
    • 000.1 : speed
    • 061830: GMT 06:18:30
    • 323.87:direction angle 323.87°
    • 060: GSM signal
    • 009: number of satellites
    • 080: battery level
    • 00102: VRAIMENT PAS IMPORTANT ET VA CHANGER EN TAILLE. FAUT COUPER JUSQU'A LA VIRGULE SUIVANTE... OU NE SURTOUT PAS TRAITER!!
    • 460: mcc
    • 0: mnc
    • 9520: lac
    • 3671: cid

      If state in GPS package is V or latitude and longitude are “ 0000.0000N00000.0000E”, it will get LBS data.
      Home|74-DE-2B-44-88-8C|97 : one set of WIFI information,Home is SSID, 74-DE-2B-44-88-8C is mac address,97 is signal strength,variables are separated by“|”,wifi information can be multiple sets and are separated by “&”.
    • Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
    • #: A VIRER ... PAS NÉCESSAIRE!





    C'est la première partie... j'ai pas envie de vous perdre tous de suite
    Après faut que je récolte certaines des valeurs qui arrivent et que j'interroge un service de localisation avec une API en lui refilant les valeurs obtenues ... et qui me retournera une longitude et une latitude... donc 1 position que je peux afficher sur une carte !!!

    Dans flag = A, j'ai besoin de la position GPS décimale+valeurs mcc, mnc, lac, cid
    Dans flag = V (ou else), j'ai besoin des valeurs valeurs mcc, mnc, lac, cid + valeurs wifi ssid, mac address, signal WIFI
    Dernière modification par NoSmoking ; 19/02/2019 à 10h44. Motif: Inutile de citer un message pour y répondre, il existe un bouton répondre à la discussion.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    Citation Envoyé par jycemea Voir le message
    A/ ...décoder et récupérer les variables d'un message tcp suivant un pivot de flags (A ou else)...
    Déjà, il faudrait nous expliquer à quoi correspondent chaque partie de la chaine de départ !
    [EDIT] (répondu entre-temps)

    B/ J'ai également besoin de convertir certaines données en vitesse => km/h et en angle directionnel => °
    Ça, se sont juste des maths.
    Je pense que tu es capable de trouver les formules mathématique adéquates.

    C/ comment enlever le "#" à la fin dans la réponse?
    Par exemple, dès le début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let elements = msg.payload.replace('#','').split(",");
    Remarque : même si ce n'est pas obligatoire en JS, il est recommandé de terminer chaque instruction par un point-virgule.

    D/ Pas besoin de toucher à la conversion texte/GPS decimal, ça fonctionne!!
    OK

    Donc, à priori, pas de difficultés majeures.


    CONSEIL :
    Au lieu de "trainer" elements[0] partout, on peut aussi le décomposer à son tour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     // elements[0] renvoie : IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102
    let firstparts = elements[0].split("."); // on découpe la chaine en fonction des points
    Ensuite, ça simplifie/normalise un peu les substring

    Idem pour la partie 'Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97', qu'on peut là aussi facilement décomposer.


    N.B. return msg : cela suppose qu'on se trouve dans une fonction. Or, je n'en vois pas.

  5. #5
    Invité
    Invité(e)
    Par défaut j'ai un génie en face de moi...
    Globalement, t'es juste en train de me dire: "fais gaffe, les volets sont ouverts à 400, rentre-les et réduit ta vitesse à 150 nœuds... ensuite, tu pousses bien sur le manche en ne perdant pas le gyro de vue... "

    Merci du coup de main mais t'as loupé l'épisode du début où j'expliquais que j'ai jamais volé ... même dans un jeu vidéo ?
    Dernière modification par NoSmoking ; 19/02/2019 à 10h41. Motif: (MP)Inutile de citer un message pour y répondre, il existe un bouton répondre à la discussion.

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 657
    Points
    44 657
    Par défaut
    Bonjour,
    si
    Euh... j'avais précisé pour le volant... :)))
    en référence à ton 1st post j’eus apprécié que tu précises
    les variables d'un message tcp suivant un pivot de flags (A ou else)



    Plus sérieusement, regarde bien comment on utilise la méthode String.prototype.substring()


    Merci du coup de main mais t'as loupé l'épisode du début où j'expliquais que j'ai jamais volé ... même dans un jeu vidéo ?
    Que cela ne t'empêche pas de t'impliquer !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Nous ne sommes pas là pour écrire les codes à la place des autres *, mais juste pour aider et guider en cas le souci.
    Et ce, bénévolement.

    Ça implique un minimum de connaissance de la part de celui qui pose la question, pour comprendre les réponses et conseils qu'on lui donne.

    Sinon, la solution est d'EMBAUCHER et PAYER un informaticien, qui fera le travail.


    Remarques :
    1. Concernant les "formules mathématiques", c'est du niveau "collège"...
    2. Je doute que tes remarques "sarcastiques" ("j'ai un génie en face de moi... ") jouent en ta faveur...
      Pour ma part, j'en resterai là.



    * Merci de lire Les règles du club.

  8. #8
    Invité
    Invité(e)
    Par défaut
    D'abord, je te remercie pour ta bienveillance, ton dévouement sans limite... Sans oublier ton colossal sens de l'humour
    Et je vais qd même prendre 2 mn pour te répondre..

    Juste pour info, le ton sarcastique est une manière d'expliquer -avec une pointe d'humour insaisissable- que tout le monde n'est pas développeur (si,si!) et qu'on peut aussi refuser de s'endormir au clavier, l'œil torve et la bave aux lèvres...

    Après tes 2 vannes de l'espace sur ma supposée carence en maths et mon niveau de compréhension des choses, peux-tu, sans que ça remette toute ton enfance en question, imaginer que l'autre n'éprouve pas le même amour fusionnel que toi pour les lignes de code... et le pâté de tête? J'en doute.
    Ne cherche pas de contre-pétrie, tu pourrais faire un AVC ...

    Sauf à découvrir qu'on peut être en même temps un Gentil Helper, avoir un énorme pylône dans l'derch... et afficher un certain mépris de classe pour celui qui ne sait pas ; tu fais évidemment partie de ceux qui donnent envie à tout le monde de se connecter plus souvent sur ce genre de site pour venir y poser des questions. Tu es l'auteur caché de fameux bouquin sur l'enseignement pratique de la pédagogie durant le IIIème Reich?

    Sinon, les gars... je suis vraiment open à toutes suggestions concernant la résolution du problème que je vous ai soumis, pourvu qu'elles soient constructives... Le caca dans la tête, on évitera...
    Dernière modification par NoSmoking ; 19/02/2019 à 17h54.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Il y a des limites à l'"humour".

    • "avoir un énorme pylône dans l'derch" ??
    • "pédagogie durant le IIIème Reich" ??


    Envoi d'un avertissement pour propos diffamants.

    Discussion fermée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conjugue d'une variable aleatoire complexe loi
    Par boss89 dans le forum Probabilités
    Réponses: 0
    Dernier message: 21/04/2012, 15h17
  2. ibatis et infos complexes
    Par rikunter dans le forum Persistance des données
    Réponses: 2
    Dernier message: 10/11/2006, 16h43
  3. [Info]Modifier un ensemble de variable
    Par kaiser2003 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 07/09/2005, 15h53
  4. Réponses: 3
    Dernier message: 24/02/2005, 15h48
  5. Récupération de variables dynamiques complexes
    Par ludoboy dans le forum ASP
    Réponses: 7
    Dernier message: 24/05/2004, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo