Projet Escape No Game

Ce projet explore la transmission de messages via des ondes radio. Il s'agit d'un exercice de compréhension et de maîtrise des principes de la communication par radiofréquences.

Image du projet Escape No Game

Code du Projet

import numpy as np                   #Ce module permet d’effectuer des calculs numériques avec Python
import matplotlib.pyplot as plt      #Ce module permet de créer et personnaliser des graphiques
import sounddevice as sd             #Ce module permet de jouer un son




Message = str(input('Entrez le message à envoyer : '))



total_binary=''                         #Création d'une chaîne de caractère vide "total_binary" qui va contenir le message binaire complet
for i in range(len(Message)):           #Création d'une boucle for qui se répètera jusqu'à atteindre la valeur de la taille du message en partant de 0
    binary=''                           #Création d'une chaîne de caractère vide "binary" qui va stocker les 7 bits correspondant à chaque lettre du message
    string_ord = ord(Message[i])        #Renvoie le décimal correspondant à chaque caratère de la chaîne de caractère
    while string_ord>0:                 #Boucle tant que se répétant tant que la décimale du caractère est supérieure à 0
        x = string_ord % 2              #Stockage du reste de la division euclidienne de la décimale par 2
        string_ord = string_ord // 2    #Stockage du résultat de la division euclidienne de la décimale par 2 sans le reste.
        binary = str(x) + str(binary)   #Stockage de chaques reste correcpondants à un bit (0 ou 1)
    total_binary += binary              #Stockage et ajout du code binaire (7 bits) correspondant à chacune des lettres du message

print(total_binary)                     #Affichage du message binaire complet



def xor(a,b):
    resultat = []                                     #Initialisation du résultat sous forme d'une liste vide
    for i in range(1,len(b)):                         #Création d'une boucle pour appliquer la fonction XOR (si les bits sont les même, alors XOR vaut 0, sinon XOR vaut 1)
        if a[i]== b[i]:                               #Création d'un conditionnel if qui va comparer 2 bits et appliquer la fonction XOR
            resultat.append('0')                      #Ajout de le caractère '0' à la liste resultat
        else:
            resultat.append('1')                      #Ajout de le caractère '1' à la liste resultat
    return ''.join(resultat)                          #On retourne les données de la fonction XOR sous forme d'une chaîne de caractères sans espaces



def Division_eucl(divident,diviseur):
    val = len(diviseur)                               #Stockage de la taille du diviseur dans la variable "val"
    tmp = divident[0 : val]                           #Stockage des val-premières données du divident
    while valRes2[i]:                              #Conditionnel if qui vérifie si la i-ème valeur de Res1 est supérieure à la i-ème valeur de Res2
        y.append(1)                                  #Ajout de la valeur 1 à la liste "y" si la condition est vérifiée
    if Res1[i]0                                         #Si >0 renvoie True, sinon renvoie False

message_recu_decode=[]                                                   #Initialisation d'une liste vide
for iii in range(0,len(message_demodule)):                               #Boucle for allant de 0 à la valeur de la taille de "message_demodule"
    if message_demodule[iii]==True:                                      #Conditionnel if qui vérifie si la iii-ème valeur de "message_demodule" est égale à "True"
        message_recu_decode.extend([int(1)])                             #Ajout de la valeur 1 à la liste "message_recu_decode" si la condition est vérifiée
    if message_demodule[iii]==False:                                     #Conditionnel if qui vérifie si la iii-ème valeur de "message_demodule" est égale à "False"
        message_recu_decode.extend([int(0)])                             #Ajout de la valeur 0 à la liste "message_recu_decode" si la condition est vérifiée

message_recu_bin=[]                                                      #Initialisation d'une liste vide
for iiii in range(0, len(message_demodule),2):                           #Boucle for allant de 0 à la valeur de la taille de "message_demodule" par pas de 2 afin de revenir à un bit et non 2 bits par état
    if message_recu_decode[iiii]==1 and message_recu_decode[iiii+1]==0:  #Conditionnel if qui vérifie si la iiii-ème valeur de "message_recu_decode" est égale à 1 et si la (iiii+1)-ème valeur de "message_recu_decode" est égale à 0
        message_recu_bin.extend([str(1)])                                #Ajout d'un caractère 1 à la liste mesage_recu_bin si la condition est vérifiée
    if message_recu_decode[iiii]==0 and message_recu_decode[iiii+1]==1:  #Conditionnel if qui vérifie si la iiii-ème valeur de "message_recu_decode" est égale à 0 et si la (iiii+1)-ème valeur de "message_recu_decode" est égale à 1
        message_recu_bin.extend([str(0)])                                #Ajout d'un caractère 0 à la liste mesage_recu_bin si la condition est vérifiée
print(message_recu_bin)                                                  #Affichage de la liste de caractères "message_recu_bin" contenant le message initial envoyé par l'agent après avoir été codé en CRC




 #conversion liste en chaine de caractère
message_réceptionné=''.join(message_recu_bin)
print(message_réceptionné)




#Définition de la fonction de décodage
def decodage(data_crc, key):
    length_key = len(key)                                                #Stockage de la taille de la clé
    data_ajout = data_crc + '0'*(length_key-1)                           #Ajout des '0' en fonction de la taille de la clé-1
    reste = Division_eucl(data_ajout, key)                               #Stockage du reste de la division euclidienne du message auquel on ajouté les 0 par la clé
    return reste                                                         #On retourne la valeur du reste

key = '11010'                                                            #Initialisation de la clé (c'est la même que dans la phase d'émission)
check = decodage(message_réceptionné, key)                               #Récupération du reste de la division euclidienne du message réceptionné par la clé
print("Le reste de la division après décodage est ->" +check)            #Affichage du reste de la division après décodage
temp = "0" * (len(key) - 1)                                              #Récupération du message de base
if check == temp:                                                        #Conditionnel if qui vérifie si check est égal à temp
    print("Les données -> "+message_réceptionné +"<- sont bien reçues!") #Affichage d'un message de confirmation de la validité du message si la condition est vérifiée
else:       
    print("Erreur de réception")                                         #Affichage d'un message d'erreur si la condition n'est pas vérifiée
    
    
    
    
    
#Définition de la fonction de conversion du binaire en décimale
def BinaryToDecimal(binary):  
    #initialisation des variables
    decimal = 0
    i = 0
    n = 0
    while(binary != 0):                            #Boucle tant que qui s'execute tant que le code binaire est différent de 0
        dec = binary % 10                          #On récupère le reste de la division euclidienne du code binaire par 10
        decimal = decimal + dec * pow(2, i)        #On récupère la décimale correspondant au code binaire
        binary = binary//10                        #On effectue la division euclidienne du code binaire par 10 sans récupérer le reste
        i += 1                                     #On incrémente i de 1
    return (decimal)                               #On retourne la valeur décimale du code binaire entré

#Conversion du message binaire en texte via la table ASCII
Total_texte=''                                     #Initialisation d'une chaîne de caractère vide
for i in range(0,len(message_réceptionné),7):      #Boucle for allant de 0 à la taille de "message_réceptionné"
    bin_data=int(message_réceptionné[i:i+7])       #Stockage des 7 bits correspondant à une lettre
    decimal_data = BinaryToDecimal(bin_data)       #Conversion du code binaire (7 bits) en décimal
    Total_texte = Total_texte + chr(decimal_data)  #Conversion de la décimale en texte puis ajout du caractère à la liste "Total_teste"
    
    
    
    
    
#Affichage du message
print(Total_texte)




verification = int(check,2)             #Conversion de "check" binaire en décimal provenant du décodage CRC
FeA=44100                               #Initialisation de la fréquence d'échantillonnage pour un signal de fréquence comprise dans le spectre de l'audible par l'oreille humaine
t=np.arange(0,0.2,1/FeA)                #Génération d'un vecteur temps de durée 0.2s (ce temps nous parrait suffisant pour un accusé de réception(bip sonore) mais il reste mdifiable)
Accusé_réception=np.sin(2*np.pi*5000*t) #Génération d'un signal quelconque de fréquence 5 000Hz
if verification == 0:                   #Conditionnel if qui vérifie si le message est bien reçu
    sd.play(Accusé_réception, FeA)      #Émission du message sous forme de signal (Jouer le son) si la condition est vérifiée, sinon pas d'accusé de réception
    
    
    
    
    
    

    
Retour au portfolio