GSM Shield ile verileri veritabanına yazıp/yazmadığını anlamak için Arduino ve Sunucuyu konuşturma
  • Merhalar, belli aralıklarla sensör verilerini alıp mysql veritabanına yazan bir projem var.
    Hazırladıgım php sayfasını Http Client Request yaparak verileri yazdırıyorum. Fakat sunucu-şebeke sorunu nedeniyle bazen veriler veritabanına yazdırmıyor. Bu nedenden dolayı Arduino ile Sunucuyu konuşturmam gerek. Bu konuda kodlama konusunda yardımınızı bekliyorum.
    Not: Arduino GSM Kütüphanesini kullanıyorum. AT Komutlarıyla bunu yapabilen babayiğit aranıyor. Ücretli Destek de olabilir.
    Not2: GPRS bağlantısı nedeniyle 8snden uzun sürebilen bu döngü için WatchDogTimer nasıl kurabilirim. Kod üzerinde örnek verirseniz minnettar olurum :)

    Örnek kod:

    void setup() {
    Serial.begin(9600);
    Serial.println("Sistem Baslıyoor..");
    }

    void loop() {
    suankizaman = millis();
    if(suankizaman - oncekizaman >= 60000) //1 dakikada bir sayac degiskeni artacak
    {
    oncekizaman = suankizaman;
    sayac++;
    }
    if(sayac == 30) //30 dakika
    {
    sayac = 0;
    GSMBAGLAN();
    String path;
    path= "";
    path += "/php/add_data.php?id=0";
    path += "&sicaklik=";
    path += getTemp();

    Serial.println("Sunucuya baglaniyoor...");
    if (client.connect(server, port)) {
    Serial.println("baglandi");
    // Make a HTTP request:
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    char c = client.read();
    Serial.print(c);
    client.println("Connection: close");
    client.println();
    } else {
    // if you didn't get a connection to the server:
    Serial.println("Baglantı yapilamadi!");
    }

    gsmAccess.shutdown();
    Serial.println("GSM Kapatildi");
    }
    }


  • GSM ve sunucu taraflı modülleri kullanmadım ama şu sayac = 0; dediğiniz kod

    if (client.connect(server, port)) {
    sayac = 0;
    ////
    ////
    ///
    } else {
    // if you didn't get a connection to the server:
    Serial.println("Baglantı yapilamadi!");
    sayac = 30;
    }

    olsa sunucuya bağlanana kadar denemeye devam etmez mi?
    sunucu-şebeke sorunu nedeniyle yine de client.connect(server, port) şartına giriyorsa olmaz tabi de sadece böyle düşündüm
  • Olay şu ki Sunucuya bağlansada bağlanmasa da if (client.connect) { a giriyor. Serial porttan izliyorum veriyi yazmıyor ama "Baglanti yapilamadi" da demiyor. @gumulcine
  • Anladim o zaman bağlantı kurup veritabanından son kaydı çekip kaydetmek istediğinizle karşılaştırmanız ve eşit değilse ona göre tekrar göndermeniz gerek daha önce arduinoyu sunucu taraflı kullanmadığımı belirtmiştim ancak başka uygulamalarda sunucu ile iletişim kuran uygulamalarım oldu android uygulamaları gibi, başımdan geçen bir olayı belirteyim ki denemelerinizde buna dikkat edersiniz sonradan başınız ağrımasın.

    Cross-Origin Resource Sharing(CORS)
    CORS, kendi domaininiz haricinde dışardan gelen istekleri yöneten bir mekanizma.
    sunucularda cross-domain AJAX request’ler, kötüye kullanılabileceği için, birçok sunucuda engellenmiştir.

    Bu da benim android uygulamadan GET ile veri almak istediğimde bir türlü alamadığım bir serüvene dönüştü aynı sunucu içinde çalışan kodlar dışarıdan çağrılınca bir türlü veri döndürmüyordu. sonra tabi CORS ile tanıştım

    php sayfanın başına header("Access-Control-Allow-Origin: *"); ekleyinceye kadar
    eğer localhost değil de gerçek sunucuda deniyorsanız ve sunucu tarafında bu engel varsa arduino istekte bulununca da aynı durum olacaktır aklınızda bulunsun.

  • Değerli yorumunuz için teşekkürler, bu Arduino-Sunucu konuşturmasını yapan kodlama konusunda bir örneğe ihtiyacım var sadece. client.read yapıp sunucudan gelen html kaynak kodları okuyor ama bi türlü if döngüsüne girmiyor. Sunucuya bağlanmasa da bağlandı gibi davranıyor, işin içinden çıkamadım :)
  • Tekrar merhaba
    Sunucuya bağlansada bağlanmasa da if (client.connect) { a giriyor. dediniz
    char c = client.read();
    Serial.print(c); // bu gerçek bir bağlantı değilse burası muhtemelen boş veri döndürür
    php sayfanızda kayıt tamamlanınca echo ile sayfaya kaydedildi gibi bir ifade yazdırın

    ayrıca client.read() karakter karakter okuma yaptığı için döngü içinde olması gerekecek
    while (client.available()) {
    char c = client.read();
    Serial.print(c);
    }
    önce bu şekilde tüm karakterleri okutmayı deneyin derim

    buraya da bir bakın fikir edinebilirsiniz http://forum.arduinoturkiye.com/index.php?p=/discussion/6710/client.read-okuma/p1
  • Teşekkür ediyorum bir kademe atladım gibi. url sorguyu yaptığında veri databaseye yazıldıysa "yazildi" cıktısını veriyor, client.read içerisiniden substring yaparak "yazildi" cıktısını değişkene bağlamam gerek, fakat:

    String content = "";
    while(client.available()!=0)
    {
    content = content + String(char (client.read()));
    Serial.println(content);
    }

    yaptığımda Serial porta html cıktısını şu şekilde döküyor, sıkıntı yok:

    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    Content-Length: 10
    Date: Wed, 25 Apr 2018 17:33:57 GMT
    Accept-Ranges: bytes
    Server: LiteSpeed
    Connection: close

    yazildi

    Ama örneğin:

    Serial.println(content.substring(1));


    yaptığmda ise gelen hiç bi veri yok :(

    "yazildi" değerini nasıl çekebilirim?
  • indexOf ile yapabilirsiniz "yazildi" değerinin kaçıncı karakterde başladığını bulur bulamazsa -1 gibi bir deger döndürür yanliş hatırlamıyorsam

    Serial.println(content.indexOf("yazildi"));

    Düzeltme: bunu while dongüsü içinde değil döngüden sonra yani tamamlandığında kullanın
  • Yok aga, ne yazarsam yazayım indexOf da değeri -1 olarak döndürüyor, read komutuyla gelen veriler content değişkenine baglanmamis, olsa zaten substringle işi çözerdik, sıkıntı nerede günlerdir işin içinden cıkamadım.
  • String content = "";
    while(client.available()!=0)
    {
    content = content + String(char (client.read()));
    Serial.println(content);
    }
    yerine
    String content = "";
    while(client.available()!=0)
    {
    content = content + String(char (client.read()));
    }
    Serial.println(content);
    yapınca sonucu ne oluyor eğer bu şekilde veri alamıyorsanız o zaman content değişkenine veri saklanmıyor demektir

    birde şöyle deneyin

    String content = "";
    while(client.available()!=0)
    {
    char c = client.read();
    content += c;
    }

    Serial.println(content.indexOf("yazildi"));

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook

Tagged

Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.