Mysql Connector Insert Hilfe

Hallo

Ich bin mir sicher das mir der eine oder andere hier einen rat und tip geben kann.

Ich versuche gerade eine zutrittskontrolle zusammen zu bauen die mit hilfe eines Arduinos, Ethernet Shield und rfid modul über eine Mysql Datenbank prüft ob der jenige rein darf oder nicht.

ich konnte mir schon mit viel Google und Forum lesen weiter helfen aber jetzt trette ich schon seit geraumer zeit auf der Stelle.

Grunsätzlich geht es mir im moment darum das ich die ID vom rfid chip der vor den Sensor gehalten wird in eine Mysql Datenbank schreibe.

Die verbindung zu DB steht und ich kann auch einen statischen eintrag vor nehmen...
Was ich aber nicht hin bekomme ist das ich die unterschiedlichen rfid ids in das Insert bekomme.

Ich bin was Arduino angeht zimmlicher anfänger und hoffe auf nachsicht :wink:

Ich möchte auch keinen fertigen Code haben sondern einfach nur den Denk anstoss weil ich vermutlich einfach zu kompliziert denke.

#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <SPI.h>
#include <RFID.h>
#include <MySQL_Cursor.h>


//Ethernet SHield Konfiguration

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,177);

//Mysql Datenbank Konfiguration
IPAddress server_addr(192,168,0,245);  // IP of the MySQL *server* here
char user[] = "arduino";              // MySQL user login username
char password[] = "123456";        // MySQL user login password


EthernetClient client;
MySQL_Connection conn((Client *)&client);

//Pin belegung für das RFID Shield
#define SS_PIN 8 //SDA 
#define RST_PIN 9 //RST

RFID rfid(SS_PIN, RST_PIN);

String ids[2] = {"453B56D16", "8C3B3924AA"}; //Zugelassene ID's



void setup()
{
  Serial.begin(115200); // Aufbau der Seriellen verbindung für den Monitor
  SPI.begin();
  rfid.init();
  Ethernet.begin(mac_addr,ip); // Starten der IP Configuration

  IPAddress myIPAdress = Ethernet.localIP();
  Serial.println(myIPAdress);
  
  delay(1000);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
    // You would add your code here to run a query once on startup.
    Serial.println("Verbindung hergestellt.");
  }
  else
  {
    Serial.println("Connection failed.");
  }
  //conn.close(); // Datenbank verbindung wird geschlossen
}

void loop() {



  if (rfid.isCard() && rfid.readCardSerial()) {
    String serial = parseId(rfid);
    

    boolean serialOK = false;
    int counter = 0;
    for (counter = 0; counter < sizeof(ids)-1; counter++) {
      if (serial == ids[counter]) {
        serialOK = true;
        break;
      }
    }

    if (serialOK) {
      Serial.println("ID wurde gefunden!");
      Serial.print("RFID Nummer: ");
      Serial.println(serial);
      
      char INSERT_SQL[] = "INSERT INTO arduino.ardu_test (message) VALUES (serial)";

      Serial.println("Recording data.");
      // Initiate the query class instance
      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      // Execute the query
      cur_mem->execute(INSERT_SQL);
      // Note: since there are no results, we do not need to read any data
      // Deleting the cursor also frees up memory used
      delete cur_mem;

      
    } else {
      Serial.println("ID wurde nicht gefunden!");
    }
    delay(500);
  }

  rfid.halt();
}

String parseId(RFID rfid) {
  String result = "";
  int position = 0;
  for (position = 0; position <= 4; position++) {
    String pos = getNumPosAsHEX(rfid, position);
    result = result + pos;
  }
  result.toUpperCase();
  return result;
}

String getNumPosAsHEX(RFID rfid, int position) {
  return String(rfid.serNum[position], HEX);
}

So wie ich das verstehe wird ja die ID vom RFID Chip hier gespeichert
String serial = parseId(rfid);

Warum kann ich nicht einfach das "serial" in das Insert übertragen und gut ist?
LG

Wo ist die mySQL Datenbank?
Grüße Uwe

Die liegt in meinem Netzwerk auf einem Rasperry PI mit der ip 192.168.0.245
zugriff auf die Datenbank funktioniert ja soweit :slight_smile:

LG

Edit achso warte mal :smiley:

Tabellenstruktur für Tabelle `ardu_test`
--
CREATE TABLE `ardu_test` (
  `id` int(255) NOT NULL,
  `message` varchar(40) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Indizes der exportierten Tabellen
-- Indizes für die Tabelle `ardu_test`
--
ALTER TABLE `ardu_test`
  ADD PRIMARY KEY (`id`);

-- AUTO_INCREMENT für exportierte Tabellen

-- AUTO_INCREMENT für Tabelle `ardu_test`
ALTER TABLE `ardu_test`
  MODIFY `id` int(255) NOT NULL AUTO_INCREMENT;
COMMIT;

Edit:

      char INSERT_SQL[200]={0}
      sprintf (INSERT_SQL, "INSERT INTO arduino.ardu_test (message) VALUES (%s)",  serial);

Ich habe in Deinem Code message nicht gefunden und bin mir nicht sicher, ob das mit dem String funktioniert.
[edit2]
Ich kanns nicht kompilieren, hab die rfid-lib nicht am Mann.
Mit dem mysql-connect-basic-insert-example geht das.

Aber Du wolltest ja nur nen Anstoß :wink:

hmm
da bekomm ich als ausgabe fehler dann folgendes

Error: 160 = You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '
)' at line 1.

LG

Da fehlen Hochkommas (') um die Zeichenkette ('%s').

Gruß Tommy

Danke das hat zumindest den Fehler bereinigt.

Es wird zwar in die DB geschrieben aber anstelle von "8C266822E0" was die ID vom RFID sein sollte
wird in die spalte 2 Zeichen geschrieben Einmal ein Ö und als zweites Zeichen ein Quadrat.

Was ich noch nicht so ganz verstehe vielleicht kann mir das wer bitte erklären.

Bei

String serial = parseId(rfid);

Wird ja die RFID zusammen gebaut und als Leserlicher Buchstaben/Zahlencode ausgegeben oder?
Also in serial gespeichert.

den mit

Serial.println(serial);

bekomme ich ja 8C266822E0
herraus

warum kann ich nicht einfach das serial unter den VALUES eintragen und gut ist?

muss sagen in PHP ist das irgendwie einfacher :smiley:

LG

Weil ein concat von char-Array und String durch einfaches aneinderreihen mit Ergebnis char-Array gefordert ist.

Ups.
Das geht mit String nicht.
Ich hatte vorher ein charArray im Setup definiert ;( da gehts - @gaspark sorry.

warning: format '%s' expects argument of type 'char*', but argument 3 has type 'String*' [-Wformat=]

ok - dann muss aus dem String ein CharArray werden....

Nachtrag:
Ich habe einen String definiert.
Das wäre dann Deine ID und im Nachgang das so gebaut, das es fehlerfrei durchläuft.

Ich würde den ID-Code nicht als String bauen, sondern gleich als Char-Array. aber nur um das fehlerfrei durch zu bekommen:

  char serialArray[200]={0};
  serial.toCharArray(serialArray, sizeof(serial));
  sprintf (INSERT_SQL, "INSERT INTO arduino.ardu_test (message) VALUES (%s)",  serialArray);

kompiliert - aus dem Code heraus - fehlerfrei.
Ich verwende die my_sql_lib in V 1.2.0. vom März 2020, mit einigen Warnungen, die aber DeineM Ansinnen nicht entgegenstehen.

Lass den String weg und arbeite komplett mit char-Arrays.

Gruß Tommy

Was auch geht:

  Serial.println("Recording data.");
  char serialArray[200] = {0};
  serial.toCharArray(serialArray, sizeof(serial));
  char INSERT_SQL[] = "INSERT INTO arduino.ardu_test (message) VALUES (serialArray)";
  // Initiate the query class instance

Trotzdem: charArray! Ab Begin.

Vielen dank schon mal
ich musste allerdings noch einiges abändern

So siets JETZT bei mir aus

      char serialArray[200]={0};
      char INSERT_SQL[200]={0};
      serial.toCharArray(serialArray, 11); 
      sprintf (INSERT_SQL, "INSERT INTO arduino.ardu_test (message) VALUES ('%s')",  serialArray);
      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      // Execute the query
      cur_mem->execute(INSERT_SQL);

ich musste das hier hinzufügen wobei ich allerdings nicht weis für was das gut ist
weil ich beim Compilern eine meldung bekommen habe das INSERT_SQL nicht deklariert wurde

char INSERT_SQL[200]={0};

und

serial.toCharArray(serialArray, sizeof(serial)); 

musste ich in

serial.toCharArray(serialArray, 11); 

ändern da ich sonnst nur 8C266 anstelle von 8C266822E0
bekommen habe

Die Hochkomma bei '%s' hat das ganze dann abgerundet.

Aber so läuft das zumindest jetzt mal so

Auf jeden fall Vielen dank my_xy_projekt und Tommy56

Sorry - ich bin bin von Haus aus bei char-Array... ;(
Bei String ist es:

  serial.toCharArray(serialArray, serial.length());

Mach da niemals! einen festen Wert

rein!

ach ja serial.length()
hätte ich auch selber drauf kommen können
Damit aber auch alle 11 zeichen angezeigt werden muss ja noch ein +1 dazu
serial.length()+1

So klappt es zumindest dann bei mir

Dankeschön :hugs:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.