MessageLink#
Einführung#
MessageLink ermöglicht die Kommunikation zwischen zwei EXP Brains durch den Austausch kurzer Nachrichten mit optionalen kleinen Datenmengen. Es ist für die Roboter-zu-Roboter-Koordination konzipiert – beispielsweise zum Starten von Routinen, zum Teilen von Sensordaten oder zum Auslösen von Verhaltensweisen bei einem anderen Roboter.
Jede Verwendung von send fügt eine Nachricht zur Warteschlange des verknüpften EXP Brain hinzu. Die Warteschlange wird nach dem FIFO-Prinzip (First-In, First-Out) gelesen. Werden mehrere Nachrichten gesendet, bevor das andere EXP Brain receive verwendet, werden diese in der Reihenfolge ihres Versands gespeichert und zurückgegeben. Da Nachrichten in einer Warteschlange landen können, kann das wiederholte Senden desselben Status in jeder Schleife zu einem Rückstau führen. Senden Sie daher für zeitkritische Logik nur Nachrichten, wenn sich Werte ändern.
Wichtig: Beide Roboter müssen gleichzeitig Projekte ausführen, die MessageLink verwenden, sonst werden keine Nachrichten gesendet/empfangen.
Diese Seite verwendet link als Beispielnamen für „ MessageLink . Ersetzen Sie ihn bei Bedarf durch Ihren eigenen Namen.
Nachfolgend finden Sie eine Liste der verfügbaren Methoden:
is_linked– Gibt zurück, ob dieses Gehirn aktiv mit seinem gepaarten Gehirn verbunden ist.send– Sendet eine Nachricht an das gepaarte Gehirn.receive– Wartet auf die nächste eingehende Nachricht und gibt sie zurück.received– Registriert eine Funktion, die aufgerufen wird, sobald eine neue Nachricht empfangen wird.
Link erstellen#
Erstellen Sie auf beiden EXP Brains einen MessageLink, um einen Kommunikationskanal zwischen ihnen herzustellen – entweder drahtlos mit V5 Robot Radios oder über ein kabelgebundenes Smart Cable –, damit die Roboter sich gegenseitig Nachrichten senden können.
MessageLink(smartport, name, linktype, wired)
Parameter |
Beschreibung |
|---|---|
|
Der für diese Verbindung verwendete Smart Port – der Port, an den das V5 Robot Radio (drahtlos) oder das Smart Cable (kabelgebunden) angeschlossen ist. Er wird als |
|
Der eindeutige Name für diesen Link als Zeichenkette. |
|
Die Rolle, die dieses Brain für dieses Linkpaar verwendet. Jedes Paar muss einen Manager und einen Worker enthalten:
|
|
Optional. Ob diese Verbindung kabelgebunden oder drahtlos ist:
|
Code für Roboter 1
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Manager """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER)Code für Roboter 2
""" Create a wireless link in Port 1 name: VEXRoboticsLink123456789 linktype: Worker """ link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER)
Verfügbare Methoden#
Sobald MessageLink eingerichtet und die Brains verbunden sind, können Sie die folgenden Methoden verwenden, um Nachrichten zu senden, zu empfangen und zu beantworten.
is_linked#
Die Methode is_linked gibt zurück, ob die EXP Brains eines MessageLink miteinander gepaart sind.
True– Die beiden EXP Brains sind gepaart und kommunizieren über diese Verbindung.False– Die beiden EXP Brains sind über diese Verbindung nicht gekoppelt.
Hinweis: Es empfiehlt sich, zu Beginn eines Projekts immer zu überprüfen, ob die EXP Brains verknüpft sind, bevor weiterer Code ausgeführt wird.
Usage:
link.is_linked()
Parameter |
Beschreibung |
|---|---|
Diese Methode hat keine Parameter. |
Code für Roboter 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Code für Roboter 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
send#
send sendet eine Zeichenkette und/oder eine ganze Zahl und/oder eine Gleitkommazahl an das andere verbundene EXP Brain.
Usage:
send(string, integer, float)
Parameter |
Beschreibung |
|---|---|
|
Die Zeichenkette, die an das andere verbundene EXP Brain gesendet werden soll. |
|
Optional. Eine Ganzzahl, die an das andere verbundene EXP Brain gesendet werden soll. |
|
Optional. Eine Gleitkommazahl, die an das andere verknüpfte EXP Brain gesendet werden soll. Gleitkommazahlen werden auf vier Dezimalstellen formatiert; werden weniger Dezimalstellen angegeben, werden nachfolgende Nullen hinzugefügt, bis vier angezeigt werden. |
Wenn nur string gesendet werden, empfängt das andere verbundene EXP Brain genau diese Zeichenkette.
Wenn integer und/oder float enthalten sind, erhält das empfangende Gehirn eine einzelne kodierte Zeichenkette, die alle Felder in dieser Reihenfolge kombiniert: .string_integer_float
Beispiel: Bei Verwendung link.send(“string”, 1, 2.55) als .string_1_2.5500 empfangen.
Code für Roboter 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Code für Roboter 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Code für Roboter 1
# Tell the other robot where the screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") brain.screen.next_row() brain.screen.print("Tap to send circles") # Send the coordinates whenever the screen is pressed while True: if brain.screen.pressing(): x = brain.screen.x_position() y = brain.screen.y_position() link.send("touch", x, y) wait(10, MSEC)Code für Roboter 2
# Draw a circle where Robot 1's screen was pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") while True: # Get the full encoded string circle_coordinates = link.receive(200) if circle_coordinates: # Split the encoded string by _ parts = circle_coordinates.split("_") if len(parts) == 3: # Convert the coordinates back into numbers x = float(parts[1]) y = float(parts[2]) brain.screen.set_fill_color(Color.WHITE) brain.screen.draw_circle(x, y, 20) wait(10, MSEC)
receive#
receive gibt die nächste Nachricht aus der Warteschlange des anderen verbundenen EXP Brain zurück. Nachrichten werden in FIFO-Reihenfolge gelesen (älteste ungelesene zuerst). Wenn die Warteschlange leer ist, wenn receive aufgerufen wird, wartet sie bis zum angegebenen timeout auf eine neue Nachricht. Wenn innerhalb dieses Zeitfensters keine Nachricht eintrifft, gibt receive Nonezurück, und alle danach gesendeten Nachrichten bleiben in der Warteschlange, um beim nächsten Aufruf von receive gelesen zu werden.
Wenn das andere verbundene EXP Brain nur eine string, receive und gibt genau diese Zeichenkette zurück.
Wenn das andere verbundene EXP Brain eine Ganzzahl und/oder eine Gleitkommazahl gesendet hat, gibt receive eine einzelne kodierte Zeichenkette zurück, die alle Felder in dieser Reihenfolge kombiniert: .string_integer_float
Wenn beispielsweise das andere verknüpfte EXP Brain link.send(“string”, 1, 2.55)verwendet, gibt link.receive() eine kodierte Zeichenkette wie .string_1_2.5500zurück. Diese kodierte Zeichenkette lässt sich aufteilen (siehe Beispiele unten), um den Nachrichtennamen, die Ganzzahl- und die Gleitkommawerte zu extrahieren.
Wenn Sie das manuelle Aufteilen/Parsen lieber vermeiden möchten, verwenden Sie received, um einen Handler für einen bestimmten Nachrichtennamen zu registrieren; der Handler empfängt die gesendeten Werte als Argumente.
Usage:
receive(timeout)
Parameter |
Beschreibung |
|---|---|
|
Optional. Wartezeit in Millisekunden |
Code für Roboter 1
# Tell the other robot when the screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") # Continuously send if the screen is being pressed while True: if brain.screen.pressing(): link.send("pressed") else: link.send("released") wait(50, MSEC)Code für Roboter 2
# Display if the other robot's screen is being pressed # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) # Continuously check if Robot 1 has sent "pressed" while True: brain.screen.clear_screen() brain.screen.set_cursor(1, 1) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() if link.receive() == "pressed": brain.screen.new_line() brain.screen.print("Manager is being pressed!") wait(50, MSEC)
Code für Roboter 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Code für Roboter 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() math_problem = link.receive() if math_problem: # Split the encoded string by _ parts = math_problem.split("_") if len(parts) == 3: # Remove the . from the beginning of the string operator = "".join([c for c in parts[0] if c.isalpha()]) # Separate out the numbers for the operation a = int(parts[1]) b = float(parts[2]) # Use what operator was sent if operator == "add": result = a + b elif operator == "subtract": result = a - b # If neither add or subtract is sent, do nothing else: pass brain.screen.print("Result = ", result)
received#
received registriert eine Funktion, die aufgerufen werden soll, sobald das EXP Brain eine gesendete Nachricht empfängt.
Usage:
link.received(message, arg)
Parameter |
Beschreibung |
|---|---|
|
Der Name der zu vergleichenden Nachricht (Zeichenkette). Wenn der Name einer empfangenen Nachricht mit diesem Wert übereinstimmt, wird die Rückruffunktion |
|
Eine zuvor definierte Funktion, die ausgeführt wird, wenn das EXP Brain eine Nachricht empfängt, die mit |
received Rückruffunktion wird mit vier Argumenten aufgerufen:
Callback-Signatur:
callback(message, linkname, index, value)
Argument |
Beschreibung |
|---|---|
|
Der Name der empfangenen Nachricht (z. B. |
|
Der Name des Links, von dem die Nachricht empfangen wurde. |
|
Der mit der Nachricht gesendete ganzzahlige Wert (falls angegeben). |
|
Der mit der Nachricht gesendete Gleitkommawert (falls angegeben). |
Code für Roboter 1
# Send a math problem for the other Brain to solve # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.MANAGER) # Do not run code UNTIL the Brains are linked while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 1 - Manager") """ Change whether to "add" or "subtract", then what numbers to use in the operation. """ link.send("add", 7, 2.5)Code für Roboter 2
# Solve the math problem that the other Brain sends # Create the link link = MessageLink(Ports.PORT1, "VEXRoboticsLink123456789", VexlinkType.WORKER) while not link.is_linked(): wait(0.1, SECONDS) brain.screen.print("Robot 2 - Worker") brain.screen.next_row() # add if "add" is received def add_cmd(message, linkname, a, b): result = a + b brain.screen.print("Result = ", result) # subtract if ""subtract" is received def subtract_cmd(message, linkname, a, b): result = a - b brain.screen.print("Result = ", result) # Create event handlers for "add" and "subtract" link.received("add", add_cmd) link.received("subtract", subtract_cmd)