Arduino Daten an MS-SQL

Hallo,

hat von euch schon jemand erfolgreich mit dem Ethernet-Shield (W5100) Daten an einen MS-SQL-Server geschickt ?

Ich habe bisher leider keinen Erfolg mit der einzigen von mir gefundenen Library .
Nachfolgender Sketch (leicht abgwandelt) bringt nach einem Timeout “Anmeldefehler”.
Somit kann er den Server nicht erreichen.

Ich habe auch schon ein wenig mit den IP’s gespielt, da mir die Gateway-IP in der Anmeldung zum Server nicht korrekt vorkommt. Da habe ich die Adresse zum MS-SQL-Server eingetragen. Aber auch das funktioniert nicht.

Evl. hat ja jemand eine Idee.

//MSSQL_Connector

#include <UIPEthernet.h>        // https://github.com/mustafakemalgilor/arduino-mssql
#include "sqlard.h"

uint8_t Ethernet_MacAddr[6] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; /* MAC ADRESİ */

static byte Static_IPAddr[] = { 192, 168, 100, 170 };
static byte Gateway_IPAddr[] = { 192, 168, 100, 254 };
static byte Subnet_Mask[] = { 255, 255, 0, 0 };

EthernetClient client; // Create a client

SQLard MSSQL(Gateway_IPAddr, 1433, &client); // Create the connection with the Server Data Base


void setup()
{
  Serial.begin(115200);
  Serial.println("Start");

  Ethernet.begin(Ethernet_MacAddr, Static_IPAddr, Gateway_IPAddr, Gateway_IPAddr, Subnet_Mask); // Establish the connection of the client with the server
  Serial.println("Server anmelden");
  
  if (MSSQL.connect()) // Check if the connection with the Data Base is correct
  {
    Serial.println("Anmeldung ok");
    
    MSSQL.setCredentials(L"arduino", L"ard_login", L"ard_password", L"hostx"); // Login to the Data Base
    MSSQL.login(); // Now we are able to send queries
  }
  else
  {
    Serial.print("Anmeldefehler");
  }
}

void loop()
{

}

Die loop habe ich erst mal leer gelassen, da schon die Anmeldung nicht läuft.

Danke fürs Lesen.

HotSystems:
Evl. hat ja jemand eine Idee.

static byte Static_IPAddr[] = { 192, 168, 100, 170 };

static byte Gateway_IPAddr = { 192, 168, 100, 254 };
static byte Subnet_Mask = { 255, 255, 0, 0 };

[....]

Ethernet.begin(Ethernet_MacAddr, Static_IPAddr, Gateway_IPAddr, Gateway_IPAddr, Subnet_Mask);

[....]

SQLard MSSQL(Gateway_IPAddr, 1433, &client);




Die loop habe ich erst mal leer gelassen, da schon die Anmeldung nicht läuft.

Das mit loop() gut gemacht...

Aufklärung bei Ethernet.begin:
Der Verfasser benutzt für den DNS-Server als auch den Gateway ein und die selbe Adresse.
Halt alles in einem Gerät. Dafür benötigt er keine weitere Variable und benutzt Gateway_IPAddr zweimal.

Der Gateway wird nur dann benötigt, wenn die Ziel-IP (der MSSQL-Server) in einem anderen Netzwerk(segment) steht.
Der DNS nur dann, wenn Du mit Namen statt IP-Adressen arbeitest.

Referenz: Arduino - EthernetBegin

Gleichzeitig ist MSSQL auch auf dem selben System aktiv. Ist halt ein Server. Für zuhause gerne SmallBusiness

Du musst für Dich erstmal festlegen, wie die Netzwerkkonfig aussieht.
Welche IP hat der MSSQL-Server? Welches Subnetz bedient der Server?
Steckt der Arduino im selben Netzwerk?
Wenn ja, kannst Du auf DNS und Gateway verzichten, dann reicht mac und IP für Ethernet.begin und ich würde für den MSSQL dann eine eigene Variable verwenden.

Beschreib mal, wie Deine Netzwerkkonfig ist und wo der Server steht. Letzteres könnte wichtig sein, wegen möglicher Firewall.

Hallo,

danke für deine Ausführungen.
Allerdings habe ich die (fast alle) zuvor schon berücksichtigt.

Dies ist meine Config:

static byte Static_IPAddr[] = { 192, 168, 100, 170 };
static byte Dns_IPAddr[] = { 192, 168, 100, 10 };
static byte Gateway_IPAddr[] = { 192, 168, 100, 254 };
static byte Subnet_Mask[] = { 255, 255, 255, 0 };

static byte Server_IPAddr[] = { 192, 168, 100, 31 };

Der MSSQL (Express) ist auf dem lokalen Rechner. Firewall ist konfiguriert (Portfreigabe).
Auch der Express ist konfiguriert.
Auch ein zweiter MSSQL im Netz geht nicht.

Und mit nur Mac und IP kommt keine Anmeldung.
Und alles ist im selben Netzwerk.

HotSystems:
Hallo,

danke für deine Ausführungen.
Allerdings habe ich die (fast alle) zuvor schon berücksichtigt.

Der MSSQL (Express) ist auf dem lokalen Rechner. Firewall ist konfiguriert (Portfreigabe).
Auch der Express ist konfiguriert.
Auch ein zweiter MSSQL im Netz geht nicht.

Ich hab leider aktuell keinen SBS am laufen, kann mich aber dran erinnern, das ich mich auch rumgeschlagen habe mit der Konfiguration.

Vielleicht nochmal drübersehen, ob nicht doch was vergessen wurd:

Und mit nur Mac und IP kommt keine Anmeldung.
Und alles ist im selben Netzwerk.

Das ist komisch.

Kannst Du nen Wireshark mitlaufen lassen um zu sehen, was an Datenaustausch passiert?

HotSystems:
Der MSSQL (Express) ist auf dem lokalen Rechner. Firewall ist konfiguriert (Portfreigabe).
Auch der Express ist konfiguriert.

Der Zugriff via IP geht sonst?

Ggfls nochmal zum prüfen:

"Zum nächsten schalten Sie TPC/IP an, damit der andere Computer in SQL Server durch IP verbinden können."

Wenns da auch ok ist, bin ich erstmal überfragt.

Hast Du mal probiert, von einem anderen Rechner aus mit einem DB-Tool (z.B. DBeaver) auf die DB zuzugreifen?

Bei MySQL kenne ich das Problem, dass der DB-ser nur für localhost berechtigt ist. MS-SQL kenne ich nicht.

Gruß Tommy

Hallo und danke für euer Interesse.

Alle meine SQL-Server (3 Stk.) sind von allen Rechner erreichbar. Ich schließe hier das Problem aus.

Es muss an der Konfiguration des Arduino/Ethernetshield liegen.
Ich habe auch schon mit VB und VB-Net Tools programmiert, mit denen ich auf die Server zugreifen kann.
Unter Windows gibt es das Tool “*.udl”, damit kann man den Zugriff prüfen, auch das geht.

Mal sehen, ob noch Tipps kommen.
Erst mal danke.

Ist Gateway_IPAddr wirklich die IP des SQL-Servers? Der ist auf einem Gateway zumindest ungewöhnlich.

Gruß Tommy

HotSystems:
Mal sehen, ob noch Tipps kommen.

Ich hab morgen wieder ein 16.04 ubuntu, da lässt sich der MSSQL auch aufsetzen - ist ja kein Hexenwerk, aber da bin ich jetzt angefixt :wink:

Tommy56:
Ist Gateway_IPAddr wirklich die IP des SQL-Servers? Der ist auf einem Gateway zumindest ungewöhnlich.

Aehm, nein - seine aktuelle Konfig ist in #2. Und da passt’s schon.

Tommy56:
Ist Gateway_IPAddr wirklich die IP des SQL-Servers? Der ist auf einem Gateway zumindest ungewöhnlich.

Gruß Tommy

Das war die Config des Beispiels.
Habe ich nur mal so getestet, ist aber nicht meine aktuelle Einstellung.
Die steht in #2.

my_xy_projekt:
Ich hab morgen wieder ein 16.04 ubuntu, da lässt sich der MSSQL auch aufsetzen - ist ja kein Hexenwerk, aber da bin ich jetzt angefixt :wink:

Das wäre schon interessant, wenn es keine Umstände macht. :wink:

HotSystems:
Das wäre schon interessant, wenn es keine Umstände macht. :wink:

Da der WAF bei 10++ lag, hab ich mir erlaubt auf 18.04. einen MSSQL-Server zu bauen und auf einer anderen 18.04. einen Azure-Databasemanager.

Soweit, sogut. Es läuft.

Jetzt läuft der Testcode nicht ;(

Ich brauche den Testcode von Dir und (!) die Ausgaben, welche Bibliotheken verwendet werden. Bei mir schreit es nur so von nicht vorhandenen Variablen…

my_xy_projekt:
Ich brauche den Testcode von Dir und (!) die Ausgaben, welche Bibliotheken verwendet werden. Bei mir schreit es nur so von nicht vorhandenen Variablen.....

Im ersten Post ist alles verlinkt.
Als Lib nur die sqlard.h verwenden.
Auch der Sketch ist vorhanden oder du nimmst den von mir geposteten.

HotSystems:
Im ersten Post ist alles verlinkt.
Als Lib nur die sqlard.h verwenden.
Auch der Sketch ist vorhanden oder du nimmst den von mir geposteten.

Ich kanns hier nicht kompilieren - auf 1.8.9 - egal was ich mache.
Im Example ist ethernet.h eingebunden
Damit gibts die Meldung das UIPEthernet fehlt.

#1 - unverändertes Example

/home/aa/Arduino/libraries/arduino-mssql-master/sqlard.h:13:27: fatal error: UIPEthernet.h: No such file or directory
compilation terminated.
Bibliothek Ethernet in Version 2.0.0 im Ordner: /home/aa/arduino/libraries/Ethernet  wird verwendet
Bibliothek arduino-mssql-master im Ordner: /home/aa/Arduino/libraries/arduino-mssql-master (legacy) wird verwendet

Bau ich UIPEthernet ein:

In file included from /home/aa/Arduino/libraries/arduino_uip-master/UIPEthernet.h:30:0,
                 from /home/aa/Arduino/libraries/arduino-mssql-master/sqlard.h:13,
                 from /home/aa/Arduino/sketch_jun21b/sketch_jun21b.ino:2:
/home/aa/Arduino/libraries/arduino_uip-master/Dhcp.h:139:7: error: redefinition of 'class DhcpClass'
 class DhcpClass {

       ^
In file included from /home/aa/Arduino/sketch_jun21b/sketch_jun21b.ino:1:0:
/home/aa/arduino/libraries/Ethernet/src/Ethernet.h:272:7: error: previous definition of 'class DhcpClass'
 class DhcpClass {
       ^
Bibliothek Ethernet in Version 2.0.0 im Ordner: /home/aa/arduino/libraries/Ethernet  wird verwendet
Bibliothek arduino-mssql-master im Ordner: /home/aa/Arduino/libraries/arduino-mssql-master (legacy) wird verwendet
Bibliothek arduino_uip-master in Version 1.04 im Ordner: /home/aa/Arduino/libraries/arduino_uip-master  wird verwendet
Bibliothek SPI in Version 1.0 im Ordner: /home/aa/arduino/hardware/arduino/avr/libraries/SPI  wird verwendet

(unter arduino/libraries liegen die mitgelieferten Libs unter Arduino/libraries alle extern via .zip eingebundenen, weil Sketchordner)

sqlard frisch geladen und arduino_uip-master von GitHub - ntruchsess/arduino_uip: UIPEthernet: A plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. Build around Adam Dunkels uIP Stack. Further developed version can be found on https://github.com/UIPEthernet/UIPEthernet
Von letzterer gibt es auch einen Fork. Der Versuch geht nochmehr schief.
GitHub - UIPEthernet/UIPEthernet: UIPEthernet library for Arduino IDE,Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32, Nordic nRF51, Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API.

Ich brauch die Konfig, die funktioniert...

Ich werde mich gleich nochmal an den PC setzen und poste meine komplette Config und Dateien.

Dies ist der aktuelle Sketch:

//MSSQL_Connector

#include <UIPEthernet.h>
#include "sqlard.h"

uint8_t Ethernet_MacAddr[6] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; /* MAC ADRESİ */


static byte Static_IPAddr[] =   { 192, 168, 100, 170 };
static byte Dns_IPAddr[] =      { 192, 168, 100, 10 };
static byte Gateway_IPAddr[] =  { 192, 168, 100, 254 };
static byte Subnet_Mask[] =     { 255, 255, 255, 0 };

static byte Server_IPAddr[] =   { 192, 168, 100, 31 };

EthernetClient client; // Create a client

SQLard MSSQL(Server_IPAddr, 1433, &client); // Create the connection with the Server Data Base


void setup()
{
  Serial.begin(115200);
  Serial.println("Start");

  while (!Serial);
  Ethernet.begin(Ethernet_MacAddr, Static_IPAddr, Dns_IPAddr, Gateway_IPAddr, Subnet_Mask); // Establish the connection of the client with the server
  //Ethernet.begin(Ethernet_MacAddr, Static_IPAddr);

  Serial.println("Am Server anmelden");
    
  if (MSSQL.connect()) // Check if the connection with the Data Base is correct
  {
    Serial.println("Anmeldung ok");
    
    MSSQL.setCredentials(L"arduino", L"ard_login", L"ard_password", L"hostx"); // Login to the Data Base
    MSSQL.login(); // Now we are able to send queries
  }
  else
  {
    Serial.print("Anmeldefehler");
  }
}

Und das im Ordner "Librarries\arduino-mssql-master"

sqlard.jpg

Edit:

Brauchst du noch mehr ?
Wichtig ist, alles andere aus dem Lib-Ordner löschen, nur das was im Bild ist drin lassen.

sqlard.jpg

HotSystems:
Brauchst du noch mehr ?

Das weiss ich noch nicht.

Danke für den Hinweis, das die .cpp da rausgelöscht werden muss.
Die Meldungen werden weniger :wink:

Dein Code für MEGA2560 kompiliert:

/tmp/ccHZM7Ww.ltrans4.ltrans.o: In function `main':
<artificial>:(.text.startup+0x416): undefined reference to `loop'
collect2: error: ld returned 1 exit status

selber Sketch für Uno:

/tmp/ccTK1OJE.ltrans4.ltrans.o: In function `main':
/home/aa/arduino/hardware/arduino/avr/cores/arduino/main.cpp:46: undefined reference to `loop'
collect2: error: ld returned 1 exit status

Ich werd erstmal mal sehen, was auf einer späteren IDE-Version rauskommt.

my_xy_projekt:
Ich werd erstmal mal sehen, was auf einer späteren IDE-Version rauskommt.

Oh…mist.

Ich habe die leere loop vergessen mit zu kopieren.

void loop () {
  
}

Nur falls du grad keine zur Hand hast. :wink:

HotSystems:
Oh....mist.

Ich habe die leere loop vergessen mit zu kopieren.

void loop () {

}




Nur falls du grad keine zur Hand hast. ;)

Nein habe ich nicht. :wink:
Ist geschuldet den unübersichtlichen 7".

Wenn ich zurück, sehe ich zu was sich bauen lässt - ich bin optimistisch!

Moin,
erledigt.

Es hängt an UIPethernet.
Wird die Bibliothek benutzt, geht keinerlei Kommunikation auf dem Netzwerk los.
Selbst ein Ethernet.begin(mac) - was ja den DHCP ansprechen soll, führt zu keinerlei Reaktion.
Ändert man das, ists ok.

Compiliert auf einem Uno:

Bibliothek arduino-mssql-master im Ordner: /home/aa/Arduino/libraries/arduino-mssql-master (legacy) wird verwendet
Bibliothek Ethernet in Version 2.0.0 im Ordner: /home/aa/arduino/libraries/Ethernet  wird verwendet
Bibliothek SPI in Version 1.0 im Ordner: /home/aa/arduino/hardware/arduino/avr/libraries/SPI  wird verwendet
Der Sketch verwendet 15526 Bytes (48%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 932 Bytes (45%) des dynamischen Speichers, 1116 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Ausgabe vom SerMon:

16:58:55.663 -> Start
16:58:56.228 -> Am Server anmelden
16:58:57.424 -> Anmeldung ok
16:58:57.424 -> l7Free ram: 1004
16:58:57.424 -> MSSQL-Login
16:58:57.424 -> fsFree ram: 488
16:58:57.424 -> fbFree ram: 550
16:58:57.424 -> Lege Tabelle an
16:58:57.458 -> Insert ausgeführt - 10 sekunden für Konsolenabfrage
16:59:07.444 -> Done

Ich hab noch ein paar Bilder rangehangen, da siehst Du, was in den Kommunikationsdaten steht.

Da Du mit dem Server anscheinend öfter arbeitest, schau Dir mal die Response an.
Was stimmt an meinen Paketen nicht?

/*
   Dieser Sketch entstand in https://forum.arduino.cc/index.php?topic=691532.0
   Beispiel für connect, create, insert, drop in einer Microsoft-SQL-DB
   Basis ist sqlard.h https://github.com/mustafakemalgilor/arduino-mssql
   mit folgenden Änderungen und Hinweisen:
   - sqlard.h allein ohne weitere Dateien in den lib-Ordner installieren
     Bei der Installation wird eine sqlard-test.cpp mitkopiert -> löschen!

   - UIPETHERNET war nicht dazu zu bewegen
     weder in Version 1.04 (https://github.com/ntruchsess/arduino_uip)
     noch V 2.0.8 (https://github.com/UIPEthernet/UIPEthernet)

   - Standardmässig wird UIPEthernet verwendet. Dies wird unterbunden durch editieren
     der sqlard.h und auskommentieren in Zeile 3 von #define UIPETHERNET
     Somit wird automatisch die Ethernet.h eingebunden.

     Konfiguration:
     MSSQL-Server in der Version EXPRESS(x64) (14.0.3294.2) installiert auf einem Ubuntu 18.04.04
     Es wurden keine Veränderungen an der Auslieferungskonfiguration vorgenommen, auch
     keine zusätzlichen Benutzer angelegt.
     Der Arduino ist im selben IP-Netz wie der Server. Beide haben feste IP-Adressen.

     Angelegt wurde eine Datenbank 'Arduino'
*/

#include "sqlard.h"  // https://github.com/mustafakemalgilor/arduino-mssql

uint8_t Ethernet_MacAddr[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x07 };

static byte Static_IPAddr[] =   { 192, 168, 0, 1 };        // eigene IP-Adresse

/*
  static byte Dns_IPAddr[] =      { 192, 168, 0, 1 };
  static byte Gateway_IPAddr[] =  { 192, 168, 0, 1 };
  static byte Subnet_Mask[] =     { 255, 255, 255, 0 };
*/

static byte Server_IPAddr[] =   { 192, 168, 0, 2 };        // IP-Adresse des MS-SQL-Server

EthernetClient client;
SQLard MSSQL(Server_IPAddr, 1433, &client);                // Create the connection with the Server Data Base

void setup()
  {
  delay(50);                                               // Kleinen Moment warten
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Start");
  Ethernet.begin(Ethernet_MacAddr, Static_IPAddr);
  //Ethernet.begin(Ethernet_MacAddr, Static_IPAddr, Dns_IPAddr, Gateway_IPAddr, Subnet_Mask); // Establish the connection of the client with the server
  Serial.println("Am Server anmelden");
  if (MSSQL.connect())                                     // Check if the connection with the Data Base is correct
    {
    Serial.println("Anmeldung ok");
    
    // Übergeben wird die Datenbank, der Anmeldename, das PW, und ein "Sender"Name
    MSSQL.setCredentials(L"Arduino", L"SA", L"passwd", L"Max"); // For login to the Data Base
    Serial.println("MSSQL-Login");
    MSSQL.login();                                         // Now we are able to send queries
    /*
        Hinweis: Mit dem Login werden auf dem Seriellen Monitor 3 Ausgaben gemacht
        Diese sind in der sqlard.h in class SQLardUtil hinterlegt und können dort
        ggfls. auskommentiert werden
    */
    
    // Anlegen einer Tabelle mit einer Spalte
    Serial.println("Lege Tabelle an");
    MSSQL.executeNonQuery(L"CREATE TABLE dbo.TestA (Spalte1 int) ");
    
    // Eintragen eines Wertes in die Tabelle
    MSSQL.executeNonQuery(L"INSERT INTO dbo.TestA (Spalte1) VALUES(5)");
    Serial.println("Insert ausgeführt - 10 sekunden für Konsolenabfrage");
    delay(10000); // Wartezeit für Abfrage auf der Konsole
    
    // Und wieder löschen
    MSSQL.executeNonQuery(L"DROP TABLE dbo.TestA");
    Serial.println("Done");
    }
  else
    {
    Serial.print("Anmeldefehler");
    }
  }

void loop() {}

Wireshark Mitschnitt:
00 _ wireshark Protokoll.jpg

Sendet Anmeldedaten:

Antwort Anmeldung:

Tabelle anlegen:
03 _ Create Table.png

Response - falsches Format?

00 _ wireshark Protokoll.jpg

03 _ Create Table.png