diff --git a/Protocole/main.py b/Protocole/main.py new file mode 100644 index 0000000000000000000000000000000000000000..5966010b8763bb704e5784ceb0c97de39197ba3c --- /dev/null +++ b/Protocole/main.py @@ -0,0 +1,35 @@ +''' +Protocole Réseau Pour Micro:bit OC Robotique 2025 +Auteur·ice : Vincent Namy +Version : 1.0 +Date : 28.1.25 + +TODO : +- Encryption +- passer trame en bytes ? +''' + + +from protocole import * +import music + +userId = 0 + +while True: + + if button_a.was_pressed(): + if send_msg(1,[],userId, 1): + display.show(Image.HAPPY) + else: + display.show(Image.SAD) + + sleep(100) + display.clear() + + + m = receive_msg(userId) + if m and m.msgId==1: + music.pitch(600, duration=100, pin=pin0) + elif m and m.msgId==2: + display.show(Image.SQUARE) + diff --git a/Protocole/protocole.py b/Protocole/protocole.py new file mode 100644 index 0000000000000000000000000000000000000000..bc65f69dcaca3c698331fe6831be8c5dcf00bdf5 --- /dev/null +++ b/Protocole/protocole.py @@ -0,0 +1,139 @@ +''' +Protocole Réseau Pour Micro:bit OC Robotique 2025 +Auteur·ice : Vincent Namy +Version : 1.0 +Date : 28.1.25 + +TODO : +- Encryption +- passer trame en bytes ? +''' + +#### Libraries #### +from microbit import * +import radio + +#### Variables globales #### +seqNum = 0 +tryTime = 100 +Timeout = 500 +ackMsgId = 0 + +#### 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): + self.exped = exped + self.dest = dest + self.seqNum = seqNum + self.payload = payload + self.crc = crc + self.msgId = msgId + def msgStr(self): + return "[n" + str(self.seqNum)+ "] "+ str(self.exped)+ " -> "+ str(self.dest)+ " : type "+ str(self.msgId)+" : " +str(self.payload)+ " (crc="+ str(self.crc)+")" + +#### Toolbox #### +def bytes_to_int(bytesPayload:bytes): + intPayload = [] + for i in bytesPayload: + intPayload.append(ord(bytes([i]))) + return intPayload + +def int_to_bytes(intPayload:List[int]): + return bytes(intPayload) + + +#### Fonctions réseaux #### +def msg_to_trame(rawMsg : Message): + l = [rawMsg.dest, rawMsg.exped, rawMsg.seqNum, rawMsg.msgId] + rawMsg.payload + rawMsg.crc = sum(l)%255 # ? + return l + [rawMsg.crc] + + +def trame_to_msg(trame : List[int], userId :int): + msgObj = Message(trame[0], trame[1], trame[2], trame[3], trame[4:-1], trame[-1]) + if msgObj.crc == sum(trame[:-1])%255: + if msgObj.dest != userId : +# print("Not for me") + return None + else: +# print(msgObj.msgStr()) + return msgObj + + +def ack_msg(msg : Message): + ack = [msg.exped, msg.dest, msg.seqNum, ackMsgId] + ack += [sum(ack)%255] + radio.send_bytes(bytes(ack)) + print(ack) + sleep(100) + + +def receive_ack(msg: Msg): + new_trame = radio.receive_bytes() + if new_trame: + msgRecu = trame_to_msg(bytes_to_int(new_trame), msg.exped) +# print("Reçu Ack : ", msgRecu.msgStr()) + return msgRecu.exped == msg.dest and msgRecu.dest == msg.exped and msgRecu.seqNum == msg.seqNum and msgRecu.msgId == ackMsgId + else: + return False + + +def send_msg(msgId, payload: List[int], userId:int, dest:int): + global seqNum + + msg = Message(dest, userId, seqNum, msgId, payload,0) + + acked = False + t0 = running_time() +# print("Envoyé : ", msg.msgStr()) + + while not acked and running_time()-t0 < Timeout: +# print("envoi") + radio.send_bytes(bytes(msg_to_trame(msg))) + sleep(tryTime//2) + display.clear() + sleep(tryTime//2) + acked = receive_ack(msg) +# print("acked : ", acked) + #print(running_time()-t0) + + seqNum += 1 + return acked + +def receive_msg(userId:int): + new_trame = radio.receive_bytes() + if new_trame: + msgRecu = trame_to_msg(bytes_to_int(new_trame), userId) + #print("Reçu : ", msgRecu.msgStr()) + if msgRecu.msgId != ackMsgId: + ack_msg(msgRecu) + return msgRecu + + +if __name__ == '__main__': + + userId = 0 + + while True: + + if button_a.was_pressed(): + if send_msg(1,[10, 22],userId, 1): + display.show(Image.HAPPY) + else: + display.show(Image.SAD) + + sleep(100) + display.clear() + + m = receive_msg(userId) + + if m and m.msgId==1: + display.show(Image.SQUARE) + sleep(100) + display.clear() +