From ff6ff78b4c159b5ca93c3301596318f9afd83776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anian=20B=C3=BChler?= <anian.buehler@reutlingen-university.de> Date: Tue, 13 Jul 2021 11:58:00 +0200 Subject: [PATCH] Updated Chat.ino and removed Server.ino --- examples/sPSN_Chat/sPSN_Chat.ino | 162 ++++++++++--------------- examples/sPSN_Client1/sPSN_Client1.ino | 5 +- examples/sPSN_Server/sPSN_Server.ino | 58 --------- 3 files changed, 65 insertions(+), 160 deletions(-) delete mode 100644 examples/sPSN_Server/sPSN_Server.ino diff --git a/examples/sPSN_Chat/sPSN_Chat.ino b/examples/sPSN_Chat/sPSN_Chat.ino index 2158429..60fa1d3 100644 --- a/examples/sPSN_Chat/sPSN_Chat.ino +++ b/examples/sPSN_Chat/sPSN_Chat.ino @@ -1,84 +1,67 @@ /** - *file: sPSN_Chat.ino - *author: letsgoING -> info@letsgoing.de + * file: sPSN_Chat.ino + * author: letsgoING -> info@letsgoing.de + * + * description: + * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk. * - *description: - * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk. - - * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt: + * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt: * - * Arduino1: sPSN_Broker.ino - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Arduino1: sPSN_Broker.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 * - * Arduino2-n: sPSN_Chat.ino (dieses Programm) - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Arduino2-n: sPSN_Chat.ino (dieses Programm) + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 * Funktion: - * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. - * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). - * Arduino1 (Server) übernimmt das Verteilen der Nachrichten. + * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. + * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). + * Arduino1 (Server) übernimmt das Verteilen der Nachrichten. * - *date: 14.12.2020 - *version: 1.0 - */ - + * parameter: + * MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h) + * MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h) + * max Laenge der Eingegebenen Daten: 100 Zeichen (5*MAX_LEN_PAYLOAD) + * + * date: 13.07.2021 +*/ +#include <Arduino.h> #include "SoftwareSerial.h" #include "didacticNet.h" -//lege Geschwindigkeit für serielle Schnittstellen fest -#define SERIAL_BAUD 2400 - - -unsigned long lastTime = 0L; +#define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest -bool dataReadDone = false; +char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; //Array für eingelesene Daten (mit Puffer für zu lange Eingaben) -//Maximale Nachrichten- und Topic-Länge: -//MAX_LEN_PAYLOAD = 20 Zeichen -//MAX_LEN_TOPICS = 10 Zeichen -//kann erhöht werden (z. B. #define MAX_LEN_TOPICS 20) , dann aber Arduino-Mega als Server sinnvoll +char topicSub[MAX_LEN_TOPICS] = {""}; //Array für neues Empfangs-Topic +char topicPub[MAX_LEN_TOPICS] = {""}; //Array für eigenes Sende-Topic -char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; -char arrayBuffer[MAX_LEN_PAYLOAD + 1] = {'\0'}; -int counter = 0; - -//Arrays für Empfangs- und Sende Topic -char topicSub[MAX_LEN_TOPICS] = {""}; -char topicPub[MAX_LEN_TOPICS] = {""}; - -void myCallback(char* mTopic, int mToLength, char* mData, int mDaLength) { +//Callback-Funktion wird bei neuen Daten automatisch aufgerufen +void clientCallback(char* mTopic, int mToLength, char* mData, int mDaLength) { Serial.print(mTopic); Serial.print(":\t"); Serial.println(mData); } -//lege Pins für SoftwareSerielle Schnittstelle fest -// Rx = 10 -> Empfänger | Tx = 11 -> Sender -SoftwareSerial sSerial(10, 11); +SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender -//Erzeuge Client-Instanz -didacticPSNetClient psnClient; +didacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz void setup() { - //Starte Serielle Schnittstelle (zum PC) - Serial.begin(SERIAL_BAUD); - - //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) - sSerial.begin(SERIAL_BAUD); - //Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll - //psnClient.setStream(sSerial); + Serial.begin(SERIAL_BAUD); //Starte Serielle Schnittstelle (zum PC) - //Lege Callback-Funktion fest (wird ausgeführt wenn neue Daten ankommen) - //psnClient.setCallback(myCallback); + sSerial.begin(SERIAL_BAUD); //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) - psnClient.begin(sSerial, myCallback); + psnClient.begin(sSerial, clientCallback); //Starte PubSubClient mit SoftwareSerial und Callbackfunktion "clientCallback" + //AUSGABE INFOTEXT Serial.print("Bitte den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> "); Serial.println("#DeinName"); Serial.print("Gebe dann die Namen deiner Chatpartner mit einem @ ein. -> "); Serial.println("@ChatPartner"); - Serial.println("Anschließend kannst du mit ihnen schreiben"); + Serial.println("Anschließend kannst du mit ihnen schreiben."); + Serial.println("Pro Nachricht duerfen maximal 20 Zeichen eingegeben werden!"); Serial.println(); Serial.println("HINWEIS:"); Serial.println("Stelle das Zeilenende im SerialMonitor auf \"Zeilenumbruch (CR)\""); @@ -86,60 +69,37 @@ void setup() { } void loop() { - //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten - psnClient.handleNetwork(); - - //Lese Daten ein bis zum Zeichen Zeilenumbruch "CR" - if (Serial.available()) { - char buffer = Serial.read(); - readData[counter] = buffer; - //Wenn Zeilenumbruch "CR", dann merke, dass Einlesen fertig - //und setze String Abschluss "\0" ans Ende - if (buffer == 13) { - readData[counter] = '\0'; - counter = 0; - dataReadDone = true; - } else { - counter++; - } - } - //Wenn Daten fertig eingelesen wurden - if (dataReadDone && strlen(readData) <= MAX_LEN_PAYLOAD * 5 ) { - //Wenn "@" vorne steht, dann neuer Chatpartner anlegen (neues Topic dem zugehört wird) - if (readData[0] == '@') { - //kopiere das neue Topic (den Namen des Chatpartners) in das passende Array - strcpy(readData, readData + 1); - //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) - psnClient.subscribe(readData); - Serial.print("Kontakt zu "); + psnClient.handleNetwork(); //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten + + int nrOfAscii = readSerialData(Serial, readData, 13); //Einlesen der Nutzereingabe am SerialMonitor (Rueckgabewert = Anzahl der gelesenen Zeichen) + + if (nrOfAscii > 0) { //Wenn Daten fertig eingelesen wurden + + if (readData[0] == '@') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + strcpy(readData, readData + 1); //verschiebe um ein Zeichen (entferne '@') + psnClient.subscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + + Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde Serial.print(readData); - Serial.println(" hergestellt"); + Serial.println(" abonniert"); } - //Wenn "#" vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) - else if (readData[0] == '#') { - //kopiere das neue Topic (deinen neuen Namen) in das passende Array - strcpy(topicPub, readData + 1); - Serial.print("Dein Name:\t"); + + else if (readData[0] == '#') { //Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) + strcpy(topicPub, readData + 1); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') + + Serial.print("Dein Name:\t"); //Ausgabe unter welchem Topic veröffentlicht wird Serial.println(topicPub); } - //Wenn normale Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden - else { - for (int i = 0; i * MAX_LEN_PAYLOAD < strlen(readData); i++) { - memset(arrayBuffer, '\0', MAX_LEN_PAYLOAD + 1); - strncpy(arrayBuffer, &readData[MAX_LEN_PAYLOAD * i], dataReadDone); - //Serial.print("ReadData: ");Serial.print(readData);Serial.print("\t");Serial.print(arrayBuffer); - psnClient.publish(topicPub, arrayBuffer); - //Solange Daten zu versenden sind (wenn Text länger als max Länge einer Nachricht) - while (psnClient.isDataToSend()) { - //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten - psnClient.handleNetwork(); - } - Serial.print("Ich:\t"); - Serial.println(arrayBuffer); - } + + else { //Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden + readData[MAX_LEN_PAYLOAD] = '\0'; //Schreibe String-Ende an letzte Stelle im Array + psnClient.publish(topicPub, readData); //Bereite eingegebene Daten zum Senden vor + + Serial.print("Ich:\t"); //Ausgabe was unter deinem Topic veröffentlicht wird + Serial.println(readData); + } - dataReadDone = false; } -} +} \ No newline at end of file diff --git a/examples/sPSN_Client1/sPSN_Client1.ino b/examples/sPSN_Client1/sPSN_Client1.ino index b432b02..667ace5 100644 --- a/examples/sPSN_Client1/sPSN_Client1.ino +++ b/examples/sPSN_Client1/sPSN_Client1.ino @@ -14,9 +14,12 @@ * Arduino3: sPSN_Client2.ino -> Sendet Zustand des Tasters | Empfängt Wert des Potis * (Taster an Pin2 | LED an Pin5) * + * parameter: + * MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h) + * MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h) + * *date: 06.07.2021 */ - #include <Arduino.h> #include "SoftwareSerial.h" #include "didacticNet.h" diff --git a/examples/sPSN_Server/sPSN_Server.ino b/examples/sPSN_Server/sPSN_Server.ino deleted file mode 100644 index 083672c..0000000 --- a/examples/sPSN_Server/sPSN_Server.ino +++ /dev/null @@ -1,58 +0,0 @@ -/** - *file: sPSN_Server.ino - *author: letsgoING -> info@letsgoing.de - * - *description: - * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Netzwerk. - * - * Für ein Sensor-Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt: - * Arduino1: sPSN_Broker.ino (dieses Programm) - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * Arduino2: sPSN_Client1.ino - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * - Taster an Pin2 - * - LED an Pin9 - * Arduino3: sPSN_Client2.ino - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * - Poti an PinA0 - * - LED an Pin9 - * - * Für ein Chat-Netzwerk werden mindestens 3 Arduinos benötigt: - * Arduino1: sPSN_Server.ino (dieses Programm) - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * Arduino2-n: sPSN_Chat.ino - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * - *date: 14.12.2020 - *version: 1.0 - */ - -#include "SoftwareSerial.h" -#include "didacticNet.h" - -//lege Geschwindigkeit für serielle Schnittstellen fest -#define SERIAL_BAUD 2400 - -//lege Pins für SoftwareSerielle Schnittstelle fest -// Rx = 10 -> Empfänger | Tx = 11 -> Sender -SoftwareSerial sSerial(10, 11); - -//Erzeuge Broker-Instanz -didacticPSNetBroker psnBroker; - -void setup() { - //Starte Serielle Schnittstelle (zum PC) - Serial.begin(SERIAL_BAUD); - - //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) - sSerial.begin(SERIAL_BAUD); - - //Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll - //psnBroker.setStream(sSerial); - psnBroker.begin(sSerial); -} - -void loop() { - //hier verarbeitet der Server alle Daten - psnBroker.handleNetwork(); -} -- GitLab