Skip to content
Snippets Groups Projects
Commit ff6ff78b authored by Anian Bühler's avatar Anian Bühler
Browse files

Updated Chat.ino and removed Server.ino

parent eed80fb8
No related branches found
No related tags found
2 merge requests!3Dev to master,!2Dev to Master
......@@ -4,7 +4,7 @@
*
* 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:
*
* Arduino1: sPSN_Broker.ino
......@@ -17,68 +17,51 @@
* 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
......@@ -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"
......
/**
*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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment