Aduino - MSSQL

kumandan11

Üye
Katılım
4 Ağu 2013
Mesajlar
13
Puanları
1
Soru : Arduino Mega ve Ethernet Shield kullanıyorum. Arduino ve MS SQL arasında veri göndermek ve MS SQL'den veri okumak istiyorum. Bunu Xampp + php kullanarak yapabiliyorum. Fakat ekstra bir program kullanmandan yapabilir miyim diye araştırdım.
Böyle bir library buldum. Bununla veri gönderebiliyorum. Fakat veri alma ve okuma işlemini tam çözemedim. Yardım edecek yol gösterecek var mı ?

Veri gönderme örnek kod :
void Sending_To_database() //CONNECTING WITH MSSQL { Serial.println("Login to the server"); if (MSSQL.connect()) // Check if the connection with the Data Base is correct { Serial.println("Registration ok"); // The database, the login name, the PW, and a "Sender" name are passed MSSQL.setCredentials(L"deneme", L"sa", L"1234", L"Mustafa"); // For login to the Data Base Serial.println("MSSQL-Login"); MSSQL.login(); // Now we are able to send queries String tarihs = calcDateTime(); String saats = calcDateTime1(); char newName [102]; sprintf(newName, "INSERT INTO dbo.TestB (Tarih,Saat,Nem,Sicaklik) VALUES('%s','%s','%d.%02d','%d.%02d')", tarihs.c_str(), saats.c_str(), int(nem), int(round(nem * 100)) % 100, int(temp), int(round(temp * 100)) % 100); wchar_t fileName[102]; int i; for (i = 0; i < 102; i++) { fileName[i] = newName[i]; } for (i = 0 ; i < 102 ; i++) Serial.write(fileName[i]); Serial.println(""); MSSQL.executeNonQuery(fileName); // Databese'e queryi gönder. Serial.println("Done"); } else { Serial.print("Login error"); } }
 

FakirMaker

Usta Üye
Katılım
5 May 2009
Mesajlar
983
Puanları
181
Veritabanlarına doğrudan bağlanabilmek için hosting firmasının uzaktan veritabanı erişimini desteklemesi gerekir. Eğer doğrudan bir web hosting paketi aldıysan ve localhost gibi bir sunucuya bağlanıyorsan uzaktan erişim yok demektir. Eğer varsa şunu söyleyebilirim mssql yerine mysql kullanmanı tavsiye ederim. Gönderdiğin kitaplık en son 4 sene önce güncellenmiş ve neredeyse hiç bir dökümanatasyon yapılmamış. Arduino için mysql kitaplıkları mevcut ve halihazırda kullanılıyor, çok sayıda örnek bulabilirsin.
 
Konu Sah

kumandan11

Üye
Katılım
4 Ağu 2013
Mesajlar
13
Puanları
1
Veritabanlarına doğrudan bağlanabilmek için hosting firmasının uzaktan veritabanı erişimini desteklemesi gerekir. Eğer doğrudan bir web hosting paketi aldıysan ve localhost gibi bir sunucuya bağlanıyorsan uzaktan erişim yok demektir. Eğer varsa şunu söyleyebilirim mssql yerine mysql kullanmanı tavsiye ederim. Gönderdiğin kitaplık en son 4 sene önce güncellenmiş ve neredeyse hiç bir dökümanatasyon yapılmamış. Arduino için mysql kitaplıkları mevcut ve halihazırda kullanılıyor, çok sayıda örnek bulabilirsin.
Cevabın için teşekkür ederim.
Bende MSSQL kullanmak istemem. Ama kullanmak zorundayım. Aslında sqlard.h dosyasında #define UIPETHERNET'in 3. satırını yorum yaptıktan ve kütüphanedeki sqlard-test.cpp dosyasını sildikten sonra kütüphane ethernet shield ile çalıştı. Arduino ile compile yapabildim ve Veri gönderebildim. Fakat sqlard-test.cpp 'de okuma için bir örnek tarzı bir kod yazılmış fakat bunu compile edemedim. Benim yaptığım gibi küçük bir kaç değişiklikle çalıştırma imkanı var mı ? Burda sqlard-test.cpp 'nin içinde MSSQL.executeReader diye bir komut var fakat nasıl yapacağımı çözemedim. Buradaki komut verileri nereye gönderiyor client ' e mı ?
Xamp + php de olduğu gibi query gönderdikten sonra qlient.read() diyip gelen veriyi okuyabilyordum.
 

alarmko

Katılımcı Üye
Katılım
14 Ocak 2009
Mesajlar
849
Puanları
56
Yaş
57
Veritabanlarına doğrudan bağlanabilmek için hosting firmasının uzaktan veritabanı erişimini desteklemesi gerekir. Eğer doğrudan bir web hosting paketi aldıysan ve localhost gibi bir sunucuya bağlanıyorsan uzaktan erişim yok demektir. Eğer varsa şunu söyleyebilirim mssql yerine mysql kullanmanı tavsiye ederim. Gönderdiğin kitaplık en son 4 sene önce güncellenmiş ve neredeyse hiç bir dökümanatasyon yapılmamış. Arduino için mysql kitaplıkları mevcut ve halihazırda kullanılıyor, çok sayıda örnek bulabilirsin.
Ben kendi web sayfamdaki sql veritabanına php de yazılmıs bir arayüz programı üzerinden veri alıp,yazabiliyorum.Bu sayede herhangibir kısıtlama ile karşılaşmadan vertabanı baglantısı saglayabiliyorum.
Yani microişlemcim aslında direk olarak veritabanına baglı degil, php de yazılmış arayüz programı vasıtası ile data gönderip alıyor.
Php programıda aynı serverda kurulu oldugundan herhangibir sınırlama olmuyor.
 

FakirMaker

Usta Üye
Katılım
5 May 2009
Mesajlar
983
Puanları
181
MSSQL.executeReader diye bir komut var fakat nasıl yapacağımı çözemedim. Buradaki komut verileri nereye gönderiyor client ' e mı ?

C++:
SQLardTableResult *  executeReader(const wchar_t* query)

Hayır SQLardTableResult sınfına ait bir nesnenin pointeranı alıyor. Yani okuduğu veriyi bir nesnede topluyor. Verileri o sınıfın içindeki fonksiyonlarla çekmek gerekiyor. Bunun için kitaplığı baştan sona incelemek gerekiyor yani bunu kimse senin için yapmaz. Bu konuda yalnızsın diyebilirim.
 
Konu Sah

kumandan11

Üye
Katılım
4 Ağu 2013
Mesajlar
13
Puanları
1
C++:
SQLardTableResult *  executeReader(const wchar_t* query)

Hayır SQLardTableResult sınfına ait bir nesnenin pointeranı alıyor. Yani okuduğu veriyi bir nesnede topluyor. Verileri o sınıfın içindeki fonksiyonlarla çekmek gerekiyor. Bunun için kitaplığı baştan sona incelemek gerekiyor yani bunu kimse senin için yapmaz. Bu konuda yalnızsın diyebilirim.
sqlard-test.cpp'deki wprintf yerine ne kullanabilirim. Arduino desteklemiyor sanırım. Serial ekranda veri gelip gelmediğini kontrol etmek için ?
Kod:
wprintf(L"%s|", tr->m_arColumnData[i]->m_wcstrColumnName);
 
Konu Sah

kumandan11

Üye
Katılım
4 Ağu 2013
Mesajlar
13
Puanları
1
Library de küçük değişiklikler yaparak Arduino Ethernet Shield ve ESP8266 ile Microsoft SQL 'den veri gönderme ve veri okuma işlemleri yapıldı. MS SQL - Arduino haberleşme yapmak isteyenler için kodu buraya bıraktım.


C++:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "sqlard.h"
#include <ArduinoJson.h>

//ağ bilgilerinizi girin
#ifndef STASSID
#define STASSID "yedek"
#define STAPSK  "1234*"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;
int d = 0;
int kk_flag = 0;
char c;


unsigned long asyncDelay = 0; // Maksimum alabileceği rakam : 4,294,967,295
int delayLength = 10000;


uint8_t Ethernet_MacAddr[6] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 }; /* MAC ADRESİ */
static byte Server_IPAddr[] =   { 192, 168, 2, 22 };       // IP-Adres  MS-SQL-Server
static byte Static_IPAddr[] = { 192, 168, 2, 195 };
static byte Gateway_IPAddr[] = { 192, 168, 2, 1 };
static byte Subnet_Mask[] = { 255, 255, 255, 0 };
WiFiClient client;

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

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  while (!Serial);
  StartWiFi(ssid, password);

}

void loop() {

  recvWithStartEndMarkers();

  if (millis() > asyncDelay + delayLength) {
    if (asyncDelay > (4294967295 - delayLength)) {
      asyncDelay = (4294967295 - asyncDelay) + (delayLength - (4294967295 - asyncDelay));
    } else {
      asyncDelay += delayLength;
    }
    Sending_To_database();
  }
  delay(2000);
}

void Sending_To_database()   //CONNECTING WITH MS SQL
{
  Serial.println("Login to the server");
  if (MSSQL.connect()) // Check if the connection with the Data Base is correct
  {
    Serial.println("Registration ok");

    // The database, the login name, the PW, and a "Sender" name are passed
    MSSQL.setCredentials(L"deneme", L"sa", L"1234", L"Mustafa"); // For login to the Data Base
    Serial.println("MSSQL-Login");
    MSSQL.login();  // Now we are able to send querie
   
//    String tarihs = "09.06.22";
//    String saats = "14.42";
//    float nem = 70.22;
//    float temp = 28.50;


    char newName [102];
 // sprintf(newName, "INSERT INTO dbo.TestB (Tarih,Saat,Nem,Sicaklik) VALUES('%s','%s','%d.%02d','%d.%02d')", tarihs.c_str(), saats.c_str(), int(nem), int(round(nem * 100)) % 100, int(temp), int(round(temp * 100)) % 100);
    sprintf(newName, "SELECT TOP 10 * FROM TestB ORDER BY ID DESC FOR JSON AUTO");
    wchar_t fileName[102];
    int i;
    for (i = 0; i < 102; i++)
    {
      fileName[i] = newName[i];
    }
    for (i = 0 ; i < 102 ; i++)
      Serial.write(fileName[i]);
    Serial.println("");

    MSSQL.executeNonQuery(fileName);  // Databese'e queryi gönder.
    Serial.println("Done");
    if (!client) {
      Serial.println("disconnecting.");
      client.stop();
    }

  }
  else
  {
    Serial.println("Login error");
  }
}

////////////// WiFi, Time and Date Functions /////////////////
int StartWiFi(const char* ssid, const char* password) {
  int connAttempts = 0;
  Serial.print(F("\r\nBağlanıyor: ")); Serial.println(String(ssid));
  WiFi.mode(WIFI_AP_STA);
  WiFi.config(Static_IPAddr, Gateway_IPAddr, Subnet_Mask, Gateway_IPAddr);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED ) {
    Serial.print(".");
    if (connAttempts > 20) {
      Serial.println("\nWi-Fi ağına bağlanılamadı");
      return 0;
    }
    connAttempts++;
  }

  WiFi.macAddress(Ethernet_MacAddr);
  Serial.print("MAC: ");
  Serial.print(Ethernet_MacAddr[5], HEX);
  Serial.print(":");
  Serial.print(Ethernet_MacAddr[4], HEX);
  Serial.print(":");
  Serial.print(Ethernet_MacAddr[3], HEX);
  Serial.print(":");
  Serial.print(Ethernet_MacAddr[2], HEX);
  Serial.print(":");
  Serial.print(Ethernet_MacAddr[1], HEX);
  Serial.print(":");
  Serial.println(Ethernet_MacAddr[0], HEX);
  Serial.println("");
  Serial.print(F("WiFi Bağlandı: "));
  Serial.println(WiFi.localIP());
  return 1;
}


void recvWithStartEndMarkers() { // Databaseden gelen verileri  ayrıştırma işlemi yapılır.
  String data_from_display = "";

  while (client.available() > 0) {
    c = client.read();
    //    Serial.print(c);
    if ( c == '[') {
      kk_flag = 1;
    }

    if (kk_flag == 1) {
      data_from_display += c;
    }

    if ( c == ']') {
      kk_flag = 0;
    }

  }
  Serial.println(data_from_display);
  Serial.println(utf8ascii(data_from_display));

  String input = data_from_display;

  DynamicJsonDocument doc(1536);

  DeserializationError error = deserializeJson(doc, utf8ascii(data_from_display));

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  for (JsonObject item : doc.as<JsonArray>()) {

    int ID1 = item["ID"]; // 29, 28, 27, 26, 25, 24, 23, 22, 21, 20
    const char* Tarih1 = item["Tarih"]; // "09.06.22", "09.06.22", "09.06.22", "09.06.22", "09.06.22", ...
    const char* Saat1 = item["Saat"]; // "14.42", "14.42", "14.42", "14.42", "14.42", "14.42", "14.42", ...
    const char* Nem1 = item["Nem"]; // "70.22", "70.22", "70.22", "70.22", "70.22", "70.22", "70.22", ...
    const char* Sicaklik1 = item["Sicaklik"]; // "28.50", "28.50", "28.50", "28.50", "28.50", "28.50", ...
   
    Serial.println("ID: " + String(ID1));
    Serial.println("Tarih: " + String(Tarih1));
    Serial.println("Saat: " + String(Saat1));
    Serial.println("Nem: " + String(Nem1));
    Serial.println("Sıcaklık: " + String(Sicaklik1));

  }


  Serial.println(input.length());

}

// ****** UTF8-Decoder: convert UTF8-string to extended ASCII *******
static byte c1;  // Last character buffer

// Convert a single Character from UTF8 to Extended ASCII
// Return "0" if a byte has to be ignored
byte utf8ascii(byte ascii) {
  if ( ascii < 128 ) // Standard ASCII-set 0..0x7F handling
  { c1 = 0;
    return ( ascii );
  }

  // get previous input
  byte last = c1;   // get last char
  c1 = ascii;       // remember actual character

  switch (last)     // conversion depending on first UTF8-character
  { case 0xC2: return  (ascii);  break;
    case 0xC3: return  (ascii | 0xC0);  break;
    case 0x82: if (ascii == 0xAC) return (0x80);   // special case Euro-symbol
  }

  return  (0);                                     // otherwise: return zero, if character has to be ignored
}

// convert String object from UTF8 String to Extended ASCII
String utf8ascii(String s)
{
  String r = "";
  char c;
  for (int i = 0; i < s.length(); i++)
  {
    c = utf8ascii(s.charAt(i));
    if (c != 0) r += c;
  }
  return r;
}

// In Place conversion UTF8-string to Extended ASCII (ASCII is shorter!)
void utf8ascii(char* s)
{
  int k = 0;
  char c;
  for (int i = 0; i < strlen(s); i++)
  {
    c = utf8ascii(s[i]);
    if (c != 0)
      s[k++] = c;
  }
  s[k] = 0;
}

Serial Output :
Kod:
Login to the server
Registration ok
MSSQL-Login
SELECT TOP 10 * FROM TestB ORDER BY ID DESC FOR JSON AUTO
Done
[{"ID":29,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":28,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":27,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":26,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":25,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":24,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":23,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":22,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":21,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"},{"ID":20,"Tarih":"09.06.22","Saat":"14.42","Nem":"70.22","Sicaklik":"28.50"}]
ID: 29
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 28
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 27
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 26
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 25
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 24
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 23
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 22
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 21
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
ID: 20
Tarih: 09.06.22
Saat: 14.42
Nem: 70.22
Sıcaklık: 28.50
 

Yeni mesajlar

Forum istatistikleri

Konular
121,235
Mesajlar
853,612
Kullanıcılar
436,622
Son üye
Yiğitylmz

Yeni konular

Üst