diff --git a/Protocole/template.py b/Protocole/template.py
new file mode 100644
index 0000000000000000000000000000000000000000..89e41163429ecc859ec40251ced11c1b5c4c5d3d
--- /dev/null
+++ b/Protocole/template.py
@@ -0,0 +1,181 @@
+'''
+OC Robotique 2025
+Template pour librairie Protocole Réseau pour Micro:bit
+
+Auteur·ice : Vincent Namy
+Version : 1.0
+Date : 29.01.25
+'''
+
+#### Libraries ####
+from microbit import *
+import radio
+
+#### Variables globales ####
+seqNum = 0
+tryTime = 100
+Timeout = 300
+ackMsgId = 255
+
+#### Start radio module ####
+radio.config(channel=7, address=50)
+radio.on()
+
+
+#### Classe Message ####
+class Message:
+  def __init__(self, dest:int, exped:int, seqNum:int, msgId:int, payload:List[int], crc:int):
+    '''
+    Constructeur de l'objet Message à partir des paramètres
+            Parameters:
+                    dest:int, exped:int, seqNum:int, msgId:int, payload:List[int], crc:int
+            Returns:
+                    self(Message): objet Message contenant les paramètres
+    '''
+    self.exped = exped
+    self.dest = dest
+    self.seqNum = seqNum
+    self.msgId = msgId
+    self.payload = payload
+    self.crc = crc
+  def msgStr(self):
+    '''
+    Crée une string contenant les détails du message
+            Parameters:
+                    self(Message): objet message
+            Returns:
+                    msgStr(str): string contenant les détails du message
+    '''
+      return str(self.exped)+ " -> "+ str(self.dest)+ "n[" + str(self.seqNum)+ "] "+ " : type "+ str(self.msgId)+" : " +str(self.payload)+ " (crc="+ str(self.crc)+")"
+
+#### Toolbox ####
+def bytes_to_int(bytesPayload:bytes):
+    '''
+    Convert bytes object to List[int]
+            Parameters:
+                    bytesPayload(bytes): payload in bytes format
+            Returns:
+                    intPayload(List[int]): payload in int format
+    '''
+    intPayload = []
+    for i in bytesPayload:
+        intPayload.append(ord(bytes([i])))        
+    return intPayload
+
+
+def int_to_bytes(intPayload:List[int]):    
+    '''
+    Convert  List[int] to bytes object 
+            Parameters:
+                    intPayload(List[int]): payload in int format
+            Returns:
+                    bytesPayload(bytes): payload in bytes format
+    '''
+    return bytes(intPayload)
+
+
+#### Fonctions réseaux ####
+def msg_to_trame(rawMsg : Message):
+    '''
+    Crée une trame à partir des paramètres d'un objet Message afin de préparer un envoi.
+    1) Création d'une liste de int dans l'ordre du protocole
+    2) Conversion en bytes
+            Parameters:
+                    rawMsg(Message): Objet Message contenant tous les paramètres du message à envoyer
+            Returns:
+                    trame(bytes): payload convertie au format bytes
+    '''
+    pass # à compléter
+
+
+def trame_to_msg(trame : bytes, userId :int):
+    '''
+    Crée un objet Message à partir d'une trame brute recue.
+    1) Conversion de bytes en liste de int
+    2) Découpage de la liste de int dans l'ordre du protocole pour remplir l'objet Message
+    3) Check du CRC et du destinataire
+            Parameters:
+                    trame(bytes): payload au format bytes
+            Returns:
+                    msgObj(Message): Objet Message contenant tous les paramètres du message recu si crc et destinataire ok, sinon None
+    '''
+    pass # à compléter
+    
+    
+def ack_msg(msg : Message):
+    '''
+    Envoie un ack du message recu.
+    1) Création d'une liste de int correspondant au ack dans l'ordre du protocole
+    2) Conversion en bytes
+    3) Envoi
+            Parameters:
+                    msg(Message): Objet Message contenant tous les paramètres du message à acker
+    '''
+    pass # à compléter
+
+
+def receive_ack(msg: Msg):
+    '''
+    Attend un ack correspondant au message recu.
+    1) Récupère les messages recus
+    2) Conversion trame en objet Message
+    3) Check si le ack correspond
+            Parameters:
+                    msg(Message): Objet Message duquel on attend un ack
+            Returns:
+                    acked(bool): True si message acké, sinon False
+    '''
+    pass # à compléter
+    
+
+def send_msg(msgId:int, payload:List[int], userId:int, dest:int):
+    '''
+    Envoie un message.
+    1) Crée un objet Message à partir des paramètres
+    En boucle jusqu'à un timeout ou ack: 
+        2) Conversion objet Message en trame et envoi 
+        3) Attend et check le ack
+    4) Incrémentation du numéro de séquence
+            Parameters:
+                    msgId(int): Id du type de message
+                    payload(List[int]): liste contenant le corps du message
+                    userId(int): Id de Utilisateur·ice envoyant message
+                    dest(int): Id de Utilisateur·ice auquel le message est destiné
+            Returns:
+                    acked(bool): True si message acké, sinon False
+    '''
+    global seqNum
+    pass # à compléter
+
+def receive_msg(userId:int):
+    '''
+    Attend un message.
+    1) Récupère les messages recus
+    2) Conversion trame en objet Message
+    3) Check si ce n'est pas un ack
+            Parameters:
+                    userId(int): Id de Utilisateur·ice attendant un message
+            Returns:
+                    msgRecu(Message): Objet Message contenant tous les paramètres du message
+    '''
+    pass # à compléter
+
+
+if __name__ == '__main__':
+    
+    userId = 0
+
+    while True:
+        # Messages à envoyer
+        destId = 1
+        if button_a.was_pressed():
+            send_msg(1,[60],userId, destId)
+            
+
+                
+        # Reception des messages
+        m = receive_msg(userId)        
+        if m and m.msgId==1:
+            display.show(Image.SQUARE)
+    
+