Épreuve pratique NSI

Sujet n° 23 · Session 2026 · 1 heure

Des capteurs dans les vignes

Des modules agricoles envoient par radio des trames de 40 bits : température, humidité, bits de parité. Le candidat décode les trames, vérifie leur intégrité, puis rend le serveur robuste aux trames abîmées qui faussent l'analyse.

  • Programmation objet
  • Binaire et BCD
  • Bits de parité
  • Robustesse
  • Graphique matplotlib

Mise en situationLes trames

Plusieurs fois par heure, chaque module mesure la température et l'humidité et transmet ses données par ondes radio, en trames de 40 bits représentées par des chaînes de caractères :

BitsContenuExemple
trame[0:8]identifiant du module, en binaire00101010 → 42
trame[8:16]clé de sécurité11001000
trame[16:28]température : valeur − 900, divisée par 10010010001100 → 1164 → 26,4 °C
trame[28:36]humidité en BCD, un chiffre par quartet0110 0010 → 62 %
trame[36:40]bits de parité des quatre blocs précédents1101

Une température inférieure à −10 °C est une erreur de mesure. Exception BCD : 100 % est codé 10100000. Un bit de parité vaut 0 si le nombre de 1 du bloc est pair, 1 sinon.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

1

Question 1Décoder température et humidité

On dispose d'une classe Transmission dont le rôle est de décoder les informations reçues :

>>> t = Transmission("0010101011001000010010001100011000101101")
>>> t
ID : 42 / Temp. : 26.4°C / Hum. : 62%
>>> t.get_temperature()
26.4

Implémenter les méthodes decoder_temperature et decoder_humidite. Ces méthodes ne renvoient rien, mais modifient directement les propriétés de l'objet. Écrire des tests pour vérifier que ces méthodes décodent bien 26.4 et 62 avec la trame d'exemple de l'énoncé.

Appel professeur

À demander au candidat

  1. Que renvoie int('010010001100', 2) ? Détaillez le calcul de la température.
  2. Pourquoi l'humidité ne se lit-elle pas comme un nombre binaire ordinaire ? Que donnerait int('01100010', 2) ?
  3. Ces méthodes ne renvoient rien. Comment le résultat devient-il accessible ?
Point de vigilance

BCD : chaque quartet est un chiffre décimal, il faut convertir les deux quartets séparément, sans oublier le cas 100 %.

Résultats attendus
Trame d'exemple
ID 42, 26,4 °C, 62 %
2

Question 2Vérifier la parité

Écrire la méthode est_valide(self) qui renvoie True si les 4 bits de contrôle correspondent bien à la parité des 4 blocs de données, et False sinon. Elle se trouve dans la classe, ci-dessus.

Appel professeur

À demander au candidat

  1. Comment calculez-vous le bit de parité d'un bloc ? Que vaut-il pour 00101010 ?
  2. Une trame dont deux bits du même bloc sont inversés passe-t-elle le contrôle ? Qu'en concluez-vous ?
Point de vigilance

Comparer des caractères avec des caractères : trame[36 + i] est une chaîne, pas un entier.

3

Question 3Analyser les trames reçues

Le fichier data.txt contient une série de plus de 300 transmissions réelles. Dans le fichier analyse.py, une fonction d'analyse a été écrite pour automatiser le traitement et l'affichage des données valides. Exécuter le fichier analyse.py, identifier les erreurs qui pourraient survenir.

Appel professeur

À demander au candidat

  1. Combien de trames sont jugées valides avec le seul contrôle de parité ? Que montre le graphique ?
  2. Quelles trames du fichier sont anormales, et pourquoi certaines passent-elles le contrôle de parité ?
Point de vigilance

Le fichier contient deux trames de 41 bits et une de 38. Les deux de 41 bits passent la parité par hasard : l'une donne une humidité de 114 %.

Une trame valide en parité affiche −28,6 °C : c'est une erreur de mesure d'après l'énoncé.

Résultats attendus
Trames reçues
314
Valides, parité seule
310, de −28,6 à 36,7 °C
4

Question 4Un serveur robuste

Proposer des corrections de la classe Transmission permettant de la rendre plus robuste afin de pouvoir effectuer l'analyse et commenter l'affichage obtenu. La classe se trouve à la question 1 ; relancer ensuite la cellule analyse.py de la question 3.

Appel professeur

À demander au candidat

  1. Quels contrôles avez-vous ajoutés, et dans quel ordre ? Pourquoi vérifier la longueur en premier ?
  2. Où placer ces contrôles : dans est_valide, dans le constructeur, dans analyse.py ? Défendez votre choix.
  3. Commentez le graphique obtenu après correction.
Point de vigilance

Trois défauts à écarter : longueur différente de 40, humidité dont un quartet dépasse 9, température inférieure à −10 °C.

Résultats attendus
Valides après correction
307, de 22,7 à 34,2 °C

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans plusieurs fichiers. Chaque bouton rassemble les cellules d'un fichier, telles qu'elles sont à l'écran, à ouvrir dans votre éditeur habituel.

Chargement de Python…