Baccalauréat — Épreuve pratique — 2026 — NSI
Épreuve pratique NSI 2026 — Sujet 23 : décodage et contrôle de trames de capteurs
Sujet
Épreuve pratique de NSI, session 2026 — sujet n°23 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.
Trames d'un module de capteurs agricoles
L'entreprise PlovaNuviam développe un module d'acquisition DEMETER, de transmission et de traitement de données environnementales (température, humidité…) pour la prévention de maladies dans les cultures agricoles comme les vignes.
Plusieurs fois par heure, chaque module mesure la température et l'humidité et transmet les données par ondes radio. Ces données sont réceptionnées sur un serveur dont le rôle est de vérifier, d'analyser et de traiter les informations. Le but de ce sujet est de finaliser la programmation du serveur et de répondre à certaines problématiques. Un code Python à corriger et à compléter ainsi qu'un jeu de données sont fournis avec ce document.
Description des données envoyées
Les données mesurées par chacun des modules DEMETER sont envoyées par trames de 40 bits, dont la forme est la suivante :
| ID (8 bits) | Clé de sécurité (8 bits) | Température (12 bits) | Humidité (8 bits) | Bits de contrôle (4 bits) |
|---|---|---|---|---|
| 00101010 | 11001000 | 010010001100 | 01100010 | 1101 |
Pour une trame donnée notée trame et représentée par une chaîne de caractères :
- les 8 premiers bits
trame[0:8]correspondent à l'identifiant (ID) du module en binaire classique ; - les 8 bits suivants
trame[8:16]sont une clé de sécurité ; - les 12 bits suivants
trame[16:28]encodent la température. Pour l'obtenir en °C, il faut convertir cette valeur binaire en décimal, lui soustraire 900, puis diviser le tout par 10. Par exemple, 010010001100 vaut 1164 en décimal, ce qui donne (1164 − 900) / 10 = 26.4 °C. Une température inférieure à −10 °C est considérée comme une erreur de mesure ; - les 8 bits suivants
trame[28:36]encodent l'humidité en pourcentage. Attention, elle est codée en décimal codé binaire (BCD) : chaque chiffre décimal est codé séparément sur 4 bits. Par exemple, 01100010 se sépare en 0110 (6) et 0010 (2), ce qui donne 62 %. Exception : 100 % est codé 10100000 ; - les 4 derniers bits
trame[36:40]sont des bits de parité permettant de vérifier l'intégrité des 4 premiers blocs. Le bit de parité vaut 0 si le nombre de « 1 » dans le bloc correspondant est pair, sinon il vaut 1. Par exemple, pour l'ID 00101010, le nombre de « 1 » est impair (3), donc le premier bit de contrôle est 1.
Indication : en Python, l'expression int(chaine, 2) prend une chaîne de caractères contenant l'écriture binaire d'un entier et renvoie cet entier.
Question 1. 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.4Implé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 — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 2. É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.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 3. 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 et identifier les erreurs qui pourraient survenir.
Question 4. Proposer des corrections de la classe Transmission permettant de la rendre plus robuste afin de pouvoir effectuer l'analyse, et commenter l'affichage obtenu.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Fichiers fournis
Le dossier comporte une version PDF de l'énoncé, les codes sources de départ transmission.py et analyse.py et le fichier data.txt (314 trames). La bibliothèque matplotlib doit être disponible.
transmission.py
class Transmission:
def __init__(self, trame):
self._id = None
self._temperature = None
self._humidite = None
self._trame = trame
self.decoder()
def __repr__(self):
""" Méthode permettant l'affichage """
return f"ID : {self._id} / Temp. : {self._temperature}°C / Hum. : {self._humidite}%"
def decoder(self):
self.decoder_id()
self.decoder_temperature()
self.decoder_humidite()
def decoder_id(self):
# int(s, 2) : conversion binaire -> décimal
self._id = int(self._trame[0:8], 2)
def decoder_temperature(self):
pass # À compléter
def decoder_humidite(self):
pass # À compléter
def get_id(self):
return self._id
def get_temperature(self):
return self._temperature
def get_humidite(self):
return self._humidite
def est_valide(self):
return False # À compléteranalyse.py
import matplotlib.pyplot as plt
from transmission import Transmission
# Extraction des données
with open("data.txt", "r") as f:
trames = f.read().split("\n")
trames.pop() # La dernière ligne est vide, on la supprime
# Création d'une liste de températures pour les transmissions valides
transmissions = [Transmission(t) for t in trames]
temperatures = [t.get_temperature() for t in transmissions if t.est_valide()]
print(f"Nombre de trames reçues : {len(trames)}")
print(f"Nombre de trames valides : {len(temperatures)}")
# Affichage des températures
plt.figure(figsize=(10, 5))
plt.plot(temperatures, label="Température (°C)")
plt.title("Évolution de la température")
plt.xlabel("Mesures")
plt.ylabel("Température (°C)")
plt.legend()
plt.grid(True)
plt.show()data.txt (début du fichier)
0010101011001000010010001100011000101101
0010101010011111010010001010011000011001
0010101011010101010010001010011000011101
0010101001011110010010000111011000011111
0010101000101110010010001000011000011011
...Corrigé
Créez un compte gratuit : votre première correction est offerte.